关于Unity的游戏的运行模式

游戏有个入口main函数,执行完main函数就返回

 

main函数中的步骤

1.初始化

2.while(true){

  a.检查有没有消息,包括鼠标有没有被点击,键盘有没有被点击,自定义事件等等,有消息就处理

  b.绘制游戏场景

  c.看看时间是不是还没有到(0.016秒),如果没有到,就稍稍地休息一会儿(Sleep),如果a和b只用了0.01秒,那么休息0.006秒,维持帧频在60上下,不大大地超过或低于

        如果cpu很低端,1秒最多只能绘制30次,那么游戏运行的时候就不会有休眠的时间,而且cpu是作死地去绘制,为游戏换取更大的流程程度,手机会很烫,游戏会一卡一卡地。

    但是卡归卡,游戏角色的移动还是从A到B点,可能本来A到B点是有5个画面的,现在因为cpu比较差,只能绘制3个画面,所以看起来比较卡,但是结果还是移动到了B点。

}循环

 

帧频  

while循环,1秒钟可以循环多少次,比如我的电脑,cpu好一点,1秒钟可以绘制80次(80FPS/S),研究表明!秒钟60次(60FPS/S)人就感觉非常流畅了,再往上人眼识别不出区别,反而会消耗CPU,手机可能很快就没电了,用户体验就不好了。

所以60FPS/S,一帧的时间,也就是一次循环的时间,为1/60=0.016秒,也就是一次while循环中a和b的时间要小于等于0.016秒。

2.5G的cpu,1秒钟可以做2.5*1024*1024*1024次加法。

 

 

Unity是组件化的开发模式

1.当组件被挂载到节点上的时候,执行组件自己的Awake()函数

2.当被挂载组件的节点第一次刷新之前(执行节点While循环的a之前或者还没进入while循环),节点下的每个组件调用自己的Start()函数

3.当被挂载组件的节点在处理绘制场景的时候(执行节点While循环的b),节点下的每个组件调用自己的Update()函数

可以知道,节点有个大的while循环,而这个大循环调用的是每个组件的Awake,Start,Update函数的

 

while循环把组件的几个入口接入了进来

1.Awake:组件实例加载的时候调用,初始化可以在这里写,看习惯

2.Start:组件实例在第一次Update或者FixedUpdate之前调用,初始化可以在这里写,看习惯

3.Update:游戏刷新的时候调用,帧频不是固定的

4.FixedUpdate:物理引擎每次固定刷新的时候调用,与帧频无关,主要是用于物理计算

5.OnGUI:绘制2D元素入口的时候调用,例如玩家的昵称,血条,draw出GUI元素

组件是在12345入口下开发出来的模块,实际上我们是在已经写好的Unity工具的基础上,我们为这个工具根据它的逻辑,来开发我们的模块,模块的入口就是12345,我们都是给Unity写代码,实际上是在写代码模块,模块又叫做组件,入口又叫做接口。

每个组件类都继承于MonoBehaviour这个基类,它是Unity为我们提供的父类,我们自己写的组件类都要继承于这个类,是组件的基本规则,我们要扩展Unity,就要遵守它的规则,组件类的名字要和脚本名字一样。

正是因为我们自己写的组件类继承了MonoBehaviour,所以Unity的底层大While循环才调的到12345接口,而我们在1234中写自己的逻辑,就相当于我们扩展了Unity的游戏部分。

 

挂在节点上的其实是组件实例,组件类只是一个定义,猫类,狗类,但是挂在节点上的是具体的什么猫什么狗。

一个脚本中其实也可以定义多个class,但是规范是一个脚本对应一个组件类。

一个节点中其实也可以挂载多个相同的脚本,不会冲突,这些脚本只是组件类实例出来的组件实例而已,不是类。

posted @ 2017-04-22 16:04  杭者  阅读(1579)  评论(0编辑  收藏  举报