子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B执行过程中又调用C、C执行完毕后返回,B执行完毕后返回,最后是A执行完毕。所以子程序是通过栈实现的,一个线程就是执行一个子程序
协程看上去也是子程序,但在执行过程中,在子程序内部可中断,转而执行别的子程序,在适当时候再返回接着执行
格式:StartCoroutine(IEnumerator routine),即它的协程方法是IEnumerator类型
StartCoroutine就是开启一个协程,yield return是迭代器块返回到调用迭代的地方
一个协程的执行可以在任何地方用yield语句来暂停,yield return的值决定了什么时候恢复协程的执行,协程在几帧中执行操作时有极大用处,协程几乎没有性能开销
StartCoroutine一般都会立即返回,然而你也可以获得返回结果的值,但是这一步会等到协程执行完毕后才能生效
携程的优势:
a、携程极高的执行效率,因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销。和多线程相比,线程数量越多,协程的性能优势越明显
b、不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需判断状态就好了,所以执行效率比线程高很多
作用:当添加了一个用了RequireComponent组件的脚本,需要的这个组件就会被脚本自动添加到gameobject上,这可有效避免组装错误
例子:一个脚本可能需要刚体总是被添加到相同的gameobject上,用RequireComponent属性的话,这个过程将被自动完成,因此你可永远不会组装错误
用法:在新建的类前面加[RequireComponent(typeof(Component))],该代码没有分号与其他内容隔开。使用后,新生成的组件是无法被移除的
serialize,序列化
field,场地
在Inspector面板显示的属性都同时具有serialize功能。序列化意味着引擎会保存该域保存过的值;关闭U3D再打开工程,该域值仍然在
a、public变量
在没有加入Attribute(属性)的前提下,public变量是默认被视为可以被serialize的,所以public声明的变量在面板可见,private不可见
b、[SerializeField]Attribute
强制unity去序列化一个私有域,这是一个内部的unity序列化功能,有时候我们需要序列化一个private或者protected属性,这时候就可以用[SerializeField]Attribute,之后就可以在面板显示
c、[HideInInspector]
表示将原本显示在面板上的序列化隐藏起来(隐藏public)
大家还有什么问题,欢迎在下方留言!