切换到宽版
  • 2434阅读
  • 0回复

Unity3D返回域-延时函数扩展 [复制链接]

上一主题 下一主题
离线樱の光
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2014-12-09
MonoBehaviour是所有脚本的基类,所有要挂载到GameObject之上的脚本,都需要继承这个类,js脚本自动继承这个类,C#需要显式地继承MonoBehaviour,MonoBehaviour提供了一系列函数给我们重写,这里记录一下最常用的一些函数

三个Update:

Update在每一帧更新,和游戏逻辑相关的代码,对游戏对象进行旋转,平移的代码在这里实现

LateUpdate在每一帧的Update调用完之后被调用

FixedUpdate按照固定的时间间隔调用,不受帧率变化的影响,物理引擎相关的代码在这里实现,例如对对象施加力

Awake在脚本实例被载入的时候调用

Start在第一次Update之前调用

Reset在对象被重置的时候调用

OnGUI在渲染和处理GUI事件时被调用

OnDestroy在对象被销毁的时候调用

其他一些OnXXX函数在此不作介绍了,后面自然会用到的

MonoBehaviour还有其他一些有意思的东西:

useGUILayout,当你不使用GUI.Window和GUILayout的时候,果断设置为false,这个玩意儿默认是开启的,设置为false最好在Awake回调里面进行设置

Invoke系列方法:

Invoke系列方法相当于计时器,在指定的时间点上调用指定的函数

voidInvoke(string methodName, float time);        //在time秒后调用methodName
void Invoke(stringmethodName, float time, float repeatRate);    //在time秒后开始以repeatRate秒为间隔重复调用方法
voidIsInvoking(string methodName);        //判断某个方法是否在等待调用
voidCancelInvoke();        //取消所有的计时器调用
voidCancelInvoke(string methodName)        //取消某个计时器调用

如果我想Invoke一个带参数的方法,咋整呢?

Coroutine系列方法:

协同方法相当于多线程吧,可以让程序同时做多件事情,通过StartCoroutine传入一个函数,将异步执行这个函数,StartCoroutine有三种用法,对应几种不同类型的参数。需要注意的一个东西是yield,这是一个特殊的返回类型,它确保函数从yield语句的下一行继续执行。

yield是一种特殊的return,就像c++里面的sleep,短暂的sleep可以交出线程的时间片,让其他线程先执行,而yield会返回到父类继续执行,yield后面可以返回一个null,也可以返回一个特殊的函数,当函数成立的时候,才执行接下来的语句(函数包括WaitForSeconds,WaitForFixedUpdate,Coroutine,StartCoroutine这四个继承于YieldInstruction的指令)

yieldreturn null;        //让出时间片,让父进程先执行

yield return new WaitForSeconds(1);           //在程序执行到1秒时才执行接下来的代码

yield return new WaitForFixedUpdate();       //在FixedUpdate调用之后才执行接下来的代码

yield returnnew WaitForEndOfFrame();        //在这一帧结束之后才执行接下来的代码

yieldreturn new StartCoroutine("xxx");        //在xxx协同执行完之后才执行接下来的代码

StartCoroutine的三种调用方法:


StartCoroutine("Coroutine0", 1);
StartCoroutine("Coroutine1");
StartCoroutine(Coroutine2());

//带一个object参数,返回值无视

int Coroutine0(int i)
{
print(i);
return i;
}

//不带参数
void Coroutine1()
{
print("Coroutine test");
}

//调用yield返回IEnumerator类型的函数,可带任意参数
IEnumerator Coroutine2()
{
yield return new WaitForSeconds(2);
print("WaitForSeconds" + Time.time);
}

另外,有StopCoroutine和StopAllCoroutines两个函数用于停止协同函数
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
快速回复
限200 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个