写在前面
来小亮给他整个活

协程本质是迭代器,开启协程时先自动MoveNext,如果MoveNext返回为true,则保存此次协程,记录Current的值,根据其值来判断,比如说unity里的等多久,异步加载资源是否加载完成等等;

此外,开启的协程不只一个,也需要一个数据结构来保存所有开启的协程

实现上述两个例子
草走忽略!(unity里的等多久,异步加载资源是否加载完成)

创建一个类CorutineYield来保存协程数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
///Over类
public class Over
{
public bool isover;
}
//保存协程数据类
public class CoroutineYield
{
public IEnumerator ie;
//time模拟Unity WaitForSeconds
public float time;
//Over模拟Unity 资源异步加载是否完成
public Over over;
public CoroutineYield(IEnumerator _ie, float _time) { ie = _ie;time = _time; }
public CoroutineYield(IEnumerator _ie, Over _over) { ie = _ie; over = _over; }
public CoroutineYield() { }
}

创建一个单例类CustomCorutineMgr来管理所有开启的协程

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
public class CustomCoroutineMgr:MonoBehaviour
{
static CustomCoroutineMgr instance;
public static CustomCoroutineMgr Instance => instance;
//保存所有开启的协程
public List<CoroutineYield> CoroutineYields;
//开启协程,自动进行第一步,无返回值结束,有返回值保存
public void StartCorutine(IEnumerator ie)
{
if(ie.MoveNext())
{
if(ie.Current is int)
{
CoroutineYield corutine = new CoroutineYield(ie,Time.time+(int)ie.Current);
CoroutineYields.Add(corutine);
}
if(ie.Current is Over)
{
CoroutineYield corutine = new CoroutineYield(ie, (Over)ie.Current);
CoroutineYields.Add(corutine);
}
}
}
private void Awake()
{
instance = this;
CoroutineYields = new List<CoroutineYield>();
}
private void LateUpdate(){}

}

示例

1
2
3
4
5
6
7
8
9
10
11
IEnumerator WhyUBullyMe()
{
print(1);
yield return 3;
print(3);
yield return 3;
Over a = new Over();
print(a.isover);
yield return a;
print(a.isover);
}

用自定义函数开启协程

1
2
3
4
void Start()
{
CustomCoroutineMgr.Instance.StartCorutine(WhyUBullyMe());
}

Unity生命周期中协程在LateUpdate后处理,我们这里就直接写在LateUpdate里蒜拉,雀食就是这样的啊,你是不是尔龙啊!

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
private void LateUpdate()
{
//倒序循环避免正序循环时其中一个协程结束后被移除,List再排序而跳过后面的协程
for (int i = CustomCoroutineMgr.Instance.CoroutineYields.Count - 1; i >= 0; i--)
{
CoroutineYield coroutine = CustomCoroutineMgr.Instance.CoroutineYields[i];
if (coroutine.ie.Current is int)
{
if (coroutine.time <= Time.time)
{
if (coroutine.ie.MoveNext())
{
if (coroutine.ie.Current is int)
{
coroutine.time = Time.time + (int)coroutine.ie.Current;
}
else if (coroutine.ie.Current is Over)
{
coroutine.over = (Over)coroutine.ie.Current;
}
}
else
{
CustomCoroutineMgr.Instance.CoroutineYields.RemoveAt(i);
}
}
}
if (coroutine.ie.Current is Over)
{
if (coroutine.over.isover)
{
if (coroutine.ie.MoveNext())
{
if (coroutine.ie.Current is int)
{
coroutine.time = Time.time + (int)coroutine.ie.Current;
}
else if (coroutine.ie.Current is Over)
{
coroutine.over = (Over)coroutine.ie.Current;
}
}
else
{
CustomCoroutineMgr.Instance.CoroutineYields.RemoveAt(i);
}
}
}
}
}

写的雀食有够丑的…….疯狂嵌套IF,谁能教教我怎样写才蟀

效果

图1

效果正常