前言
脚本的声明周期也叫作:必然事件、消息Message...
随着某个时刻的来临,脚本被激活
(有点像Spring的AOP切面)
脚本是什么?
其实一个脚本就是一个对象 对象有其自身的属性,在Unity上的表达就是在Inspector界面中可以看到的值。 属性有访问权限,private和public 等(正常来说如果private的属性,Inspector上是看不到的,public才能看到) 以下是一些控制属性的方法(控制private展示,不显示public,控制范围)
public int a = 100 ;
[ SerializeField ] private int b = 200 ;
[ HideInInspector ] public int c = 100 ;
[ Range ( 0 , 20 ) ] public int d = 20 ;
[SerializeField] 可以将private的属性展示出来 [HideInInspector] 可以将public属性隐藏起来 [Range(0, 20)] 可以调整属性值的范围 给属性进行初始化可以制定默认值!
脚本声明周期
初始阶段
Awake()
Awake()方法的调用时机,是游戏对象被创建 (游戏执行的时候并不是创建游戏obj的时候,而是将游戏物体生效的时候,游戏物体才被创建,Awake调用) 作用:初始化! 只执行一次!!
private void Awake ( )
{
Debug. Log ( "begin to awaking...." + Time . time + this . name) ;
this . enabled = true ;
}
Start()
由于单线程的原因,Start()方法永远比Awake()后执行, 且如果一个游戏中有多个游戏对象存在,(这个脚本如果挂给了多个游戏对象,那么所有的Awake会先执行一遍,然后才执行Start方法) 执行的时间点是脚本生效的时候! 如果脚本生效,但是游戏物体未创建,那么start还是不被调用 作用:初始化! 只执行一次!!
private void Start ( )
{
Debug. Log ( "begin to starting...." + Time . time + this . name) ;
}
OnEnable()
OnEnable()方法,每当脚本启用时被调用! 可以执行多次!!
public void OnEnable ( )
{
Debug. Log ( "begin to onEnable...." + Time . time + this . name) ;
}
物理阶段
FixedUpdate()
FixedUpdate()每隔固定时间执行一次,默认为0.02s (时间可以固定修改,但是不建议修改,这个就是模拟一些变化的,比如说子弹的射击过程, 改大了子弹容易碰撞不精确,间隔小了比0.02还小就更耗性能了!) 适用性:这里可以写一些物体操作(移动,旋转) 时间间隔固定,不受渲染影响,性能会更好
private void FixedUpdate ( )
{
Debug. Log ( Time . time) ;
}
游戏逻辑
Update()
Update() 执行时机:渲染帧执行 每渲染一帧执行一次!所以渲染时间间隔不固定,受渲染帧间隔影响 适用时机:处理游戏逻辑!(如果是手游,那么渲染帧数不需要那么高,那么,游戏逻辑处理就可以间隔高,反之…) 为了代码简单,会将FixedUpdate()方法中的逻辑也放到Update()方法中…
public void Update ( )
{
Debug. Log ( Time . time) ;
}
LateUpdate()
LateUpdate()延迟更新 执行时机:Update() 之后执行 每一帧渲染,执行一次Update紧接着会执行LateUpdate (因此LateUpdate的时间间隔也是一个渲染帧,非固定时间) 适合跟随update刷新的代码逻辑!因为跟随的代码逻辑如果写入Update,那么可能会比要跟算的主体逻辑还要先执行!
public void LateUpdate ( )
{
Debug. Log ( Time . time) ;
}
输入事件
输入事件就有点想js的那些 有鼠标控制的, 有摄像机是否看到Mesh Render的
private void OnMouseDown ( )
{
Debug. Log ( "on mouse down..." ) ;
}
private void OnBecameVisible ( )
{
Debug. Log ( "camera看见你咯~" ) ;
}
结束阶段