You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
4.0 KiB
176 lines
4.0 KiB
using UnityEditor; |
|
using UnityEditorInternal; |
|
using UnityEngine; |
|
using System.Collections; |
|
using System.Collections.Generic; |
|
|
|
namespace Fungus.Script |
|
{ |
|
|
|
[CustomEditor (typeof(FungusCommand), true)] |
|
public class FungusCommandEditor : Editor |
|
{ |
|
public static FungusCommand selectedCommand; |
|
|
|
void OnEnable() |
|
{ |
|
FungusCommand t = target as FungusCommand; |
|
if (t != null) |
|
{ |
|
t.hideFlags = HideFlags.HideInInspector; |
|
} |
|
} |
|
|
|
public static CommandInfoAttribute GetCommandInfo(System.Type commandType) |
|
{ |
|
object[] attributes = commandType.GetCustomAttributes(typeof(CommandInfoAttribute), false); |
|
foreach (object obj in attributes) |
|
{ |
|
CommandInfoAttribute commandInfoAttr = obj as CommandInfoAttribute; |
|
if (commandInfoAttr != null) |
|
{ |
|
return commandInfoAttr; |
|
} |
|
} |
|
|
|
return null; |
|
} |
|
|
|
public virtual void DrawCommandInspectorGUI() |
|
{ |
|
FungusCommand t = target as FungusCommand; |
|
if (t == null) |
|
{ |
|
return; |
|
} |
|
|
|
FungusScript fungusScript = t.GetFungusScript(); |
|
|
|
GUILayout.BeginVertical(GUI.skin.box); |
|
|
|
GUILayout.BeginHorizontal(); |
|
|
|
CommandInfoAttribute commandInfoAttr = FungusCommandEditor.GetCommandInfo(t.GetType()); |
|
if (commandInfoAttr == null) |
|
{ |
|
GUILayout.EndHorizontal(); |
|
GUILayout.EndVertical(); |
|
return; |
|
} |
|
|
|
string commandName = commandInfoAttr.CommandName; |
|
GUIStyle commandStyle = new GUIStyle(GUI.skin.button); |
|
if (t.enabled) |
|
{ |
|
GUI.backgroundColor = commandInfoAttr.ButtonColor; |
|
} |
|
else |
|
{ |
|
GUI.backgroundColor = Color.grey; |
|
} |
|
GUILayout.Label(commandName, commandStyle, GUILayout.MinWidth(80), GUILayout.ExpandWidth(true)); |
|
GUI.backgroundColor = Color.white; |
|
|
|
bool enabled = GUILayout.Toggle(t.enabled, new GUIContent()); |
|
if (t.enabled != enabled) |
|
{ |
|
Undo.RecordObject(t, "Set Enabled"); |
|
t.enabled = enabled; |
|
} |
|
|
|
if (fungusScript != null) |
|
{ |
|
if (GUILayout.Button("Copy", EditorStyles.miniButton)) |
|
{ |
|
fungusScript.copyCommand = t; |
|
} |
|
|
|
if (fungusScript.copyCommand != null) |
|
{ |
|
if (GUILayout.Button("Paste", EditorStyles.miniButton)) |
|
{ |
|
Sequence parentSequence = t.GetComponent<Sequence>(); |
|
if (parentSequence != null) |
|
{ |
|
PasteCommand(fungusScript.copyCommand, parentSequence); |
|
} |
|
} |
|
} |
|
} |
|
|
|
GUILayout.EndHorizontal(); |
|
|
|
EditorGUILayout.Separator(); |
|
|
|
DrawCommandGUI(); |
|
|
|
EditorGUILayout.Separator(); |
|
|
|
if (t.errorMessage.Length > 0) |
|
{ |
|
GUIStyle style = new GUIStyle(GUI.skin.label); |
|
style.normal.textColor = new Color(1,0,0); |
|
EditorGUILayout.LabelField(new GUIContent("Error: " + t.errorMessage), style); |
|
} |
|
|
|
GUILayout.EndVertical(); |
|
} |
|
|
|
public virtual void DrawCommandGUI() |
|
{ |
|
DrawDefaultInspector(); |
|
} |
|
|
|
static public FungusCommand PasteCommand(FungusCommand copyCommand, Sequence sequence) |
|
{ |
|
System.Type type = copyCommand.GetType(); |
|
Component copy = Undo.AddComponent(sequence.gameObject, type); |
|
System.Reflection.FieldInfo[] fields = type.GetFields(); |
|
foreach (System.Reflection.FieldInfo field in fields) |
|
{ |
|
field.SetValue(copy, field.GetValue(copyCommand)); |
|
} |
|
|
|
FungusScript fungusScript = sequence.GetFungusScript(); |
|
|
|
Undo.RecordObject(fungusScript, "Paste Command"); |
|
|
|
FungusCommand newCommand = copy as FungusCommand; |
|
sequence.commandList.Add(newCommand); |
|
|
|
return newCommand; |
|
} |
|
|
|
static public T ObjectField<T>(GUIContent label, GUIContent nullLabel, T selectedObject, List<T> objectList) where T : MonoBehaviour |
|
{ |
|
List<GUIContent> objectNames = new List<GUIContent>(); |
|
|
|
int selectedIndex = 0; |
|
objectNames.Add(nullLabel); |
|
for (int i = 0; i < objectList.Count; ++i) |
|
{ |
|
objectNames.Add(new GUIContent(objectList[i].name)); |
|
|
|
if (selectedObject == objectList[i]) |
|
{ |
|
selectedIndex = i + 1; |
|
} |
|
} |
|
|
|
T result; |
|
|
|
selectedIndex = EditorGUILayout.Popup(label, selectedIndex, objectNames.ToArray()); |
|
if (selectedIndex == 0) |
|
{ |
|
result = null; // Null option |
|
} |
|
else |
|
{ |
|
result = objectList[selectedIndex - 1]; |
|
} |
|
|
|
return result; |
|
} |
|
} |
|
|
|
}
|
|
|