Files
BABA_YAGA/Assets/Opsive/UltimateCharacterController/Demo/Editor/DemoManagerInspector.cs
2026-06-14 23:57:44 +07:00

148 lines
6.9 KiB
C#

/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Editor.Inspectors.Demo
{
using Opsive.UltimateCharacterController.Demo;
using Opsive.UltimateCharacterController.Editor.Inspectors.Utility;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
/// <summary>
/// Shows a custom inspector for the DemoManager component.
/// </summary>
[CustomEditor(typeof(DemoManager), true)]
public class DemoManagerInspector : InspectorBase
{
private const string c_EditorPrefsSelectedDemoZoneIndexKey = "Opsive.UltimateCharacterController.Editor.Inspectors.Demo.SelectedDemoZoneIndex";
private string SelectedViewTypeIndexKey { get { return c_EditorPrefsSelectedDemoZoneIndexKey + "." + target.GetType() + "." + target.name; } }
private ReorderableList m_DemoZonesList;
/// <summary>
/// Draws the custom inspector.
/// </summary>
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
EditorGUI.BeginChangeCheck();
DrawCharacterField();
#if FIRST_PERSON_CONTROLLER && THIRD_PERSON_CONTROLLER
if (PropertyFromName("m_PerspectiveSelection").objectReferenceValue == null) {
EditorGUILayout.PropertyField(PropertyFromName("m_DefaultFirstPersonStart"));
}
#endif
if (Foldout("Free Roam")) {
EditorGUI.indentLevel++;
DrawFreeRoamFields();
EditorGUI.indentLevel--;
}
if (Foldout("UI")) {
EditorGUI.indentLevel++;
DrawUIFields();
EditorGUI.indentLevel--;
}
if (m_DemoZonesList == null) {
m_DemoZonesList = new ReorderableList(serializedObject, PropertyFromName("m_DemoZones"), true, true, true, true);
m_DemoZonesList.drawHeaderCallback = (Rect rect) =>
{
EditorGUI.LabelField(new Rect(rect.x, rect.y, rect.width - 12, EditorGUIUtility.singleLineHeight), "Demo Zones");
};
m_DemoZonesList.onSelectCallback += (ReorderableList list) =>
{
EditorPrefs.SetInt(SelectedViewTypeIndexKey, list.index);
};
if (EditorPrefs.GetInt(SelectedViewTypeIndexKey, -1) != -1) {
m_DemoZonesList.index = EditorPrefs.GetInt(SelectedViewTypeIndexKey, -1);
}
}
m_DemoZonesList.DoLayoutList();
DrawSelectedDemoZone();
if (EditorGUI.EndChangeCheck()) {
InspectorUtility.RecordUndoDirtyObject(target, "Change Value");
serializedObject.ApplyModifiedProperties();
}
}
/// <summary>
/// Draws the inspected character field.
/// </summary>
protected virtual void DrawCharacterField()
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PropertyField(PropertyFromName("m_Character"));
if (PropertyFromName("m_Character").objectReferenceValue == null) {
if (GUILayout.Button("Find", GUILayout.Width(50))) {
var characterLocomotion = FindObjectOfType<UltimateCharacterController.Character.UltimateCharacterLocomotion>();
if (characterLocomotion != null) {
PropertyFromName("m_Character").objectReferenceValue = characterLocomotion.gameObject;
}
}
} else {
if (GUILayout.Button("Clear", GUILayout.Width(50))) {
PropertyFromName("m_Character").objectReferenceValue = null;
}
}
EditorGUILayout.EndHorizontal();
}
/// <summary>
/// Draws the free roam fields.
/// </summary>
protected virtual void DrawFreeRoamFields()
{
EditorGUILayout.PropertyField(PropertyFromName("m_FreeRoam"));
EditorGUILayout.PropertyField(PropertyFromName("m_FreeRoamPickupItemDefinitions"));
EditorGUILayout.PropertyField(PropertyFromName("m_FreeRoamItemDefinitionAmounts"), true);
}
/// <summary>
/// Draws the UI fields.
/// </summary>
protected virtual void DrawUIFields()
{
EditorGUILayout.PropertyField(PropertyFromName("m_PerspectiveSelection"));
EditorGUILayout.PropertyField(PropertyFromName("m_TextPanel"));
EditorGUILayout.PropertyField(PropertyFromName("m_Header"));
EditorGUILayout.PropertyField(PropertyFromName("m_Description"));
EditorGUILayout.PropertyField(PropertyFromName("m_Action"));
EditorGUILayout.PropertyField(PropertyFromName("m_NextZoneArrow"));
EditorGUILayout.PropertyField(PropertyFromName("m_PreviousZoneArrow"));
EditorGUILayout.PropertyField(PropertyFromName("m_NoZoneTitle"));
EditorGUILayout.LabelField("No Zone Description");
PropertyFromName("m_NoZoneDescription").stringValue = InspectorUtility.DrawEditorWithoutSelectAll(() =>
EditorGUILayout.TextArea(PropertyFromName("m_NoZoneDescription").stringValue, InspectorStyles.WordWrapTextArea));
EditorGUILayout.PropertyField(PropertyFromName("m_AddOnDemoManager"));
}
/// <summary>
/// Draws the fields for the selected demo zone.
/// </summary>
private void DrawSelectedDemoZone()
{
var demoZonesProperty = PropertyFromName("m_DemoZones");
if (m_DemoZonesList.index == -1 || m_DemoZonesList.index >= demoZonesProperty.arraySize) {
return;
}
var demoZoneProperty = demoZonesProperty.GetArrayElementAtIndex(m_DemoZonesList.index);
EditorGUILayout.LabelField(demoZoneProperty.FindPropertyRelative("m_Header").stringValue + " Demo Zone", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(demoZoneProperty.FindPropertyRelative("m_Header"));
EditorGUILayout.PropertyField(demoZoneProperty.FindPropertyRelative("m_DemoZoneTrigger"));
EditorGUILayout.PropertyField(demoZoneProperty.FindPropertyRelative("m_EnableObjects"), true);
EditorGUILayout.PropertyField(demoZoneProperty.FindPropertyRelative("m_ToggleObjects"), true);
EditorGUILayout.LabelField("Description");
demoZoneProperty.FindPropertyRelative("m_Description").stringValue = InspectorUtility.DrawEditorWithoutSelectAll(() =>
EditorGUILayout.TextArea(demoZoneProperty.FindPropertyRelative("m_Description").stringValue, InspectorStyles.WordWrapTextArea));
EditorGUILayout.PropertyField(demoZoneProperty.FindPropertyRelative("m_Action"));
}
}
}