/
Graph.cs
113 lines (91 loc) · 3.97 KB
/
Graph.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System.Collections.Generic;
using UnityEngine;
using FullSerializer;
namespace ActionGraph
{
public class Graph : MonoBehaviour
{
// -------------------------------------------------------------------------------
public string SerialisedGraph = "";
public List<Object> UnityObjectReferences = new List<Object>();
public GraphData GraphData = null;
// -------------------------------------------------------------------------------
public bool IsTransitioning { get { return mCurrentNode is TransitionNode; } }
public Node CurrentNode { get { return mCurrentNode; } }
// -------------------------------------------------------------------------------
private fsSerializer mSerialiser = null;
private Node mCurrentNode = null;
// -------------------------------------------------------------------------------
public void Start()
{
Initialise();
Load();
if (GraphData.Nodes != null && GraphData.Nodes.Count > 0)
{
mCurrentNode = GraphData.Nodes[GraphData.StartNodeIndex];
mCurrentNode.OnEnter();
}
else
{
Debug.Log("Graph doesn't have any nodes - disabling!", this);
gameObject.SetActive(false);
}
}
// -------------------------------------------------------------------------------
public void Initialise()
{
mSerialiser = new fsSerializer();
mSerialiser.AddConverter(new UnityObjectConverter());
mSerialiser.Context.Set(UnityObjectReferences);
}
// -------------------------------------------------------------------------------
public void Update()
{
if (mCurrentNode != null)
{
mCurrentNode.OnUpdate();
// Check transitions when we're ready (normally when all actions are finished, unless told otherwise)
if (mCurrentNode.FinishedAllActions || !mCurrentNode.MustFinishAllActions)
{
var newNode = mCurrentNode.CheckConnections();
if (newNode != mCurrentNode)
{
mCurrentNode.OnExit();
newNode.OnEnter();
mCurrentNode = newNode;
}
}
}
}
// -------------------------------------------------------------------------------
public void Save()
{
// We want to fill in a fresh list of references so clear the existing one
// in case it contains any stale/unused references
UnityObjectReferences.Clear();
// Serialise the graph and save it to a string
fsData data;
mSerialiser.TrySerialize(typeof(GraphData), GraphData, out data).AssertSuccessWithoutWarnings();
SerialisedGraph = fsJsonPrinter.CompressedJson(data);
}
// -------------------------------------------------------------------------------
public void Load()
{
if (GraphData == null)
{
if (SerialisedGraph != "")
{
fsData parsedData = fsJsonParser.Parse(SerialisedGraph);
object deserializedGraph = null;
mSerialiser.TryDeserialize(parsedData, typeof(GraphData), ref deserializedGraph).AssertSuccessWithoutWarnings();
GraphData = (GraphData)deserializedGraph;
}
else
{
GraphData = new GraphData();
}
}
}
// -------------------------------------------------------------------------------
}
}