Browse Source

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.
master
chrisgregan 11 years ago
parent
commit
dc1658b152
  1. 2
      Assets/Fungus/Dialog/Commands/AddOption.cs
  2. 2
      Assets/Fungus/FungusScript/Commands/Call.cs
  3. 2
      Assets/Fungus/FungusScript/Editor/CommandListAdaptor.cs
  4. 18
      Assets/Fungus/FungusScript/Editor/FungusScriptEditor.cs
  5. 6
      Assets/Fungus/FungusScript/Editor/FungusScriptMenuItems.cs
  6. 88
      Assets/Fungus/FungusScript/Editor/FungusScriptWindow.cs
  7. 16
      Assets/Fungus/FungusScript/Editor/SequenceEditor.cs
  8. 23
      Assets/Fungus/FungusScript/Scripts/FungusScript.cs
  9. 1
      Assets/Fungus/FungusScript/Scripts/Node.cs
  10. 25
      Assets/Fungus/FungusScript/Scripts/Sequence.cs

2
Assets/Fungus/Dialog/Commands/AddOption.cs

@ -42,7 +42,7 @@ namespace Fungus
} }
else else
{ {
summaryText += " (" + targetSequence.name + ")"; summaryText += " (" + targetSequence.sequenceName + ")";
} }
return summaryText; return summaryText;

2
Assets/Fungus/FungusScript/Commands/Call.cs

@ -38,7 +38,7 @@ namespace Fungus
return "<Continue>"; return "<Continue>";
} }
return targetSequence.name; return targetSequence.sequenceName;
} }
public override Color GetButtonColor() public override Color GetButtonColor()

2
Assets/Fungus/FungusScript/Editor/CommandListAdaptor.cs

@ -94,7 +94,7 @@ namespace Fungus
return null; return null;
} }
Command newCommand = sequence.gameObject.AddComponent<Note>() as Command; Command newCommand = Undo.AddComponent<Note>(fungusScript.gameObject) as Command;
fungusScript.selectedCommand = newCommand; fungusScript.selectedCommand = newCommand;
return newCommand; return newCommand;

18
Assets/Fungus/FungusScript/Editor/FungusScriptEditor.cs

