HumanoidControl_Free/Editor/Tools/Script_Editor.cs
Pascal Serrarens 17741d862a First commit
2022-01-12 10:50:57 +01:00

162 lines
6.4 KiB
C#

using System.Collections.Generic;
using System.Reflection;
using UnityEditor;
using UnityEngine;
namespace Passer {
[CustomEditor(typeof(Script))]
public class Script_Editor : Editor {
public void OnEnable() {
SerializedProperty conditionsProp = serializedObject.FindProperty("conditions");
if (conditionsProp.arraySize > 0) // 1 = just empty condition
showConditions = true;
}
public void OnDestroy() {
CleanupStuff();
}
protected bool showConditions = false;
public override void OnInspectorGUI() {
serializedObject.Update();
CheckEmptyConditionSlot();
CheckEmptyFunctionCallSlot();
Script script = (Script)target;
if (Application.isPlaying) {
if (GUILayout.Button("Run Script")) {
FunctionCall functionCall = new FunctionCall(script.gameObject, "Script/" + script.scriptName);
functionCall.Execute();
}
}
else {
if (script.enabled)
EditorGUILayout.HelpBox(
"This script will run automatically at scene start.\n" +
"Disable component to prevent this.",
MessageType.Info);
}
SerializedProperty scriptNameProp = serializedObject.FindProperty("scriptName");
scriptNameProp.stringValue = EditorGUILayout.TextField("Name", scriptNameProp.stringValue);
showConditions = EditorGUILayout.Foldout(showConditions, "Conditions", true);
if (showConditions) {
EditorGUI.indentLevel += 2;
ConditionsInspector();
EditorGUI.indentLevel--;
EditorGUILayout.Space();
}
ScriptInspector();
serializedObject.ApplyModifiedProperties();
}
#region Conditions
protected int selectedCondition = -1;
protected void CheckEmptyConditionSlot() {
SerializedProperty conditionsProp = serializedObject.FindProperty("conditions");
int conditionsCount = conditionsProp.arraySize;
if (conditionsCount == 0)
Condition_Editor.AppendNewCondition(conditionsProp);
else {
SerializedProperty lastFunctionCallProp = conditionsProp.GetArrayElementAtIndex(conditionsCount - 1);
SerializedProperty lastFunctionCallTargetProp = lastFunctionCallProp.FindPropertyRelative("targetGameObject");
if (lastFunctionCallTargetProp.objectReferenceValue != null) {
Condition_Editor.AppendNewCondition(conditionsProp);
}
}
}
protected virtual void ConditionsInspector() {
SerializedProperty conditionsProp = serializedObject.FindProperty("conditions");
int conditionsCount = conditionsProp.arraySize;
for (int i = 0; i < conditionsCount; i++) {
EditorGUILayout.BeginHorizontal();
GUILayout.Space(20);
SerializedProperty conditionProp = conditionsProp.GetArrayElementAtIndex(i);
if (selectedCondition == i) {
Condition_Editor.ConditionInspector(conditionProp);
}
else {
string label = Condition_Editor.GetConditionLabel(conditionProp);
if (GUILayout.Button(label))
selectedCondition = i;
}
GUILayout.Space(20);
EditorGUILayout.EndHorizontal();
}
}
#endregion
#region Function Calls
protected virtual void CheckEmptyFunctionCallSlot() {
SerializedProperty functionCallsProp = serializedObject.FindProperty("functionCalls");
int functionCallCount = functionCallsProp.arraySize;
if (functionCallCount == 0)
FunctionCall_Editor.AppendNewFunctionCall(functionCallsProp);
else {
SerializedProperty lastFunctionCallProp = functionCallsProp.GetArrayElementAtIndex(functionCallCount - 1);
SerializedProperty lastFunctionCallTargetProp = lastFunctionCallProp.FindPropertyRelative("targetGameObject");
if (lastFunctionCallTargetProp.objectReferenceValue != null) {
FunctionCall_Editor.AppendNewFunctionCall(functionCallsProp);
}
}
}
protected int selectedFunctionCallIx = -1;
protected virtual void ScriptInspector() {
SerializedProperty functionCallsProp = serializedObject.FindProperty("functionCalls");
int functionCallCount = functionCallsProp.arraySize;
//if (functionCallCount == 0)
// FunctionCall_Editor.AppendNewFunctionCall(functionCallsProp);
//else {
// SerializedProperty lastFunctionCallProp = functionCallsProp.GetArrayElementAtIndex(functionCallCount - 1);
// SerializedProperty lastFunctionCallTargetProp = lastFunctionCallProp.FindPropertyRelative("target");
// if (lastFunctionCallTargetProp.objectReferenceValue != null) {
// FunctionCall_Editor.AppendNewFunctionCall(functionCallsProp);
// return;
// }
//}
for (int i = 0; i < functionCallCount; i++) {
SerializedProperty functionCallProp = functionCallsProp.GetArrayElementAtIndex(i);
if (selectedFunctionCallIx == i) {
FunctionCall_Editor.FunctionCallInspector(functionCallProp);
}
else {
string label = FunctionCall_Editor.GetFunctionCallLabel(functionCallProp);
if (GUILayout.Button(label))
selectedFunctionCallIx = i;
}
}
EditorGUILayout.Space();
}
#endregion
#region Cleanup
protected virtual void CleanupStuff() {
Script script = (Script)target;
script.conditions.RemoveAll(condition => condition.targetGameObject == null);
//script.functionCalls.RemoveAll(functionCall => functionCall.target == null);
script.functionCalls.RemoveAll(functionCall => functionCall.targetGameObject == null);
}
#endregion
}
}