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
|
public
class
Task
{
public
bool
Running {
get
{
return
task.Running;
}
}
public
bool
Paused {
get
{
return
task.Paused;
}
}
public
delegate
void
FinishedHandler(
bool
manual);
public
event
FinishedHandler Finished;
public
Task(IEnumerator c,
bool
autoStart =
true
)
{
task = TaskManager.CreateTask(c);
task.Finished += TaskFinished;
if
(autoStart)
Start();
}
public
void
Start()
{
task.Start();
}
public
void
Stop()
{
task.Stop();
}
public
void
Pause()
{
task.Pause();
}
public
void
Unpause()
{
task.Unpause();
}
void
TaskFinished(
bool
manual)
{
FinishedHandler handler = Finished;
if
(handler !=
null
)
handler(manual);
}
TaskManager.TaskState task;
}
第二步:我们需要一个管理类来创建任务。
|
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
|
class
TaskManager : MonoBehaviour
{
public
class
TaskState
{
public
bool Running {
get
{
return
running;
}
}
public
bool Paused {
get
{
return
paused;
}
}
public
delegate
void
FinishedHandler(bool manual);
public
event FinishedHandler Finished;
IEnumerator coroutine;
bool running;
bool paused;
bool stopped;
public
TaskState(IEnumerator c)
{
coroutine = c;
}
public
void
Pause()
{
paused =
true
;
}
public
void
Unpause()
{
paused =
false
;
}
public
void
Start()
{
running =
true
;
singleton.StartCoroutine(CallWrapper());
}
public
void
Stop()
{
stopped =
true
;
running =
false
;
}
IEnumerator CallWrapper()
{
yield
return
null
;
IEnumerator e = coroutine;
while
(running) {
if
(paused)
yield
return
null
;
else
{
if
(e !=
null
&& e.MoveNext()) {
yield
return
e.Current;
}
else
{
running =
false
;
}
}
}
FinishedHandler handler = Finished;
if
(handler !=
null
)
handler(stopped);
}
}
static
TaskManager singleton;
public
static
TaskState CreateTask(IEnumerator coroutine)
{
if
(singleton ==
null
) {
GameObject go =
new
GameObject(
"TaskManager"
);
singleton = go.AddComponent<TaskManager>();
}
return
new
TaskState(coroutine);
}
}
|