Files
FueraDeEscala/Assets/Game Kit Controller/Scripts/Editor/headTrackEditor.cs
Robii Aragon fd87a6ffd5 add ckg
plantilla base para movimiento básico
2026-02-05 05:07:55 -08:00

498 lines
20 KiB
C#

using UnityEngine;
using System.Collections;
using System.Xml.Linq;
#if UNITY_EDITOR
using UnityEditor;
[CustomEditor (typeof (headTrack))]
public class headTrackEditor : Editor
{
SerializedProperty headTrackEnabled;
SerializedProperty updateIKEnabled;
SerializedProperty head;
SerializedProperty headWeight;
SerializedProperty bodyWeight;
SerializedProperty rotationSpeed;
SerializedProperty weightChangeSpeed;
SerializedProperty useTimeToChangeTarget;
SerializedProperty timeToChangeTarget;
SerializedProperty obstacleLayer;
SerializedProperty useHeadTrackTarget;
SerializedProperty headTrackTargeTransform;
SerializedProperty lookInCameraDirection;
SerializedProperty cameraTargetToLook;
SerializedProperty customHeadTrackToLookInfoList;
SerializedProperty cameraHeadWeight;
SerializedProperty cameraBodyWeight;
SerializedProperty cameraRangeAngleX;
SerializedProperty cameraRangeAngleY;
SerializedProperty lookInOppositeDirectionExtraRange;
SerializedProperty lookInOppositeDirectionOutOfRange;
SerializedProperty oppositeCameraTargetToLook;
SerializedProperty oppositeCameraTargetToLookParent;
SerializedProperty oppositeCameraParentRotationSpeed;
SerializedProperty lookBehindIfMoving;
SerializedProperty lookBehindRotationSpeed;
SerializedProperty useDeadZone;
SerializedProperty deadZoneLookBehind;
SerializedProperty maxDistanceToHeadToLookAtCameraTarget;
SerializedProperty useHeadRangeRotation;
SerializedProperty useTargetsToIgnoreList;
SerializedProperty targetsToIgnoreList;
SerializedProperty playerCanLookState;
SerializedProperty useSmoothHeadTrackDisable;
SerializedProperty currentHeadWeight;
SerializedProperty currentBodyWeight;
SerializedProperty positionToLookFound;
SerializedProperty lookTargetList;
SerializedProperty animator;
SerializedProperty playerControllerManager;
SerializedProperty playerCameraManager;
SerializedProperty IKManager;
SerializedProperty showGizmo;
SerializedProperty gizmoRadius;
SerializedProperty arcGizmoRadius;
headTrack manager;
Vector2 rangeAngleX;
Vector2 rangeAngleY;
Vector3 headPosition;
GUIStyle buttonStyle = new GUIStyle ();
void OnEnable ()
{
headTrackEnabled = serializedObject.FindProperty ("headTrackEnabled");
updateIKEnabled = serializedObject.FindProperty ("updateIKEnabled");
head = serializedObject.FindProperty ("head");
headWeight = serializedObject.FindProperty ("headWeight");
bodyWeight = serializedObject.FindProperty ("bodyWeight");
rotationSpeed = serializedObject.FindProperty ("rotationSpeed");
weightChangeSpeed = serializedObject.FindProperty ("weightChangeSpeed");
useTimeToChangeTarget = serializedObject.FindProperty ("useTimeToChangeTarget");
timeToChangeTarget = serializedObject.FindProperty ("timeToChangeTarget");
obstacleLayer = serializedObject.FindProperty ("obstacleLayer");
useHeadTrackTarget = serializedObject.FindProperty ("useHeadTrackTarget");
headTrackTargeTransform = serializedObject.FindProperty ("headTrackTargeTransform");
lookInCameraDirection = serializedObject.FindProperty ("lookInCameraDirection");
cameraTargetToLook = serializedObject.FindProperty ("cameraTargetToLook");
customHeadTrackToLookInfoList = serializedObject.FindProperty ("customHeadTrackToLookInfoList");
cameraHeadWeight = serializedObject.FindProperty ("cameraHeadWeight");
cameraBodyWeight = serializedObject.FindProperty ("cameraBodyWeight");
cameraRangeAngleX = serializedObject.FindProperty ("cameraRangeAngleX");
cameraRangeAngleY = serializedObject.FindProperty ("cameraRangeAngleY");
lookInOppositeDirectionExtraRange = serializedObject.FindProperty ("lookInOppositeDirectionExtraRange");
lookInOppositeDirectionOutOfRange = serializedObject.FindProperty ("lookInOppositeDirectionOutOfRange");
oppositeCameraTargetToLook = serializedObject.FindProperty ("oppositeCameraTargetToLook");
oppositeCameraTargetToLookParent = serializedObject.FindProperty ("oppositeCameraTargetToLookParent");
oppositeCameraParentRotationSpeed = serializedObject.FindProperty ("oppositeCameraParentRotationSpeed");
lookBehindIfMoving = serializedObject.FindProperty ("lookBehindIfMoving");
lookBehindRotationSpeed = serializedObject.FindProperty ("lookBehindRotationSpeed");
useDeadZone = serializedObject.FindProperty ("useDeadZone");
deadZoneLookBehind = serializedObject.FindProperty ("deadZoneLookBehind");
maxDistanceToHeadToLookAtCameraTarget = serializedObject.FindProperty ("maxDistanceToHeadToLookAtCameraTarget");
useHeadRangeRotation = serializedObject.FindProperty ("useHeadRangeRotation");
useTargetsToIgnoreList = serializedObject.FindProperty ("useTargetsToIgnoreList");
targetsToIgnoreList = serializedObject.FindProperty ("targetsToIgnoreList");
playerCanLookState = serializedObject.FindProperty ("playerCanLookState");
useSmoothHeadTrackDisable = serializedObject.FindProperty ("useSmoothHeadTrackDisable");
currentHeadWeight = serializedObject.FindProperty ("currentHeadWeight");
currentBodyWeight = serializedObject.FindProperty ("currentBodyWeight");
positionToLookFound = serializedObject.FindProperty ("positionToLookFound");
lookTargetList = serializedObject.FindProperty ("lookTargetList");
animator = serializedObject.FindProperty ("animator");
playerControllerManager = serializedObject.FindProperty ("playerControllerManager");
playerCameraManager = serializedObject.FindProperty ("playerCameraManager");
IKManager = serializedObject.FindProperty ("IKManager");
showGizmo = serializedObject.FindProperty ("showGizmo");
gizmoRadius = serializedObject.FindProperty ("gizmoRadius");
arcGizmoRadius = serializedObject.FindProperty ("arcGizmoRadius");
manager = (headTrack)target;
}
void OnSceneGUI ()
{
if (manager.showGizmo && manager.useHeadRangeRotation) {
Handles.color = Color.white;
rangeAngleX = manager.rangeAngleX;
rangeAngleY = manager.rangeAngleY;
headPosition = manager.head.position;
Handles.DrawWireArc (headPosition, -manager.transform.up, manager.transform.forward, -rangeAngleY.x, manager.arcGizmoRadius);
Handles.DrawWireArc (headPosition, manager.transform.up, manager.transform.forward, rangeAngleY.y, manager.arcGizmoRadius);
Handles.color = Color.red;
Handles.DrawWireArc (headPosition, manager.transform.up, -manager.transform.forward, (180 - Mathf.Abs (rangeAngleY.x)), manager.arcGizmoRadius);
Handles.DrawWireArc (headPosition, -manager.transform.up, -manager.transform.forward, (180 - Mathf.Abs (rangeAngleY.y)), manager.arcGizmoRadius);
Handles.color = Color.white;
Handles.DrawWireArc (headPosition, -manager.transform.right, manager.transform.forward, -rangeAngleX.x, manager.arcGizmoRadius);
Handles.DrawWireArc (headPosition, manager.transform.right, manager.transform.forward, rangeAngleX.y, manager.arcGizmoRadius);
Handles.color = Color.red;
Handles.DrawWireArc (headPosition, manager.transform.right, -manager.transform.forward, (180 - Mathf.Abs (rangeAngleX.x)), manager.arcGizmoRadius);
Handles.DrawWireArc (headPosition, -manager.transform.right, -manager.transform.forward, (180 - Mathf.Abs (rangeAngleX.y)), manager.arcGizmoRadius);
string text = "Head Range\n"
+ "Y: " + (Mathf.Abs (rangeAngleX.x) + rangeAngleX.y)
+ "\n" + "X: " + (Mathf.Abs (rangeAngleY.x) + rangeAngleY.y);
Handles.color = Color.red;
Handles.Label (headPosition + manager.transform.up, text);
}
}
public override void OnInspectorGUI ()
{
EditorGUILayout.Space ();
buttonStyle = new GUIStyle (GUI.skin.button);
buttonStyle.fontStyle = FontStyle.Bold;
buttonStyle.fontSize = 12;
GUILayout.BeginVertical ("Main Settings", "window");
EditorGUILayout.PropertyField (headTrackEnabled);
EditorGUILayout.PropertyField (updateIKEnabled);
if (headTrackEnabled.boolValue) {
EditorGUILayout.PropertyField (head);
EditorGUILayout.PropertyField (headWeight);
EditorGUILayout.PropertyField (bodyWeight);
EditorGUILayout.PropertyField (rotationSpeed);
EditorGUILayout.PropertyField (weightChangeSpeed);
EditorGUILayout.PropertyField (useTimeToChangeTarget);
if (useTimeToChangeTarget.boolValue) {
EditorGUILayout.PropertyField (timeToChangeTarget);
}
EditorGUILayout.PropertyField (obstacleLayer);
EditorGUILayout.PropertyField (useHeadTrackTarget);
if (useHeadTrackTarget.boolValue) {
EditorGUILayout.PropertyField (headTrackTargeTransform);
}
EditorGUILayout.Space ();
if (!head.objectReferenceValue) {
if (GUILayout.Button ("Assign head")) {
manager.searchHead ();
}
}
}
GUILayout.EndVertical ();
EditorGUILayout.Space ();
GUILayout.BeginVertical ("Look Camera Direction Settings", "window");
EditorGUILayout.PropertyField (lookInCameraDirection);
if (lookInCameraDirection.boolValue) {
EditorGUILayout.PropertyField (cameraTargetToLook);
EditorGUILayout.PropertyField (cameraHeadWeight);
EditorGUILayout.PropertyField (cameraBodyWeight);
EditorGUILayout.PropertyField (cameraRangeAngleX);
EditorGUILayout.PropertyField (cameraRangeAngleY);
EditorGUILayout.Space ();
EditorGUILayout.Space ();
EditorGUILayout.PropertyField (lookInOppositeDirectionOutOfRange);
if (lookInOppositeDirectionOutOfRange.boolValue) {
EditorGUILayout.PropertyField (lookInOppositeDirectionExtraRange);
EditorGUILayout.PropertyField (oppositeCameraTargetToLook);
EditorGUILayout.PropertyField (oppositeCameraTargetToLookParent);
EditorGUILayout.PropertyField (oppositeCameraParentRotationSpeed);
EditorGUILayout.PropertyField (lookBehindIfMoving);
if (lookBehindIfMoving.boolValue) {
EditorGUILayout.PropertyField (lookBehindRotationSpeed);
}
EditorGUILayout.PropertyField (useDeadZone);
if (useDeadZone.boolValue) {
EditorGUILayout.PropertyField (deadZoneLookBehind);
}
EditorGUILayout.PropertyField (maxDistanceToHeadToLookAtCameraTarget);
}
EditorGUILayout.Space ();
GUILayout.BeginVertical ("Custom Head Track To Look Info List", "window");
showCustomHeadTrackToLookInfoList (customHeadTrackToLookInfoList);
GUILayout.EndVertical ();
}
GUILayout.EndVertical ();
if (headTrackEnabled.boolValue) {
EditorGUILayout.Space ();
GUILayout.BeginVertical ("Range Settings", "window");
EditorGUILayout.PropertyField (useHeadRangeRotation);
if (useHeadRangeRotation.boolValue) {
GUILayout.Label (new GUIContent ("Vertical Range"), EditorStyles.boldLabel);
GUILayout.BeginHorizontal ();
manager.rangeAngleX.x = EditorGUILayout.FloatField (manager.rangeAngleX.x, GUILayout.MaxWidth (50));
EditorGUILayout.MinMaxSlider (ref manager.rangeAngleX.x, ref manager.rangeAngleX.y, -180, 180);
manager.rangeAngleX.y = EditorGUILayout.FloatField (manager.rangeAngleX.y, GUILayout.MaxWidth (50));
GUILayout.EndHorizontal ();
EditorGUILayout.Space ();
GUILayout.Label (new GUIContent ("Horizontal Range"), EditorStyles.boldLabel);
GUILayout.BeginHorizontal ();
manager.rangeAngleY.x = EditorGUILayout.FloatField (manager.rangeAngleY.x, GUILayout.MaxWidth (50));
EditorGUILayout.MinMaxSlider (ref manager.rangeAngleY.x, ref manager.rangeAngleY.y, -180, 180);
manager.rangeAngleY.y = EditorGUILayout.FloatField (manager.rangeAngleY.y, GUILayout.MaxWidth (50));
GUILayout.EndHorizontal ();
}
GUILayout.EndVertical ();
EditorGUILayout.Space ();
GUILayout.BeginVertical ("Targets To Ignore Settings", "window", GUILayout.Height (30));
EditorGUILayout.PropertyField (useTargetsToIgnoreList);
if (useTargetsToIgnoreList.boolValue) {
EditorGUILayout.Space ();
GUILayout.BeginVertical ("Targets To Ignore List", "window");
showSimpleList (targetsToIgnoreList);
GUILayout.EndVertical ();
}
GUILayout.EndVertical ();
EditorGUILayout.Space ();
GUILayout.BeginVertical ("Head Track State", "window");
GUILayout.Label ("Can Look State\t" + playerCanLookState.boolValue);
GUILayout.Label ("Smooth Disable\t" + useSmoothHeadTrackDisable.boolValue);
GUILayout.Label ("Head Weight\t" + currentHeadWeight.floatValue);
GUILayout.Label ("Body Weight\t" + currentBodyWeight.floatValue);
GUILayout.Label ("Look At Position\t" + positionToLookFound.boolValue);
EditorGUILayout.Space ();
GUILayout.BeginVertical ("Targets To Look List", "window");
showSimpleList (lookTargetList);
GUILayout.EndVertical ();
GUILayout.EndVertical ();
EditorGUILayout.Space ();
GUILayout.BeginVertical ("Player Element", "window");
EditorGUILayout.PropertyField (animator);
EditorGUILayout.PropertyField (playerControllerManager);
EditorGUILayout.PropertyField (playerCameraManager);
EditorGUILayout.PropertyField (IKManager);
GUILayout.EndVertical ();
EditorGUILayout.Space ();
GUILayout.BeginVertical ("Gizmo Settings", "window");
EditorGUILayout.PropertyField (showGizmo);
if (showGizmo.boolValue) {
EditorGUILayout.PropertyField (gizmoRadius);
EditorGUILayout.PropertyField (arcGizmoRadius);
}
GUILayout.EndVertical ();
EditorGUILayout.Space ();
}
if (GUI.changed) {
serializedObject.ApplyModifiedProperties ();
EditorUtility.SetDirty (target);
}
}
void showSimpleList (SerializedProperty list)
{
EditorGUILayout.Space ();
if (GUILayout.Button ("Show/Hide " + list.displayName, buttonStyle)) {
list.isExpanded = !list.isExpanded;
}
EditorGUILayout.Space ();
if (list.isExpanded) {
GUILayout.BeginVertical ("box");
EditorGUILayout.Space ();
GUILayout.Label ("Amount: \t" + list.arraySize);
EditorGUILayout.Space ();
GUILayout.BeginHorizontal ();
if (GUILayout.Button ("Add")) {
list.arraySize++;
}
if (GUILayout.Button ("Clear")) {
list.arraySize = 0;
}
GUILayout.EndHorizontal ();
EditorGUILayout.Space ();
for (int i = 0; i < list.arraySize; i++) {
GUILayout.BeginHorizontal ();
if (i < list.arraySize && i >= 0) {
EditorGUILayout.PropertyField (list.GetArrayElementAtIndex (i), new GUIContent ("", null, ""), false);
}
GUILayout.BeginHorizontal ();
if (GUILayout.Button ("x")) {
list.DeleteArrayElementAtIndex (i);
}
if (GUILayout.Button ("v")) {
if (i >= 0) {
list.MoveArrayElement (i, i + 1);
}
}
if (GUILayout.Button ("^")) {
if (i < list.arraySize) {
list.MoveArrayElement (i, i - 1);
}
}
GUILayout.EndHorizontal ();
GUILayout.EndHorizontal ();
EditorGUILayout.Space ();
}
GUILayout.EndVertical ();
}
}
void showCustomHeadTrackToLookInfoList (SerializedProperty list)
{
GUILayout.BeginVertical ();
EditorGUILayout.Space ();
if (GUILayout.Button ("Show/Hide " + list.displayName, buttonStyle)) {
list.isExpanded = !list.isExpanded;
}
EditorGUILayout.Space ();
if (list.isExpanded) {
EditorGUILayout.Space ();
GUILayout.Label ("Number of Elements: " + list.arraySize);
EditorGUILayout.Space ();
GUILayout.BeginHorizontal ();
if (GUILayout.Button ("Add")) {
list.arraySize++;
}
if (GUILayout.Button ("Clear")) {
list.arraySize = 0;
}
GUILayout.EndHorizontal ();
EditorGUILayout.Space ();
GUILayout.BeginHorizontal ();
if (GUILayout.Button ("Expand All")) {
for (int i = 0; i < list.arraySize; i++) {
list.GetArrayElementAtIndex (i).isExpanded = true;
}
}
if (GUILayout.Button ("Collapse All")) {
for (int i = 0; i < list.arraySize; i++) {
list.GetArrayElementAtIndex (i).isExpanded = false;
}
}
GUILayout.EndHorizontal ();
EditorGUILayout.Space ();
for (int i = 0; i < list.arraySize; i++) {
bool expanded = false;
GUILayout.BeginHorizontal ();
GUILayout.BeginHorizontal ("box");
EditorGUILayout.Space ();
if (i < list.arraySize && i >= 0) {
EditorGUILayout.BeginVertical ();
EditorGUILayout.PropertyField (list.GetArrayElementAtIndex (i), false);
if (list.GetArrayElementAtIndex (i).isExpanded) {
showCustomHeadTrackToLookInfoListElement (list.GetArrayElementAtIndex (i), i);
expanded = true;
}
EditorGUILayout.Space ();
GUILayout.EndVertical ();
}
EditorGUILayout.Space ();
GUILayout.EndHorizontal ();
if (expanded) {
GUILayout.BeginVertical ();
} else {
GUILayout.BeginHorizontal ();
}
if (GUILayout.Button ("x")) {
list.DeleteArrayElementAtIndex (i);
}
if (GUILayout.Button ("v")) {
if (i >= 0) {
list.MoveArrayElement (i, i + 1);
}
}
if (GUILayout.Button ("^")) {
if (i < list.arraySize) {
list.MoveArrayElement (i, i - 1);
}
}
if (expanded) {
GUILayout.EndVertical ();
} else {
GUILayout.EndHorizontal ();
}
GUILayout.EndHorizontal ();
}
}
GUILayout.EndVertical ();
}
void showCustomHeadTrackToLookInfoListElement (SerializedProperty list, int actionInfoIndex)
{
GUILayout.BeginVertical ();
EditorGUILayout.Space ();
GUILayout.BeginVertical ("Main Settings", "window");
EditorGUILayout.PropertyField (list.FindPropertyRelative ("Name"));
EditorGUILayout.PropertyField (list.FindPropertyRelative ("headTrackToLookTransform"));
EditorGUILayout.PropertyField (list.FindPropertyRelative ("adjustDirectionToPreviousHeadTrackToLook"));
GUILayout.EndVertical ();
GUILayout.EndVertical ();
}
}
#endif