了解帧的概念
Unity 底层已经帮助我们做好了死循环,我们需要学习Unity的生命周期函数,利用它做好的规则来执行我们的游戏逻辑就行了。
游戏的本质就是一个死循环,每一次循环处理游戏逻辑就会更新一次画面,之所以能看到画面在动,是因为切换画面的速度达到一定时人眼就认为画面是流畅的。
一帧就是执行一次循环。
FPS(Frames Per Second)即每秒钟帧数,一般我们说的60帧30帧,意思是1秒更新60次、30次画面
1s=1000ms
60帧:1帧为
1000ms/60=16.66ms
30帧:1帧为
1000ms/30=33.33ms
人眼舒适放松时,可视帧数是每秒24帧
游戏卡顿的原因:
跑一帧游戏逻辑中的计算量过大,或者CPU不给力,不能在一帧的时间内处理完所有游戏逻辑。
生命周期函数的概念
所有继承MonoBehavior的脚本 最终都会挂载到GameObject游戏对象上,生命周期函数,就是该脚本对象依附的GameObject对象从出生到消亡整个生命周期中,会通过反射自动调用的一些特殊函数。
Unity帮助我们记录了一个GameObject对象依附了哪些脚本,会自动的得到这些对象,通过反射去执行一些固定名字的函数。
生命周期函数
注意:
生命周期函数的访问修饰符一般为private和protected,因为不需要再外部自己调用生命周期函数 都是Unity自己帮助我们调用的。
1.对象出生
2.Awake
出生时调用,类似构造函数,一个对象只会调用一次。
//当对象(自己这个类对象)被创建时 才会调用该生命周期函数
//类似构造函数的存在 我们可以在一个类对象 该创建 进行一些初始化操作
protected virtual void Awake()
{
//在Unity中打印信息的两种方式
//1. 没有继承MOnoBehavior类的时候
//Debug.Log("123");
//Debug.LogError("出错了!!!!!");
//Debug.LogWarning("警告!!!");
//2. 继承了MonoBehavior 有一个线程的方法 可以使用
print("Awake");
}
3.OnEnable(只有激活时才会使用,和循环无关)
依附的GameObject对象每次激活时调用
//对于我们来说 想要当一个对象被激活时 进行一些逻辑处理 就可以写在这个函数
void OnEnable()
{
print("OnEnable");
}
4.Start
从自己被创建出来后,第一次帧更新之前调用,一个对象只会调用一次
//主要作用还是用于初始化信息的 但是它相对Awake来说 要晚一点
//因为它是在对象 进行第一次帧更新之前才会执行的
void Start()
{
print("Start");
}
5.FixedUpdate
物理帧更新,固定间隔时间执行,间隔时间可以设置。
//它主要是用于 进行物理更新
//它是每一帧的执行的 但是 这里的帧 和游戏帧 有点不同
//它的时间间隔 是可以在 project setting中的 Time里去设置的
void FixedUpdate()
{
print("FixedUpdate");
}
6.Update
逻辑帧更新,每帧执行
//主要用于处理游戏核心逻辑更新的函数
void Update()
{
print("Update");
}
7.LateUpdate
每帧执行,于Update之后执行
//一般这个更新是用来处理 摄像机位置更新相关内容的
//Update和LateUpdate之间 Unity进了一些处理 处理我们动画相关的更新
void LateUpdate()
{
print("LateUpdate");
}
8.OnDisable(只用失活时才会调用,与循环无关)
依附的GameObject对象每次失活时调用
//如果我们希望在一个对象失活时做一些处理 就可以在该函数中写逻辑
void OnDisable()
{
print("OnDisable");
}
9.OnDestroy
对象销毁时调用,依附的GameObject对象被删除时
void OnDestroy()
{
print("OnDestroy");
}
10.程序死亡
生命周期函数支持继承多态
protected override void Awake()
{
base.Awake();
print("子类的Awake");
}
总结
这些生命周期函数,如果你不打算在其中写逻辑,那就不要在这些出生命周期函数。
不同对象的生命周期函数是在同一个线程中执行的吗?
答案:Unity中所有对象上挂载的生命周期函数都是在一个主线程中按先后执行的
理解:Unity会主动把场景上的对象,对象上挂载的脚本都统统记录下来,在主线程的死循环中,按顺序按时机的通过反射,执行记录的对象身上挂载的脚本的对应生命周期函数