rabidus-test/Assets/Dreamteck/Splines/Editor/Components/SplinePositionerEditor.cs

113 lines
4.7 KiB
C#
Raw Permalink Normal View History

2023-07-24 16:38:13 +03:00
namespace Dreamteck.Splines.Editor
{
using UnityEngine;
using System.Collections;
using UnityEditor;
[CustomEditor(typeof(SplinePositioner), true)]
[CanEditMultipleObjects]
public class SplinePositionerEditor : SplineTracerEditor
{
protected override void BodyGUI()
{
EditorGUILayout.Space();
EditorGUILayout.LabelField("Positioning", EditorStyles.boldLabel);
serializedObject.Update();
SerializedProperty mode = serializedObject.FindProperty("_mode");
SerializedProperty position = serializedObject.FindProperty("_position");
SerializedProperty followTarget = serializedObject.FindProperty("_followTarget");
SerializedProperty followLoop = serializedObject.FindProperty("_followLoop");
SerializedProperty followTargetDistance = serializedObject.FindProperty("_followTargetDistance");
SerializedProperty followTargetDirection = serializedObject.FindProperty("_followTargetDirection");
EditorGUI.BeginChangeCheck();
SplinePositioner positioner = (SplinePositioner)target;
if(followTarget.objectReferenceValue == null)
{
EditorGUILayout.PropertyField(mode, new GUIContent("Mode"));
if (positioner.mode == SplinePositioner.Mode.Distance)
{
float lastPos = position.floatValue;
EditorGUILayout.PropertyField(position, new GUIContent("Distance"));
if (lastPos != position.floatValue)
{
positioner.position = position.floatValue;
}
}
else
{
SerializedProperty percent = serializedObject.FindProperty("_result").FindPropertyRelative("percent");
EditorGUILayout.BeginHorizontal();
float pos = position.floatValue;
pos = EditorGUILayout.Slider("Percent", (float)pos, 0f, 1f);
if(pos != position.floatValue)
{
position.floatValue = pos;
serializedObject.ApplyModifiedProperties();
positioner.Rebuild();
}
if (GUILayout.Button("Set Distance", GUILayout.Width(85)))
{
DistanceWindow w = EditorWindow.GetWindow<DistanceWindow>(true);
w.Init(OnSetDistance, positioner.CalculateLength());
}
EditorGUILayout.EndHorizontal();
}
}
EditorGUILayout.PropertyField(followTarget);
if(followTarget.objectReferenceValue != null)
{
EditorGUILayout.PropertyField(followTargetDistance);
EditorGUILayout.PropertyField(followTargetDirection);
EditorGUILayout.PropertyField(followLoop);
}
EditorGUILayout.Space();
SerializedProperty targetObject = serializedObject.FindProperty("_targetObject");
EditorGUILayout.PropertyField(targetObject, new GUIContent("Target Object", "Which object to apply the transformations to."));
if (EditorGUI.EndChangeCheck())
{
positioner.followTarget = followTarget.objectReferenceValue as SplineTracer;
positioner.followTargetDistance = followTargetDistance.floatValue;
positioner.followTargetDirection = (Spline.Direction)followTargetDirection.intValue;
positioner.followLoop = followLoop.boolValue;
serializedObject.ApplyModifiedProperties();
}
base.BodyGUI();
}
void OnSetDistance(float distance)
{
int longest = 0;
float max = 0f;
for (int i = 0; i < users.Length; i++)
{
float length = users[i].CalculateLength();
if (length > max)
{
max = length;
longest = i;
}
}
SerializedProperty position = serializedObject.FindProperty("_position");
SplinePositioner positioner = (SplinePositioner)targets[longest];
double travel = positioner.Travel(0.0, distance, Spline.Direction.Forward);
position.floatValue = (float)travel;
serializedObject.ApplyModifiedProperties();
for (int i = 0; i < targets.Length; i++)
{
positioner = (SplinePositioner)targets[0];
positioner.position = travel;
}
}
}
}