From dc1658b152db1bda8a516fbdc931b51f1a4d252e Mon Sep 17 00:00:00 2001 From: chrisgregan Date: Thu, 25 Sep 2014 17:01:42 +0100 Subject: [PATCH] FungusScript can now be made into a prefab (see notes!) All sequence and command components are now added to the main FungusScript object. This change enables you to make a prefab out of any FungusScript. FungusScript prefabs can now be edited using the Fungus Script window. You still need to instantiate a Fungus Script prefab in order to run it. --- Assets/Fungus/Dialog/Commands/AddOption.cs | 2 +- Assets/Fungus/FungusScript/Commands/Call.cs | 2 +- .../FungusScript/Editor/CommandListAdaptor.cs | 2 +- .../FungusScript/Editor/FungusScriptEditor.cs | 18 ++-- .../Editor/FungusScriptMenuItems.cs | 6 +- .../FungusScript/Editor/FungusScriptWindow.cs | 88 ++++++++++++------- .../FungusScript/Editor/SequenceEditor.cs | 16 ++-- .../FungusScript/Scripts/FungusScript.cs | 23 ++--- Assets/Fungus/FungusScript/Scripts/Node.cs | 1 - .../Fungus/FungusScript/Scripts/Sequence.cs | 25 +++++- 10 files changed, 112 insertions(+), 71 deletions(-) diff --git a/Assets/Fungus/Dialog/Commands/AddOption.cs b/Assets/Fungus/Dialog/Commands/AddOption.cs index 306f5c88..25543065 100644 --- a/Assets/Fungus/Dialog/Commands/AddOption.cs +++ b/Assets/Fungus/Dialog/Commands/AddOption.cs @@ -42,7 +42,7 @@ namespace Fungus } else { - summaryText += " (" + targetSequence.name + ")"; + summaryText += " (" + targetSequence.sequenceName + ")"; } return summaryText; diff --git a/Assets/Fungus/FungusScript/Commands/Call.cs b/Assets/Fungus/FungusScript/Commands/Call.cs index 0bbf6e5b..fd6295df 100644 --- a/Assets/Fungus/FungusScript/Commands/Call.cs +++ b/Assets/Fungus/FungusScript/Commands/Call.cs @@ -38,7 +38,7 @@ namespace Fungus return ""; } - return targetSequence.name; + return targetSequence.sequenceName; } public override Color GetButtonColor() diff --git a/Assets/Fungus/FungusScript/Editor/CommandListAdaptor.cs b/Assets/Fungus/FungusScript/Editor/CommandListAdaptor.cs index 740c611b..0163a24f 100644 --- a/Assets/Fungus/FungusScript/Editor/CommandListAdaptor.cs +++ b/Assets/Fungus/FungusScript/Editor/CommandListAdaptor.cs @@ -94,7 +94,7 @@ namespace Fungus return null; } - Command newCommand = sequence.gameObject.AddComponent() as Command; + Command newCommand = Undo.AddComponent(fungusScript.gameObject) as Command; fungusScript.selectedCommand = newCommand; return newCommand; diff --git a/Assets/Fungus/FungusScript/Editor/FungusScriptEditor.cs b/Assets/Fungus/FungusScript/Editor/FungusScriptEditor.cs index fdfef021..982f9ea4 100644 --- a/Assets/Fungus/FungusScript/Editor/FungusScriptEditor.cs +++ b/Assets/Fungus/FungusScript/Editor/FungusScriptEditor.cs @@ -27,28 +27,28 @@ namespace Fungus { serializedObject.Update(); - FungusScript t = target as FungusScript; + FungusScript fungusScript = target as FungusScript; - t.UpdateHideFlags(); + fungusScript.UpdateHideFlags(); if (Application.isPlaying) { - if (t.executingSequence == null) + if (fungusScript.executingSequence == null) { - t.selectedCommand = null; + fungusScript.selectedCommand = null; } else { - t.selectedCommand = t.executingSequence.activeCommand; + fungusScript.selectedCommand = fungusScript.executingSequence.activeCommand; } } SequenceEditor.SequenceField(startSequenceProp, new GUIContent("Start Sequence", "First sequence to execute when the Fungus Script executes"), new GUIContent(""), - t); + fungusScript); - if (t.startSequence == null) + if (fungusScript.startSequence == null) { GUIStyle style = new GUIStyle(GUI.skin.label); style.normal.textColor = new Color(1,0,0); @@ -72,9 +72,9 @@ namespace Fungus EditorGUILayout.Separator(); - if (t.selectedCommand != null) + if (fungusScript.selectedCommand != null) { - CommandEditor commandEditor = Editor.CreateEditor(t.selectedCommand) as CommandEditor; + CommandEditor commandEditor = Editor.CreateEditor(fungusScript.selectedCommand) as CommandEditor; commandEditor.DrawCommandInspectorGUI(); DestroyImmediate(commandEditor); } diff --git a/Assets/Fungus/FungusScript/Editor/FungusScriptMenuItems.cs b/Assets/Fungus/FungusScript/Editor/FungusScriptMenuItems.cs index 78cfced9..99bec8ea 100644 --- a/Assets/Fungus/FungusScript/Editor/FungusScriptMenuItems.cs +++ b/Assets/Fungus/FungusScript/Editor/FungusScriptMenuItems.cs @@ -13,11 +13,7 @@ namespace Fungus GameObject newFungusScriptGO = new GameObject(); newFungusScriptGO.name = "FungusScript"; FungusScript fungusScript = newFungusScriptGO.AddComponent(); - GameObject newSequenceGO = new GameObject(); - newSequenceGO.transform.parent = newFungusScriptGO.transform; - newSequenceGO.name = "Start"; - newSequenceGO.hideFlags = HideFlags.HideInHierarchy; - Sequence sequence = newSequenceGO.AddComponent(); + Sequence sequence = Undo.AddComponent(newFungusScriptGO); fungusScript.startSequence = sequence; fungusScript.selectedSequence = sequence; Undo.RegisterCreatedObjectUndo(newFungusScriptGO, "Create Fungus Script"); diff --git a/Assets/Fungus/FungusScript/Editor/FungusScriptWindow.cs b/Assets/Fungus/FungusScript/Editor/FungusScriptWindow.cs index 6da5f443..ce679e1a 100755 --- a/Assets/Fungus/FungusScript/Editor/FungusScriptWindow.cs +++ b/Assets/Fungus/FungusScript/Editor/FungusScriptWindow.cs @@ -66,12 +66,6 @@ namespace Fungus return; } - if (PrefabUtility.GetPrefabType(fungusScript) == PrefabType.Prefab) - { - GUILayout.Label("No Fungus Script scene object selected (selected object is a prefab)"); - return; - } - GUILayout.BeginHorizontal(); DrawScriptView(fungusScript); ResizeViews(fungusScript); @@ -83,7 +77,7 @@ namespace Fungus { EditorUtility.SetDirty(fungusScript); - Sequence[] sequences = fungusScript.GetComponentsInChildren(); + Sequence[] sequences = fungusScript.GetComponentsInChildren(true); Rect scrollViewRect = new Rect(); @@ -138,6 +132,9 @@ namespace Fungus { Sequence sequence = sequences[i]; + // Hack to support legacy design where sequences were child gameobjects (will be removed soon) + sequence.UpdateSequenceName(); + float titleWidth = windowStyle.CalcSize(new GUIContent(sequence.name)).x; float windowWidth = Mathf.Max (titleWidth + 10, 100); @@ -214,38 +211,22 @@ namespace Fungus if (GUILayout.Button(fungusScript.selectedSequence == null ? "Create Sequence" : "Create", fungusScript.selectedSequence == null ? EditorStyles.miniButton : EditorStyles.miniButtonLeft)) { - Sequence newSequence = fungusScript.CreateSequence(fungusScript.scriptScrollPos); - Undo.RegisterCreatedObjectUndo(newSequence, "New Sequence"); - fungusScript.selectedSequence = newSequence; - fungusScript.selectedCommand = null; + CreateSequence(fungusScript, fungusScript.scriptScrollPos); } if (fungusScript.selectedSequence == null) { GUILayout.FlexibleSpace(); } - - if (fungusScript.selectedSequence != null) + else { if (GUILayout.Button("Delete", EditorStyles.miniButtonMid)) { - Undo.DestroyObjectImmediate(fungusScript.selectedSequence.gameObject); - fungusScript.selectedSequence = null; - fungusScript.selectedCommand = null; + DeleteSequence(fungusScript, fungusScript.selectedSequence); } if (GUILayout.Button("Duplicate", EditorStyles.miniButtonRight)) { - GameObject copy = GameObject.Instantiate(fungusScript.selectedSequence.gameObject) as GameObject; - copy.transform.parent = fungusScript.transform; - copy.transform.hideFlags = HideFlags.HideInHierarchy; - copy.name = fungusScript.selectedSequence.name; - - Sequence sequenceCopy = copy.GetComponent(); - sequenceCopy.nodeRect.x += sequenceCopy.nodeRect.width + 10; - - Undo.RegisterCreatedObjectUndo(copy, "Duplicate Sequence"); - fungusScript.selectedSequence = sequenceCopy; - fungusScript.selectedCommand = null; + DuplicateSequence(fungusScript, fungusScript.selectedSequence); } } @@ -267,6 +248,53 @@ namespace Fungus GUILayout.EndScrollView(); } + protected virtual Sequence CreateSequence(FungusScript fungusScript, Vector2 position) + { + Sequence newSequence = fungusScript.CreateSequence(position); + Undo.RegisterCreatedObjectUndo(newSequence, "New Sequence"); + fungusScript.selectedSequence = newSequence; + fungusScript.selectedCommand = null; + + return newSequence; + } + + protected virtual void DeleteSequence(FungusScript fungusScript, Sequence sequence) + { + foreach (Command command in sequence.commandList) + { + Undo.DestroyObjectImmediate(command); + } + + Undo.DestroyObjectImmediate(sequence); + fungusScript.selectedSequence = null; + fungusScript.selectedCommand = null; + } + + protected virtual void DuplicateSequence(FungusScript fungusScript, Sequence sequence) + { + if (sequence == null) + { + return; + } + + Vector2 newPosition = new Vector2(sequence.nodeRect.position.x + sequence.nodeRect.width + 20, sequence.nodeRect.y); + Sequence newSequence = CreateSequence(fungusScript, newPosition); + newSequence.sequenceName = sequence.sequenceName + " (Copy)"; + + foreach (Command command in sequence.commandList) + { + System.Type type = command.GetType(); + Command newCommand = Undo.AddComponent(fungusScript.gameObject, type) as Command; + System.Reflection.FieldInfo[] fields = type.GetFields(); + foreach (System.Reflection.FieldInfo field in fields) + { + field.SetValue(newCommand, field.GetValue(command)); + } + newCommand.selected = false; + newSequence.commandList.Add(newCommand); + } + } + protected virtual void CreateSequenceCallback(object item) { FungusScript fungusScript = GetFungusScript(); @@ -274,9 +302,7 @@ namespace Fungus { Vector2 position = (Vector2)item; position -= fungusScript.scriptScrollPos; - Sequence newSequence = fungusScript.CreateSequence(position); - Undo.RegisterCreatedObjectUndo(newSequence, "New Sequence"); - fungusScript.selectedSequence = newSequence; + CreateSequence(fungusScript, position); } } @@ -311,7 +337,7 @@ namespace Fungus GUILayout.BeginVertical(); GUILayout.FlexibleSpace(); - GUILayout.Label(sequence.name, labelStyle); + GUILayout.Label(sequence.sequenceName, labelStyle); GUILayout.FlexibleSpace(); GUILayout.EndVertical(); diff --git a/Assets/Fungus/FungusScript/Editor/SequenceEditor.cs b/Assets/Fungus/FungusScript/Editor/SequenceEditor.cs index 36f5236e..b4dbfb24 100644 --- a/Assets/Fungus/FungusScript/Editor/SequenceEditor.cs +++ b/Assets/Fungus/FungusScript/Editor/SequenceEditor.cs @@ -17,6 +17,7 @@ namespace Fungus public virtual void OnEnable() { + sequenceNameProp = serializedObject.FindProperty("sequenceName"); descriptionProp = serializedObject.FindProperty("description"); } @@ -31,14 +32,7 @@ namespace Fungus Sequence sequence = fungusScript.selectedSequence; - EditorGUI.BeginChangeCheck(); - string sequenceName = EditorGUILayout.TextField(new GUIContent("Name", "Name of sequence object"), sequence.gameObject.name); - if (EditorGUI.EndChangeCheck()) - { - Undo.RecordObject(sequence.gameObject, "Set Sequence Name"); - sequence.gameObject.name = sequenceName; - } - + EditorGUILayout.PropertyField(sequenceNameProp); EditorGUILayout.PropertyField(descriptionProp); EditorGUILayout.Separator(); @@ -107,10 +101,10 @@ namespace Fungus int selectedIndex = 0; sequenceNames.Add(nullLabel); - Sequence[] sequences = fungusScript.GetComponentsInChildren(); + Sequence[] sequences = fungusScript.GetComponentsInChildren(true); for (int i = 0; i < sequences.Length; ++i) { - sequenceNames.Add(new GUIContent(sequences[i].name)); + sequenceNames.Add(new GUIContent(sequences[i].sequenceName)); if (sequence == sequences[i]) { @@ -345,9 +339,9 @@ namespace Fungus if (command != null && command.selected) { - Undo.DestroyObjectImmediate(command); Undo.RecordObject(sequence, "Delete"); sequence.commandList.RemoveAt(i); + Undo.DestroyObjectImmediate(command); } } } diff --git a/Assets/Fungus/FungusScript/Scripts/FungusScript.cs b/Assets/Fungus/FungusScript/Scripts/FungusScript.cs index a1f69be5..eb0723ed 100644 --- a/Assets/Fungus/FungusScript/Scripts/FungusScript.cs +++ b/Assets/Fungus/FungusScript/Scripts/FungusScript.cs @@ -90,11 +90,11 @@ namespace Fungus public bool colorCommands = true; /** - * Hides the child sequence game objects in the Hierarchy view. - * Deselect to inspect the child gameobjects and components that make up the Fungus Script. + * Hides the Fungus Script sequence and command components in the inspector. + * Deselect to inspect the sequence and command components that make up the Fungus Script. */ - [Tooltip("Hides the child sequence game objects in the Hierarchy view")] - public bool hideSequenceObjects = true; + [Tooltip("Hides the Fungus Script sequence and command components in the inspector")] + public bool hideComponents = true; } /** @@ -122,10 +122,7 @@ namespace Fungus */ public virtual Sequence CreateSequence(Vector2 position) { - GameObject go = new GameObject("Sequence"); - go.transform.parent = transform; - go.transform.hideFlags = HideFlags.HideInHierarchy; - Sequence s = CreateSequenceComponent(go); + Sequence s = CreateSequenceComponent(gameObject); s.nodeRect.x = position.x; s.nodeRect.y = position.y; return s; @@ -382,10 +379,16 @@ namespace Fungus */ public virtual void UpdateHideFlags() { - Sequence[] sequences = GetComponentsInChildren(); + Sequence[] sequences = GetComponents(); foreach (Sequence sequence in sequences) { - sequence.gameObject.hideFlags = settings.hideSequenceObjects ? HideFlags.HideInHierarchy : HideFlags.None; + sequence.hideFlags = settings.hideComponents ? HideFlags.HideInInspector : HideFlags.None; + } + + Command[] commands = GetComponents(); + foreach (Command command in commands) + { + command.hideFlags = settings.hideComponents ? HideFlags.HideInInspector : HideFlags.None; } } } diff --git a/Assets/Fungus/FungusScript/Scripts/Node.cs b/Assets/Fungus/FungusScript/Scripts/Node.cs index 69214db5..bfa54f2f 100644 --- a/Assets/Fungus/FungusScript/Scripts/Node.cs +++ b/Assets/Fungus/FungusScript/Scripts/Node.cs @@ -7,7 +7,6 @@ namespace Fungus public class Node : MonoBehaviour { public Rect nodeRect = new Rect(10, 10, 100, 40); - public string description = ""; } } \ No newline at end of file diff --git a/Assets/Fungus/FungusScript/Scripts/Sequence.cs b/Assets/Fungus/FungusScript/Scripts/Sequence.cs index 124f7fdb..6f4b06bc 100644 --- a/Assets/Fungus/FungusScript/Scripts/Sequence.cs +++ b/Assets/Fungus/FungusScript/Scripts/Sequence.cs @@ -9,6 +9,10 @@ namespace Fungus [ExecuteInEditMode] public class Sequence : Node { + public string sequenceName = "New Sequence"; + + public string description = ""; + [System.NonSerialized] public Command activeCommand; @@ -18,7 +22,15 @@ namespace Fungus public virtual FungusScript GetFungusScript() { - return GetComponentInParent(); + FungusScript fungusScript = GetComponent(); + + if (fungusScript == null) + { + // Legacy support for earlier system where Sequences were children of the FungusScript + fungusScript = GetComponentInParent(); + } + + return fungusScript; } public virtual bool HasError() @@ -130,5 +142,16 @@ namespace Fungus } return connectedSequences; } + + // Force set the sequence name for any legacy child sequences. + // This is a temporary hack to make it easier to upgrade from earlier versions and will be removed soon. + public virtual void UpdateSequenceName() + { + if (sequenceName == "New Sequence" && + GetComponent() == null) + { + sequenceName = gameObject.name; + } + } } }