Update():每一帧执行时都会调用
LateUpdate():Update执行后调用
上面两种是不定频率的立即更新,会受到当前帧调用时间的影响
FixedUpdate():默认情况下,0.02s调用一次(此时间可在Editor->Project Settings->Time中TimeManager中配置);
平滑更新,虽然也会因为某一帧耗时较多而卡住,但是正常程序会优化这一过程。
协程(模拟多线程)
【例】每次等待一秒则创建一个游戏物体,Update中写就很麻烦(要用一个Time.DeltaTime作计时器,使用判断语句来写),通过引入协程,就可以直接使用for循环来操作
StartCoroutine():协程!启动!
yield return:告诉Unity需要等待多久执行下一个循环
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Script:MonoBehaviour
{
void Start()
{
StartCoroutine(CreatCube())//开始CreatCube()协程任务
}
IEnumerator CreatCube()
{
for(int i=0;i<100;i++)
{
//创建基本物体CreatePrimitive
GameObject.CreatePrimitive(PrimitiveType.Cube).transform.position=Vector3.one*i);
yield return new WaitForSeconds(1f);//等待一秒
}
}
}
IEnumerator 可以理解为一个函数对象的容器(函数对象1 函数对象2 .....),通过使用yield关键字,将yield关键字部分的函数代码抽出并生成一个函数,放到IEnumerator容器中。
IEnumerator 可以依次执行容器中的函数
Yield Return关键字的作用就是退出当前函数,并且会保存当前函数执行到什么地方,也就上下文。
下面是关闭协程代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Script : MonoBehaviour
{
private Coroutine m_Coroutine = null;//创建协程类;
IEnumerator CreatCube()
{
for (int i = 0; i < 100; i++)
{
//创建基本物体CreatPrimitive
GameObject.CreatePrimitive(PrimitiveType.Cube).transform.position = Vector3.one * i);
yield return new WaitForSeconds(1f);//等待一秒
}
void OnGUI()
{
if (GUILayout.Button("StartCoroutine"))
{
if (m_Coroutine != null)
StopCoroutine(m_Coroutine);
m_Coroutine = StartCoroutine(CreatCube());
}
if (GUILayout.Button("StopCoroutine"))
{
if (m_Coroutine != null)
StopCoroutine(m_Coroutine);
}
}
}