unity协程

Unity中的协程 简单理解

无人久伴 提交于 2020-03-10 19:11:41
在Unity中有这样一个概念——协程 我理解的协程概念,就是一个方法,但是可以将这个方法的中间过程挂起,过一段时间或者一些操作后再继续这个方法。 通常,协程的结构就是这样的: IEnumerator Test() { /*内容 内容*/ yield return 0; } 开启协程 StartCoroutine(“协程方法名“); 关闭协程 StopCoroutine(“协程方法名“); 对于一些有参数的协程,也可以这样做: 开启协程 Coroutine c=StartCoroutine(“协程方法名“); 关闭协程 StopCoroutine(c); IEnumerator 是C#的一个迭代器,你可以把它当成 指向一个序列的某个节点的指针 ,它提供了两个重要的接口,分别是Current(返回当前指向的元素)和 MoveNext()(将指针向前移动一个单位,如果移动成功,则返回true) yield 就是这个协程方法里起到协程作用的重要关键字,就是它将这个方法挂起,后面跟不同的东西会有不同的含义,目前常见如下: yiled return 0: 0可以换成任意的int类型的值,都是当前暂停一帧,从下一帧开始执行 yield return new WaitForSeconds(sec): 即这个协程方法挂起等待sec秒的时间 yield return StartCoroutine

Unity C#笔记 协程详解(转)

ε祈祈猫儿з 提交于 2020-03-08 13:00:47
目录 什么是协程 多线程 协程 协程的使用场景 协程使用示例 Invoke的缺陷 协程语法 开启协程 终止协程 挂起 协程的执行原理 什么是协程 在Unity中,协程(Coroutines)的形式是我最喜欢的功能之一,我都会使用它来控制需要定时的。 协同程序,在主程序运行的同时,开启另外一段逻辑处理,来协同当前程序的执行。 可能看了这段文字介绍还是有点模糊,其实可以用多线程来比较。 多线程 多线程,顾名思义,多条同时执行的线程。 最初,多线程的诞生是为了解决IO阻塞问题,如今多线程可以解决许多同样需要异步方法的问题(例如网络等)。 所谓异步,通俗点讲,就是我走我的线程,你走你的线程。当某个线程阻塞时,另一个线程不会受影响继续执行。 需要认识到的是,多线程并不是真正意义上的多条线程同时执行。 它的实际是将一个时间段分成若干个时间片,每个线程轮流运行一个时间片。 (如图,将执行步骤切分成极小的粒度,然后依次运行) 但是由于时间片粒度非常非常小,几乎看不出区别,所以程序执行效果跟真正意义上的并行执行效果基本一致。 多线程的缺陷 然而多线程有一个坏处,就是可能造成共享数据的冲突。 假如有一个变量i = 0, Step1_1的操作是进行++i操作,Step2_1的操作是进行--i操作。 我们预期最终结果i为0。 但由于操作切分得过小,可能会发生这样顺序的事: 线程1:访问i, 将0存到寄存器

unity面试的基础问题(1)