@ -27,28 +27,28 @@ namespace Fungus
{ {
serializedObject.Update(); serializedObject.Update();
FungusScript t = target as FungusScript; FungusScript fungusScript = target as FungusScript;
t.UpdateHideFlags(); fungusScript.UpdateHideFlags();
if (Application.isPlaying) if (Application.isPlaying)
{ {
if (t.executingSequence == null) if (fungusScript.executingSequence == null)
{ {
t.selectedCommand = null; fungusScript.selectedCommand = null;
} }
else else
{ {
t.selectedCommand = t.executingSequence.activeCommand; fungusScript.selectedCommand = fungusScript.executingSequence.activeCommand;
} }
} }
SequenceEditor.SequenceField(startSequenceProp, SequenceEditor.SequenceField(startSequenceProp,
new GUIContent("Start Sequence", "First sequence to execute when the Fungus Script executes"), new GUIContent("Start Sequence", "First sequence to execute when the Fungus Script executes"),
new GUIContent("<None>"), new GUIContent("<None>"),
t); fungusScript);
if (t.startSequence == null) if (fungusScript.startSequence == null)
{ {
GUIStyle style = new GUIStyle(GUI.skin.label); GUIStyle style = new GUIStyle(GUI.skin.label);
style.normal.textColor = new Color(1,0,0); style.normal.textColor = new Color(1,0,0);
@ -72,9 +72,9 @@ namespace Fungus
EditorGUILayout.Separator(); 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(); commandEditor.DrawCommandInspectorGUI();
DestroyImmediate(commandEditor); DestroyImmediate(commandEditor);
} }

6
Assets/Fungus/FungusScript/Editor/FungusScriptMenuItems.cs

@ -13,11 +13,7 @@ namespace Fungus
GameObject newFungusScriptGO = new GameObject(); GameObject newFungusScriptGO = new GameObject();
newFungusScriptGO.name = "FungusScript"; newFungusScriptGO.name = "FungusScript";
FungusScript fungusScript = newFungusScriptGO.AddComponent<FungusScript>(); FungusScript fungusScript = newFungusScriptGO.AddComponent<FungusScript>();
GameObject newSequenceGO = new GameObject(); Sequence sequence = Undo.AddComponent<Sequence>(newFungusScriptGO);
newSequenceGO.transform.parent = newFungusScriptGO.transform;
newSequenceGO.name = "Start";
newSequenceGO.hideFlags = HideFlags.HideInHierarchy;
Sequence sequence = newSequenceGO.AddComponent<Sequence>();
fungusScript.startSequence = sequence; fungusScript.startSequence = sequence;
fungusScript.selectedSequence = sequence; fungusScript.selectedSequence = sequence;
Undo.RegisterCreatedObjectUndo(newFungusScriptGO, "Create Fungus Script"); Undo.RegisterCreatedObjectUndo(newFungusScriptGO, "Create Fungus Script");

88
Assets/Fungus/FungusScript/Editor/FungusScriptWindow.cs

@ -66,12 +66,6 @@ namespace Fungus
return; return;
} }
if (PrefabUtility.GetPrefabType(fungusScript) == PrefabType.Prefab)
{
GUILayout.Label("No Fungus Script scene object selected (selected object is a prefab)");
return;
}
GUILayout.BeginHorizontal(); GUILayout.BeginHorizontal();
DrawScriptView(fungusScript); DrawScriptView(fungusScript);
ResizeViews(fungusScript); ResizeViews(fungusScript);
@ -83,7 +77,7 @@ namespace Fungus
{ {
EditorUtility.SetDirty(fungusScript); EditorUtility.SetDirty(fungusScript);
Sequence[] sequences = fungusScript.GetComponentsInChildren<Sequence>(); Sequence[] sequences = fungusScript.GetComponentsInChildren<Sequence>(true);
Rect scrollViewRect = new Rect(); Rect scrollViewRect = new Rect();
@ -138,6 +132,9 @@ namespace Fungus
{ {
Sequence sequence = sequences[i]; 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 titleWidth = windowStyle.CalcSize(new GUIContent(sequence.name)).x;
float windowWidth = Mathf.Max (titleWidth + 10, 100); float windowWidth = Mathf.Max (titleWidth + 10, 100);
@ -214,38 +211,22 @@ namespace Fungus
if (GUILayout.Button(fungusScript.selectedSequence == null ? "Create Sequence" : "Create", if (GUILayout.Button(fungusScript.selectedSequence == null ? "Create Sequence" : "Create",
fungusScript.selectedSequence == null ? EditorStyles.miniButton : EditorStyles.miniButtonLeft)) fungusScript.selectedSequence == null ? EditorStyles.miniButton : EditorStyles.miniButtonLeft))
{ {
Sequence newSequence = fungusScript.CreateSequence(fungusScript.scriptScrollPos); CreateSequence(fungusScript, fungusScript.scriptScrollPos);
Undo.RegisterCreatedObjectUndo(newSequence, "New Sequence");
fungusScript.selectedSequence = newSequence;
fungusScript.selectedCommand = null;
} }
if (fungusScript.selectedSequence == null) if (fungusScript.selectedSequence == null)
{ {
GUILayout.FlexibleSpace(); GUILayout.FlexibleSpace();
} }
else
if (fungusScript.selectedSequence != null)
{ {
if (GUILayout.Button("Delete", EditorStyles.miniButtonMid)) if (GUILayout.Button("Delete", EditorStyles.miniButtonMid))
{ {
Undo.DestroyObjectImmediate(fungusScript.selectedSequence.gameObject); DeleteSequence(fungusScript, fungusScript.selectedSequence);
fungusScript.selectedSequence = null;
fungusScript.selectedCommand = null;
} }
if (GUILayout.Button("Duplicate", EditorStyles.miniButtonRight)) if (GUILayout.Button("Duplicate", EditorStyles.miniButtonRight))
{ {
GameObject copy = GameObject.Instantiate(fungusScript.selectedSequence.gameObject) as GameObject; DuplicateSequence(fungusScript, fungusScript.selectedSequence);
copy.transform.parent = fungusScript.transform;
copy.transform.hideFlags = HideFlags.HideInHierarchy;
copy.name = fungusScript.selectedSequence.name;
Sequence sequenceCopy = copy.GetComponent<Sequence>();
sequenceCopy.nodeRect.x += sequenceCopy.nodeRect.width + 10;
Undo.RegisterCreatedObjectUndo(copy, "Duplicate Sequence");
fungusScript.selectedSequence = sequenceCopy;
fungusScript.selectedCommand = null;
} }
} }
@ -267,6 +248,53 @@ namespace Fungus
GUILayout.EndScrollView(); 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) protected virtual void CreateSequenceCallback(object item)
{ {
FungusScript fungusScript = GetFungusScript(); FungusScript fungusScript = GetFungusScript();
@ -274,9 +302,7 @@ namespace Fungus
{ {
Vector2 position = (Vector2)item; Vector2 position = (Vector2)item;
position -= fungusScript.scriptScrollPos; position -= fungusScript.scriptScrollPos;
Sequence newSequence = fungusScript.CreateSequence(position); CreateSequence(fungusScript, position);
Undo.RegisterCreatedObjectUndo(newSequence, "New Sequence");
fungusScript.selectedSequence = newSequence;
} }
} }
@ -311,7 +337,7 @@ namespace Fungus
GUILayout.BeginVertical(); GUILayout.BeginVertical();
GUILayout.FlexibleSpace(); GUILayout.FlexibleSpace();
GUILayout.Label(sequence.name, labelStyle); GUILayout.Label(sequence.sequenceName, labelStyle);
GUILayout.FlexibleSpace(); GUILayout.FlexibleSpace();
GUILayout.EndVertical(); GUILayout.EndVertical();

16
Assets/Fungus/FungusScript/Editor/SequenceEditor.cs

@ -17,6 +17,7 @@ namespace Fungus
public virtual void OnEnable() public virtual void OnEnable()
{ {
sequenceNameProp = serializedObject.FindProperty("sequenceName");
descriptionProp = serializedObject.FindProperty("description"); descriptionProp = serializedObject.FindProperty("description");
} }
@ -31,14 +32,7 @@ namespace Fungus
Sequence sequence = fungusScript.selectedSequence; Sequence sequence = fungusScript.selectedSequence;
EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(sequenceNameProp);
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(descriptionProp); EditorGUILayout.PropertyField(descriptionProp);
EditorGUILayout.Separator(); EditorGUILayout.Separator();
@ -107,10 +101,10 @@ namespace Fungus
int selectedIndex = 0; int selectedIndex = 0;
sequenceNames.Add(nullLabel); sequenceNames.Add(nullLabel);
Sequence[] sequences = fungusScript.GetComponentsInChildren<Sequence>(); Sequence[] sequences = fungusScript.GetComponentsInChildren<Sequence>(true);
for (int i = 0; i < sequences.Length; ++i) 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]) if (sequence == sequences[i])
{ {
@ -345,9 +339,9 @@ namespace Fungus
if (command != null && if (command != null &&
command.selected) command.selected)
{ {
Undo.DestroyObjectImmediate(command);
Undo.RecordObject(sequence, "Delete"); Undo.RecordObject(sequence, "Delete");
sequence.commandList.RemoveAt(i); sequence.commandList.RemoveAt(i);
Undo.DestroyObjectImmediate(command);
} }
} }
} }

