162 lines
6.4 KiB
C#
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
|
|
}
|
|
|
|
} |