浪尽此生 提交于 2020-02-12 11:44:46
oop:面对对象 特点: 继承:构造函数(先创建父类再子类)析构函数(先销毁子类然后父类) 多态:父类的指针指向子类而调用子类的方法 封装:不被别的访问 装箱:将值变为引用类型 拆箱:将引用类型变为值类型 内存分类: 栈:先进后出 参数/new 值类型/申明变量 堆:new的引用类型分配在堆上 (还有ref和out结合起来可学习一下) 全局变量:static 静态 const 常量 代码区;编译的方法(基本用不着) 下面有个需要注意的小问题Button的事件最好在堆上开辟 进程 线程 协程的区别? 1,进程拥有自己独立的堆和栈。(既不共享堆,亦不共享栈,进程由操作系统调度) 2,线程拥有自己独立的栈和共享的堆。(共享堆,不共享栈,线程亦由操作系统调度(标准线程是的))(线程是在主线程里开辟的(和主线程不是并列关系,不能在同一时间启用同一资源)) 3,协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。(协程是在主线程里开辟的,不需要开锁) 一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行。 协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。 lock 一个方法锁(具体可细查

关于Unity的协程(Coroutine)

六月ゝ 毕业季﹏ 提交于 2019-12-24 04:57:53
参考博客: http://www.unity.5helpyou.com/2658.html 什么是协程?(又称协同程序) 协程类似于函数,可以暂停执行(yield return xxx 之后的代码) , 在下一帧时再次判断是否继续执行。 协程不是多线程,它与主线程同时运行,它在主线程运行的同时开启另一段逻辑处理,类似一个子线程单独出来处理一些问题,性能开销较小,,Unity的协程会在每帧结束之后去检测yield的条件是否满足,满足则执行yield return之后的代码。 在一个MonoBehaviour提供的主线程里只能有一个处于运行状态的协程,而其他协程处于休眠状态。协程实际上是在一个线程中,只不过每个协程对CUP进行分时,协程可以访问和使用unity的所有方法和component。 (1)协程的定义: IEnumrator 函数名(形参表) //最多只能有一个形参 { yield return xxx; } (2)关于协程的开启和停止这里就不再赘述了,网上很多资料。 (3)关于协程的中断指令,即 yield return 后面的指令 yield break; 停止协程 yield return www; 等待一个WWW加载完成 yield return 0/null/数字; 暂停一帧,一般使用null yield return new WaitForSeconds(时间);

Unity单例类

孤街醉人 提交于 2019-12-04 08:51:22
来源: https://www.cnblogs.com/llstart-new0201/p/9730181.html (一)最简单的单利 public class WebRequestUtility : MonoBehaviour { public static WebRequestUtility Instance; private void Awake() { Instance = this; } } 这是最简单有效,最实用最没问题的单利模式。如果说存在什么问题,那就是在别的脚本awake中引用,若果其他脚本中的awake比上述awke先执行,则会报空引用。此问题通过设置脚本执行顺序课解决。题外话,一般初始化启动尽量用start,除非是非常确定要先运行用awake,不要为了先执行而用awake; (二)构造函数法 public class WebRequestUtility : MonoBehaviour { public static WebRequestUtility Instance; WebRequestUtility() { Instance = this; } } 构造函数中初始化instance最先执行,会在awake之前(官方为找到直接说明,但是鉴于脚本先初始化而后运行,会比awake先执行,事实也是这样,如果有人发现有问题再议,来互怼)

unity协程要点

守給你的承諾、 提交于 2019-12-03 14:27:31
使用协程做计时功能应注意 1.协程中用到的组件,变量等被置空前,应该将协程置空 2.置空协程之前应停止协程 3.为了确保同一个协程同时只运行一次,可在协程开始前添加安全代码:判断改协程是否存在,存在则停止协程并将协程置空 实现方法: local function setMyTime() --注意(3) if this.countdown then coroutine.stop(this.countdown) this.countdown = nil end this.countdown = coroutine.start(function() while true do this.tm=this.tm-1--用到的变量 coroutine.wait(1) end end) end 注意(2) if this.countdown then coroutine.stop(this.countdown) --注意(1) this.countdown = nil end --假设此时需要对this.tm置空 this.tm=nil 来源: https://www.cnblogs.com/shirln/p/11799719.html

unity协程

匿名 (未验证) 提交于 2019-12-03 00:22:01
开启协程 StartCoroutine (IEnumerator xxx);//里面传入协程方法 IEnumerator xxx(){}//协程方法定义 关于yied return 返回值 yield return null;//下一帧开始时继续调用 yiled return new WaitForFixedUpdate;//在FixedUpdate之后调用 yield return new WaitForSeconds (n);//N秒后继续运行 yield return WWW;//等待WWW构建完成后继续进行 协程进行逐步进行方法如下: yield return x1(调用协程); yield return x2(调用协程); 文章来源: unity协程

Unity Button延迟功能

匿名 (未验证) 提交于 2019-12-02 23:57:01
有时候Button点下去不是要求立即反应的,而是先有个特别短的动画,再反应。 实现: 继承Button,然后重写一下OnPointerClick,利用协程来延迟。 using System . Collections ; using System . Collections . Generic ; using UnityEngine ; using UnityEngine . Events ; using UnityEngine . EventSystems ; using UnityEngine . UI ; public class MyButton : Button { [ Header ( "执行onClick的延迟时间" )] public float delayTime = 1f ; public override void OnPointerClick ( PointerEventData eventData ) { StartCoroutine ( Click ()); } IEnumerator Click () { Debug . Log ( "动画..." ); yield return new WaitForSecondsRealtime ( delayTime ); onClick . Invoke (); } } 来源:博客园 作者: 朋丶Peng 链接

Unity-动态显示窗口制作思路

匿名 (未验证) 提交于 2019-12-02 23:45:01
此教程来自siki学院的<<暗黑战神>>课程 这次需要记录的是动态显示窗口的制作方式,它的效果是弹出一条游戏Tips,上面可以显示你想显示的内容,随后消失。 显然,我们只需要制作一个动画,动画中改变Text组件的位置即可实现此效果。 然而现在的问题是,不能让这个动画立刻播放,我们需要在特定的时候去播放它,并在特定的时刻停止。 那么怎么实现呢? 我们可以在控制动态显示窗口的脚本中,设置一个方法,当要显示动态Tips时,设置改变Text内容,并激活对应的游戏物体,手动控制动画播放。 注意, 游戏物体不激活时即使动画是自动播放的,也不会播放,只有激活了,才会从头开始播放 。 动画播放后需要停止,因此需要把游戏物体取消激活,但我们在代码中怎么准确地控制它能延时取消激活呢? 这个问题和之前说的异步加载资源服务有点类似,传送门如下: https://www.cnblogs.com/czw52460183/p/11044456.html 当时的思路是在Update中用委托实时查看加载进度,但这里就不行,因为我们没有什么方法可以实时获取到动画播放进度,怎么办呢? 答案是可以使用协程,我们只需要在开启协程后,让它在固定等待一段时间后调用回调方法即可,在这个回调方法中去关闭物体的激活状态即可,而这个等待的时间,就设置成动画的持续时长即可,这样,即使我们没有办法掌握动画的实际播放进度,也可以实现延时关闭

Unity常用协程功能封装

天涯浪子 提交于 2019-12-02 22:30:28
# 1.前言 unity开发过程中,经常用到一些特定的协程功能,比如延时触发、等待触发、重复操作等。unity自带Invoke以及InvokeRepeating方法,但这些方法均采用反射机制,性能消耗,而且代码混淆时极其容易出错。所以再次对这些功能做以下简单封装。方便后续使用。 # 2.CoroutineJobCenter CoroutineJobCenter封装了需要的基本方法。 ## 2.1 延时触发 延时一定事件触发。 ```csharp public IEnumerator StartJobDelayed(float delayedTime, Action action) { yield return new WaitForSeconds(delayedTime); if (action != null) { action(); } } public IEnumerator StartJobDelayed<T>(float delayedTime, Action<T> action, T t) { yield return new WaitForSeconds(delayedTime); if (action != null) { action(t); } } ``` ## 2.2 等待触发 等待某一条件返回true时触发,采用unity自带的WaitUntil类。 ``