unity学习笔记

  • Action的用法
  • 使用方法
  • 1
  • 2
  • 实际使用


Action的用法

今天和前端的同事学习了一个新的用法
这个用法解决了我之前一直困扰的问题
当然这个问题可以有别的方法解决,但是这个方法更适合编程的思维

实际的需求:
在协程里当协程完成了之后再进行后面的方法和函数

因为协程是异步的,不能像主程一样只有前面的方法执行完毕之后才能往下执行
但是在实际的使用过程中,我们避免不了的要用到协程去进行一些文件的读写,api的调用等功能
而协程会导致不同的线程之间数据的不同步
打个可能不是很恰当的例子
协程1访问了api,获得服务器上的用户信息,如token
主程/协程里需要根据这个token再去调用另一个api来获得其他的数据,比如任务列表信息
这里就出现了问题,因为协程是不同线程同时进行的,不管其他的线程进行到哪一步了,别的线程都不会被影响,也就是不会等你结束了我才接着执行
就会出现访问数据失败的bug,因为第一个获得token的线程还没有跑完,另一个协程已经在用了
当然这有简单粗暴的方法,那就是直接将协程2/主程里的方法写在协程1里,协程自己内部的执行顺序还是能保证按照顺序执行的
这样也能解决问题
当然想的话也有其他的一些方式,比如通过脚本的生命周期进行协程运行的顺序等(这个方案之差个人感觉甚至不能称之为方法了)

于是乎在今天和前端同事的沟通中,无意间发现了他使用的方法刚好就是解决这个问题的最优解(对于目前的我来说)
所以激动的我说服了大佬给了我几分钟向我介绍了这个操作的具体实现方法

使用方法

1

在协程方法的形参中加入一个Action<数据类型> 方法名
然后在协程的最后进行方法的调用

2

在主程里调用这个协程的时候,在形参中使用匿名函数,重写Action里的方法即可实现

实际使用

协程1

public IEnumerator 协程方法(Action<数据类型> 方法名)
    {
        协程里的方法
        if(onComplete != null)方法名(playInfo.data);//在上面的都执行完后执行oncomplete里的代码
    }

主程/协程2

StartCoroutine(协程1的方法(new System.Action<协程1形参里的数据类型>((协程1形参里的数据类型 变量名) => {
            具体需要实现的方法
        })));

这里的思路个人感觉有点像接口的逻辑
接口是在抽象类里写好方法名,不写具体的方法
在实现接口的类里重写方法,这个时候才写具体的实现方法
这个方法就是通过action这个接口,封装方法
只在协程1里进行调用,但不写具体的调用内容
但因为是在协程1里写的,所以按照前面讲的逻辑
在一个协程里的时候,是遵循一步一步走的原则的
这样就能保证下一步的操作一定是在上一步完成之后才进行的
然后在调用协程1的时候通过匿名函数的方式重写协程1里action的具体方法内容
这个思路一绝
不过现在想一想,好像这个逻辑也还是用了前面说的把方法都写在同一个协程里的思路
不过这个最大的益处就是可复用性,也不用再担心因为协程的不同步性导致的数据污染
可以说是一劳永逸了
有经验就是不一样啊~ 有一个有经验的同事就是不一样啊~
大佬nb~!