23
Assets/Fungus/FungusScript/Scripts/FungusScript.cs

@ -90,11 +90,11 @@ namespace Fungus
public bool colorCommands = true; public bool colorCommands = true;
/** /**
* Hides the child sequence game objects in the Hierarchy view. * Hides the Fungus Script sequence and command components in the inspector.
* Deselect to inspect the child gameobjects and components that make up the Fungus Script. * 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")] [Tooltip("Hides the Fungus Script sequence and command components in the inspector")]
public bool hideSequenceObjects = true; public bool hideComponents = true;
} }
/** /**
@ -122,10 +122,7 @@ namespace Fungus
*/ */
public virtual Sequence CreateSequence(Vector2 position) public virtual Sequence CreateSequence(Vector2 position)
{ {
GameObject go = new GameObject("Sequence"); Sequence s = CreateSequenceComponent(gameObject);
go.transform.parent = transform;
go.transform.hideFlags = HideFlags.HideInHierarchy;
Sequence s = CreateSequenceComponent(go);
s.nodeRect.x = position.x; s.nodeRect.x = position.x;
s.nodeRect.y = position.y; s.nodeRect.y = position.y;
return s; return s;
@ -382,10 +379,16 @@ namespace Fungus
*/ */
public virtual void UpdateHideFlags() public virtual void UpdateHideFlags()
{ {
Sequence[] sequences = GetComponentsInChildren<Sequence>(); Sequence[] sequences = GetComponents<Sequence>();
foreach (Sequence sequence in sequences) 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<Command>();
foreach (Command command in commands)
{
command.hideFlags = settings.hideComponents ? HideFlags.HideInInspector : HideFlags.None;
} }
} }
} }

1
Assets/Fungus/FungusScript/Scripts/Node.cs

@ -7,7 +7,6 @@ namespace Fungus
public class Node : MonoBehaviour public class Node : MonoBehaviour
{ {
public Rect nodeRect = new Rect(10, 10, 100, 40); public Rect nodeRect = new Rect(10, 10, 100, 40);
public string description = "";
} }
} }

25
Assets/Fungus/FungusScript/Scripts/Sequence.cs

@ -9,6 +9,10 @@ namespace Fungus
[ExecuteInEditMode] [ExecuteInEditMode]
public class Sequence : Node public class Sequence : Node
{ {
public string sequenceName = "New Sequence";
public string description = "";
[System.NonSerialized] [System.NonSerialized]
public Command activeCommand; public Command activeCommand;
@ -18,7 +22,15 @@ namespace Fungus
public virtual FungusScript GetFungusScript() public virtual FungusScript GetFungusScript()
{ {
return GetComponentInParent<FungusScript>(); FungusScript fungusScript = GetComponent<FungusScript>();
if (fungusScript == null)
{
// Legacy support for earlier system where Sequences were children of the FungusScript
fungusScript = GetComponentInParent<FungusScript>();
}
return fungusScript;
} }
public virtual bool HasError() public virtual bool HasError()
@ -130,5 +142,16 @@ namespace Fungus
} }
return connectedSequences; 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<FungusScript>() == null)
{
sequenceName = gameObject.name;
}
}
} }
} }

Loading…
Cancel
Save