前言
脚本的声明周期也叫作:必然事件、消息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看见你咯~");
}
结束阶段
|