BITFALL/Assets/Plugins/Character Controller Pro/Demo/Scripts/Materials/MaterialsPropertiesEditor.cs

220 lines
7.0 KiB
C#
Raw Normal View History

2023-10-04 16:50:27 +08:00
using UnityEngine;
using Lightbug.Utilities;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditorInternal;
namespace Lightbug.CharacterControllerPro.Demo
{
[CustomEditor(typeof(MaterialsProperties))]
public class MaterialsPropertiesEditor : Editor
{
ReorderableList surfacesList = null;
ReorderableList volumesList = null;
SerializedProperty defaultSurface = null;
SerializedProperty surfaceAccelerationMultiplier = null;
SerializedProperty surfaceDecelerationMultiplier = null;
SerializedProperty surfaceSpeedMultiplier = null;
SerializedProperty defaultVolume = null;
SerializedProperty volumeAccelerationMultiplier = null;
SerializedProperty volumeDecelerationMultiplier = null;
SerializedProperty volumeSpeedMultiplier = null;
SerializedProperty volumeGravityPositiveMultiplier = null;
SerializedProperty volumeGravityNegativeMultiplier = null;
SerializedProperty surfaces = null;
SerializedProperty volumes = null;
void OnEnable()
{
defaultSurface = serializedObject.FindProperty("defaultSurface");
surfaceAccelerationMultiplier = defaultSurface.FindPropertyRelative("accelerationMultiplier");
surfaceDecelerationMultiplier = defaultSurface.FindPropertyRelative("decelerationMultiplier");
surfaceSpeedMultiplier = defaultSurface.FindPropertyRelative("speedMultiplier");
defaultVolume = serializedObject.FindProperty("defaultVolume");
volumeAccelerationMultiplier = defaultVolume.FindPropertyRelative("accelerationMultiplier");
volumeDecelerationMultiplier = defaultVolume.FindPropertyRelative("decelerationMultiplier");
volumeSpeedMultiplier = defaultVolume.FindPropertyRelative("speedMultiplier");
volumeGravityPositiveMultiplier = defaultVolume.FindPropertyRelative("gravityPositiveMultiplier");
volumeGravityNegativeMultiplier = defaultVolume.FindPropertyRelative("gravityNegativeMultiplier");
surfaces = serializedObject.FindProperty("surfaces");
volumes = serializedObject.FindProperty("volumes");
surfacesList = new ReorderableList(
serializedObject, surfaces,
true,
false,
true,
true
);
volumesList = new ReorderableList(
serializedObject, volumes,
true,
false,
true,
true
);
volumes.isExpanded = true;
volumesList.elementHeight = 10 * EditorGUIUtility.singleLineHeight;
volumesList.headerHeight = 0f;
surfaces.isExpanded = true;
surfacesList.elementHeight = 8 * EditorGUIUtility.singleLineHeight;
surfacesList.headerHeight = 0f;
volumesList.drawElementCallback += OnDrawElementVolumes;
surfacesList.drawElementCallback += OnDrawElementSurfaces;
}
void OnDisable()
{
volumesList.drawElementCallback -= OnDrawElementVolumes;
surfacesList.drawElementCallback -= OnDrawElementSurfaces;
}
void OnDrawElementVolumes(Rect rect, int index, bool isActive, bool isFocused)
{
Rect fieldRect = rect;
fieldRect.height = EditorGUIUtility.singleLineHeight;
SerializedProperty item = volumes.GetArrayElementAtIndex(index);
item.isExpanded = true;
SerializedProperty itr = item.Copy();
EditorGUI.LabelField(fieldRect, itr.FindPropertyRelative("tagName").stringValue);
itr.Next(true);
fieldRect.y += 1.5f * fieldRect.height;
//bool enterChildren = true;
EditorGUI.PropertyField(fieldRect, itr, false);
int children = item.CountInProperty() - 1;
for (int i = 0; i < children; i++)
{
EditorGUI.PropertyField(fieldRect, itr, false);
itr.Next(false);
fieldRect.y += fieldRect.height;
}
}
void OnDrawElementSurfaces(Rect rect, int index, bool isActive, bool isFocused)
{
Rect fieldRect = rect;
fieldRect.height = EditorGUIUtility.singleLineHeight;
SerializedProperty item = surfaces.GetArrayElementAtIndex(index);
item.isExpanded = true;
SerializedProperty itr = item.Copy();
EditorGUI.LabelField(fieldRect, itr.FindPropertyRelative("tagName").stringValue);
itr.Next(true);
fieldRect.y += 1.5f * fieldRect.height;
//bool enterChildren = true;
EditorGUI.PropertyField(fieldRect, itr, false);
int children = item.CountInProperty() - 1;
for (int i = 0; i < children; i++)
{
EditorGUI.PropertyField(fieldRect, itr, false);
itr.Next(false);
fieldRect.y += fieldRect.height;
}
}
public override void OnInspectorGUI()
{
serializedObject.Update();
CustomUtilities.DrawScriptableObjectField<MaterialsProperties>((MaterialsProperties)target);
CustomUtilities.DrawEditorLayoutHorizontalLine(Color.gray, 8);
EditorGUILayout.LabelField("Default material", EditorStyles.boldLabel);
EditorGUILayout.HelpBox("A default material parameter corresponds to any ground or spatial volume without a specific \"material tag\". " +
"A Surface affects grounded movement, while a Volume affects not grounded movement.", MessageType.Info);
GUILayout.Space(10);
CustomUtilities.DrawEditorLayoutHorizontalLine(Color.gray);
EditorGUILayout.LabelField("Default surface", EditorStyles.boldLabel);
CustomUtilities.DrawArrayElement(defaultSurface, null, true);
CustomUtilities.DrawEditorLayoutHorizontalLine(Color.gray);
EditorGUILayout.LabelField("Default volume", EditorStyles.boldLabel);
CustomUtilities.DrawArrayElement(defaultVolume, null, true);
// --------------------------------------------------------------------------------------------------------
GUILayout.Space(10);
CustomUtilities.DrawEditorLayoutHorizontalLine(Color.gray);
EditorGUILayout.LabelField("Tagged materials", EditorStyles.boldLabel);
GUILayout.Space(10);
CustomUtilities.DrawEditorLayoutHorizontalLine(Color.gray, 8);
EditorGUILayout.LabelField("Surfaces", EditorStyles.boldLabel);
CustomUtilities.DrawArray(surfaces, "tagName");
CustomUtilities.DrawEditorLayoutHorizontalLine(Color.gray, 8);
EditorGUILayout.LabelField("Volumes", EditorStyles.boldLabel);
CustomUtilities.DrawArray(volumes, "tagName");
serializedObject.ApplyModifiedProperties();
}
}
}
#endif