写在前面 来小亮给他整个活 协程本质是迭代器,开启协程时先自动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,谁能教教我怎样写才蟀
效果
效果正常