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
{
summaryText += " (" + targetSequence.name + ")";
summaryText += " (" + targetSequence.sequenceName + ")";
}
return summaryText;

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

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

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

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

18
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("<None>"),
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);
}

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

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

88
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>();
Sequence[] sequences = fungusScript.GetComponentsInChildren<Sequence>(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<Sequence>();
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();

16
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>();
Sequence[] sequences = fungusScript.GetComponentsInChildren<Sequence>(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);
}
}
}

23
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>();
Sequence[] sequences = GetComponents<Sequence>();
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 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]
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 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()
@ -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<FungusScript>() == null)
{
sequenceName = gameObject.name;
}
}
}
}

Loading…
Cancel
Save