初始脚本
using System.Collections;// 导入系统的集合库
using System.Collections.Generic; // 导入系统的泛型集合库
using UnityEngine;// 导入 Unity 引擎
public class Move : MonoBehaviour // 定义一个名为 Move 的公有类,并继承自 MonoBehaviour 类
{
Void Start()//在脚本被加载时执行,在这里可以做一些初始化操作;
{
}
void Update()//在每一帧渲染前执行,可以实现移动、旋转等操作
{
}
}
MonoBehaviour 类定义在 UnityEngine 命名空间中。在 Unity 引擎中,所有的游戏对象都必须绑定一个继承自 MonoBehaviour 的脚本。MonoBehaviour 类封装了很多 Unity 事件(如 Start、Update、LateUpdate、FixedUpdate、OnCollisionEnter 等等)和相关方法(如 SendMessage、Invoke、InvokeRepeating 等等),可以通过继承 MonoBehaviour 类来使用这些事件和方法。同时,MonoBehaviour 类也提供了一些属性、字段和方法,可以实现访问游戏对象、改变游戏对象的状态、以及协程等功能。
脚本的声明周期函数
- Awake
void Awake() { Debug.Log("hello world"); //Debug.Log() 是Unity游戏引擎中的一个调试函数 //它会在Unity编辑器的控制台窗口中输出调试信息。 //这个函数定义在UnityEngine命名空间中的Debug类中。 }
在对象被创建时执行一次,在其中打印一句话“hello world”到Unity的控制台中。具体地,当对象首次被创建时,Unity会自动调用其中的Awake()方法。这个方法是MonoBehaviour脚本生命周期中的一个方法,在对象被创建时进行初始化和设置,因此通常用于物体的初始化操作。
-
OnEnable
void OnEnable() { Debug.Log("hello unity"); }
在对象激活时执行,被调用时表示该对象已经被激活并启用。当一个脚本被加入到Unity游戏对象上时,如果这个对象是激活状态,Unity会立即调用它的OnEnable()方法。在这个例子中,当脚本被激活时将会输出一段调试信息。需要注意的是,OnEnable()方法不同于Awake()方法,Awake()方法在对象首次创建时被调用一次,而OnEnable()方法在对象重新被激活时会被调用。通常情况下,我们会在OnEnable()方法中执行需要在对象被激活时需要进的初始化操作,如订阅事件、打开资源等。
-
Start
void Start() { Debug.Log("hello Start"); }
生命周期函数之一。在脚本所绑定的游戏对象第一次被激活时(如场景开始运行或者游戏对象被实例化)Start 函数会被自动调用.
-
Update
void Update() { // Unity 引擎的一个生命周期函数,它在每一帧更新前自动被调用。 // Update 常用于实现实时动画、物理模拟、用户输入和场景交互等功能。 //具体来说,Update 可以用于实现如下功能: //控制游戏物体的运动行为(如移动、旋转等); //执行玩家的输入控制(如键盘、鼠标、手柄等); //更新游戏世界中的物理模拟状态(如重力、碰撞、力等); //实现游戏 AI 和状态机; //处理游戏逻辑和界面交互等。 //总之,Update 函数是 Unity 引擎非常重要的一个生命周期函数, //常用于控制游戏对象的运行行为和交互,可以使游戏更加稳定流畅。 //但需要注意的是,过多的 Update 函数会影响游戏的性能表现,因此需要谨慎使用和优化。 }
-
LateUpdate
void LateUpdate() { //和 Update 函数类似,都会在每一帧更新前自动执行。 //但是,它的执行时间点比 Update 更晚, //具体来说,在所有 Update 函数执行完毕后,才会执行 LateUpdate 函数。 //LateUpdate 常用于控制相机的行为和位置。 //因为在游戏运行期间,不同的游戏元素可能会不断地移动、旋转, //如果相机在 Update 函数中被更新,可能会使相机抖动或移动不够流畅, //因此我们可以将相机操作放入 LateUpdate 函数中, //确保它是在所有 Update 函数执行完成之后才执行。 //除了控制相机之外,LateUpdate 还可以用于其它的行为逻辑, //例如物体的跟随和平滑移动等。 //同时需要注意的是,不要在 LateUpdate 函数中修改其他物体的状态, //这可能会导致难以发现的不可预知的行为。 }
-
FixedUpdate
void FixedUpdate() { //固定帧更新函数,与 Update() 函数不同,它的调用频率是固定的。 //FixedUpdate() 在每一帧结束时被调用,它的调用周期由物理引擎控制, //帧率变化时 Update() 函数的调用次数会变化 //但 FixedUpdate() 的调用次数不会受到帧率的影响。 //因此,一些需要与物理交互的操作应该放在 FixedUpdate() 中进行 //比如移动具有刚体组件的物体、进行碰撞检测等等。 //注意,如果在 Update() 函数中修改具有刚体组件的物体的位置, //可能会导致与物理引擎的冲突,造成不必要的问题。 //需要注意的是,为了调用 FixedUpdate() 函数 //需要将脚本组件附加到具有刚体组件的物体上,并启用 isKinemactic 属性 ?? //否则 FixedUpdate() 函数可能无法正常工作。 }
编辑->项目设置->时间 可修改固定时间步进
-
OnDisable
void OnDisable() { //当脚本或游戏对象被禁用时,就会自动调用该函数 //在游戏中,当我们需要暂停、切换场景或者销毁一个游戏对象时 //就需要使用到禁用函数,这个时候 OnDisable() 会被自动调用。 //在 OnDisable 实现一些资源的释放或者清理操作,以便游戏的性能和效率,同时也可以避免游戏出现异常错误。 //需要注意的是,OnDisable() 函数不应该用来释放所有资源,否则会影响游戏的启动时间。 //对于OnEnable()所做的初始化操作,应该在Awake()和Start()等函数中实现。 //一些常见的在 OnDisable() 函数中需要执行的操作包括:取消订阅事件、关闭界面、停止协程、停止音频等等, //这些操作都可以为游戏项目提供更好的用户体验和性能。 }
-
OnDestory
void OnDestory() { Debug.Log("バイバイ unity"); //当一个游戏对象被销毁时,就会自动调用该函数。(区分销毁与禁用(是否启用)的区别 //在游戏中,当我们需要销毁一个游戏对象时,需使用到销毁函数,这个时候 OnDestroy() 会自动被调用。 //在 OnDestroy() 函数中,我们可以实现一些资源的释放、清理操作或者停止一些操作, //以便游戏的性能和效率,同时也可以避免游戏出现异常错误和内存泄漏等等。 //需要注意的是,OnDestroy() 函数是在场景卸载后才会被执行的, //因此不适合用来释放非对象级别的资源,比如静态变量或常驻内存的单例等等, //因为这些资源会在场景卸载之后仍然存在。 //一些常见的在 OnDestroy() 函数中需要执行的操作包括: //释放组件、清空缓存、取消订阅事件、关闭连接等等, //这些操作都可以为游戏项目提供更好的性能和效率。 }
关于多脚本的执行顺序
点击右上角“打开”旁边的Execution… 打开脚本执行顺序面板
对于所有脚本,先执行全部的Awake…