/
Sequence.cs
136 lines (115 loc) · 2.36 KB
/
Sequence.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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
namespace Fungus.Script
{
public class Sequence : MonoBehaviour
{
[HideInInspector]
public Rect nodeRect = new Rect(10, 10, 100, 40);
[HideInInspector]
public string description = "";
[System.NonSerialized]
public FungusScript fungusScript;
[System.NonSerialized]
public FungusCommand activeCommand;
int executionCount;
public virtual void Start()
{
fungusScript = GetFungusScript();
}
public FungusScript GetFungusScript()
{
FungusScript sc = null;
Transform parent = transform.parent;
while (parent != null)
{
sc = parent.gameObject.GetComponent<FungusScript>();
if (sc != null)
{
break;
}
}
return sc;
}
public bool HasError()
{
FungusCommand[] commands = GetComponents<FungusCommand>();
foreach (FungusCommand command in commands)
{
if (command.errorMessage.Length > 0)
{
return true;
}
}
return false;
}
public bool IsRunning()
{
if (fungusScript == null ||
fungusScript.executingSequence == null)
{
return false;
}
return (fungusScript.executingSequence == this);
}
public int GetExecutionCount()
{
return executionCount;
}
public void ExecuteNextCommand(FungusCommand currentCommand = null)
{
if (currentCommand == null)
{
executionCount++;
}
activeCommand = null;
FungusCommand nextCommand = null;
bool executeNext = (currentCommand == null);
FungusCommand[] commands = GetComponents<FungusCommand>();
foreach (FungusCommand command in commands)
{
if (command == currentCommand)
{
executeNext = true;
}
else if (executeNext)
{
nextCommand = command;
break;
}
}
if (nextCommand == null)
{
Stop();
}
else
{
if (GetFungusScript().stepTime == 0f)
{
activeCommand = nextCommand;
nextCommand.Execute();
}
else
{
StartCoroutine(ExecuteAfterDelay(nextCommand, GetFungusScript().stepTime));
}
}
}
IEnumerator ExecuteAfterDelay(FungusCommand command, float delay)
{
activeCommand = command;
yield return new WaitForSeconds(delay);
command.Execute();
}
public void Stop()
{
activeCommand = null;
fungusScript.executingSequence = null;
}
}
}