赞
踩
下图是Unity 中各个类的继承关系:
- 每一个脚本默认都是继承MonoBehaviour的
- MonoBehaviour是继承Behaviour的
- Behaviour是继承Component的
- Component是继承Object的
- GameObject 是 继承Object的
点击这里进入Unity 官网文档了解更多。
- start 方法: 这个方法在游戏场景加载时被调用, 它只会执行一次。在该方法内可以写一些游戏场景初始化之类的代码.
- Update方法: 这个方法会在每一帧渲染之前被调用, 在每一帧都会执行很多次。大部分游戏代码在这里执行, 除了物理部分的代码。
- FixedUpdate方法: 这个方法会在固定的物理时间步调调用一次。这里也是基本物理行为代码执行的地方。
下图描述了Unity 中脚本的声明周期:
Reset() 只会在 Editor 模式下执行,当脚本首次附加在游戏对象时或者点击GameObject 的 Rest 按钮后会调用。Reset最常用于在检视面板中给定一个最常用的默认值.
- Editor 模式指的是编辑器使用的代码,当该游戏发布时,不会包含这些代码。如果属于编辑模式下的代码,需要放在 Editor 文件夹下,如果属于运行时执行的代码(比如说附加在游戏物体的脚本),应该放在任意的 非 Editor 文件夹下。 而且 Editor 文件夹的位置是很灵活的,可以作为其它目录的子目录,这样开发者就可以根据不同的功能来区分,将不同的功能的编辑代码放在不同的Editor 目录下。
- Awake() 是加载场景时运行,在脚本实例的整个生命周期中,Awake函数仅执行一次;Awake 方法总是运行在所有 Start 方法之前。
- 当一个GameObject 被实例化(或者创建)时会触发,但是如果游戏对象的初始状态为关闭状态,那么运行程序,Awake函数不会执行;如果游戏对象的初始状态为开启状态,那么Awake函数会执行。
- 值得注意的一点是,Awake函数的执行与否与脚本的状态(启用或禁用)并没有关系,而是与脚本所绑定的游戏对象的开关状态有关。如果重新加载场景,那么场景内Awake函数的执行情况重新遵循上述两点。
- Start()将在MonoBehavior创建后在该帧Update()第一次执行之前被调用;Start()函数只在脚本被 active 时才会执行;,但是对象上绑定的脚本被禁用了,那么Start函数不会执行。Start函数总是在Awake函数之后执行。
- 这是Start函数的特点,只有在脚本是 active 它才会执行,并且Start函数只会在脚本首次被active 时才会执行。如果是已经active 过的脚本被禁止后再次active,那么Start函数不会再次执行。
- OnDisable() 当一个对象 是 禁用的或者 非 active 时被触发 ,比如调用 GameObject.SetActive (false) 时
- OnGUI(): 绘制界面函数, 这个函数会每帧调用好几次(每个事件一次),GUI显示函数只能在OnGui中调用
- OnApplicationQuit() 应用程序退出时执行一次。
- OnLevelWasLoaded()用于通知游戏已加载新的场景
- OnApplicationPause() 当Play 游戏时点击中间暂停按钮的时候会调用。
- OnApplicationFocus,当程序获得或失去焦点时触发。
- 强制暂停时,先 OnApplicationPause,后 OnApplicationFocus;重新“启动”时,先OnApplicationFocus,后 OnApplicationPause;
一般开发中都是在Awake函数中获取游戏对象或者脚本实例的信息,然后在Start函数中进行一些获取之后的初始化设置。
- Awake、OnEnable、Start,都是游戏开始运行前就调用的方法。
- 如果 GameObject的Activity为true,脚本的enable为true时,其先后顺序为:Awake、OnEnable、Start;
- 如果 GameObject的Activity为true,脚本的enable为false时, 只运行Awake;
- 如果 GameObject的Activity为false时,以上都不调用,OnDisable()被调用;
那么必须使用 Awake 或 Start 方法 来初始化脚本的代码,两者的不同之处在于:
- Awake方法是在加载场景时运行;
- Start 方法是在第一次调用 Update 或 FixedUpdate 方法之前被调用;
- Awake 方法运行在所有 Start 方法之前。
- FixedUpdate, 该函数用于固定更新,在游戏运行的过程中,每一帧的处理时间是不固定的,当我们需要固定间隔时间来执行某些代码时,就会用到该函数。比如:游戏基本物理行为代码的地方。它是执行在Update之前。该函数在默认情况下 每0.02秒调用一次, 具体的时间间隔可以在TimeManager 中配置。 在 Editor -> Project Setting-> Time 中选择 Time Manager 即可配置。
- Update() 只能用在处于激活状态下的脚本,都会在每一帧调用一次 Update()函数 ,用于更新游戏场景和状态
- LateUpdate(),该函数属于延迟更新函数,处于激活状态下的脚本会在每一帧调用 在Update()后,每帧调用一次LateUpdate()。 通常用来调用代码的执行顺序。 比如玩家的角色需要一个摄像机来跟随, 那么通常角色的移动逻辑会写在Update()里。而摄像机跟随在Latelpdate()里, 这样可以确保在角色的位置计算完毕后, 再根据角色位置确定摄像机的位置和视角。
所以说 FixedUpdate() 会先调用,之后是Update(),最后是LateUpdate()
MonoBehaviour常用方法及调用顺序:
-
- public class API01EventFunction : MonoBehaviour
- {
- private void Awake()
- {
- Debug.Log("Awake");
- }
- private void OnEnable()
- {
- Debug.Log("Enable");
- }
- private void Start()
- {
- Debug.Log("Start");
- }
- private void FixedUpdate()
- {
- Debug.Log("FixedUpdate");
- }
- private void Update()
- {
- Debug.Log("Update");
- }
- private void LateUpdate()
- {
- Debug.Log("LateUpdate");
- }
- private void OnApplicationPause(bool pause)
- {
- Debug.Log("OnApplicationPause");
- }
- private void OnDisable()
- {
- Debug.Log("OnDisable");
- }
- private void OnApplicationQuit()
- {
- Debug.Log("OnApplicationQuit");
- }
- private void Reset()
- {
- Debug.Log("Reset");
- }
- private void OnDestroy()
- {
- Debug.Log("OnDestroy");
- }
- }
点击这里了解官方的 GameObject 类详情。
- public class API01EventFunction : MonoBehaviour
- {
- public GameObject prefab;
- private void Start()
- {
- GameObject go = new GameObject("Plane"); //有时候为了组织 Hierarchy 的结构,可以动态创建空物体放置子对象
- go.AddComponent<MeshCollider>(); // 给该物体添加一个组件
- go.transform.position = new Vector3(0, 0, 0); // 重新设置物体的位置
-
- // 该方法常用来实例化 Prefab 或者 克隆另一个游戏物体
- GameObject gg = GameObject.Instantiate(prefab, prefab.transform.position, prefab.transform.rotation) as GameObject;
-
- // 可以动态创建Unity 中内置的几何物体
- GameObject gc = GameObject.CreatePrimitive(PrimitiveType.Plane);
- gc.AddComponent<MeshCollider>();
- gc.name = "Plane1"; // 设置物体的名字
- gc.transform.Translate(new Vector3(0, 0, 0)); // 设置它的物体的位置
- gc.GetComponent<MeshCollider>().enabled = false; // 禁用刚才添加的MeshCollider 组件
- }
- }
- public class API01EventFunction : MonoBehaviour
- {
- public GameObject ob;
- void Start()
- {
- // 通过GameObject或通过它的Component获取到的name都是GameObject的name
- Debug.Log(ob.name);
- Debug.Log(ob.GetComponent<Transform>().name);
- }
- }
public static void Destroy(Object obj, float t = 0.0F);
- GameObject.Destroy : 删除一个游戏对象,组件或者资源 ( 调用后,游戏物体在场景中会立刻被删除,但是还没被回收;在Unity中会把将要销毁的游戏物体放入垃圾池统一管理)。
- 物体 obj 现在被销毁或在指定了t时间过后销毁。如果obj是一个Component,它将从GameObject中删除该组件并将其销毁。如果 obj 是GameObject它将销毁GameObject 以及其组件和全部 transform子物体。实际对象破坏始终延迟到当前Update循环之后,但始终在渲染之前完成。
- public class API01EventFunction : MonoBehaviour
- {
- void DestroyGameObject()
- {
- Destroy(gameObject); // 销毁的是当前脚本所在的游戏物体
- }
-
- void DestroyScriptInstance()
- {
- // 删除当前物体上所在的脚本实例
- Destroy(this);
- }
-
- void DestroyComponent()
- {
- // 删除的是当前脚本所在物体上的该组件
- Destroy(GetComponent<Rigidbody>());
- }
-
- void DestroyObjectDelayed()
- {
- // 在5秒之后删除该脚本所在的游戏物体
- Destroy(gameObject, 5);
- }
-
- // 当用户按下Ctrl键时,它将从游戏对象中销毁 BoxCollider 组件
- void Update()
- {// 当用户按下的是Ctrl键时 , 并且该物体上有 BoxCollider 组件,那么就销毁它
- if (Input.GetButton("Fire1") && GetComponent<BoxCollider>())
- {
- Destroy(GetComponent<BoxCollider>());
- }
- }
- }
点击 这里 进入官网。
public static void DontDestroyOnLoad(Object target);
- GameObject.DontDestroyOnLoad: 加载新场景时,请勿销毁目标对象。
- 默认情况下,重新加载一个新场景会销毁当前场景的所有对象。 调用 Object.DontDestroyOnLoad 可以在重新加载一个新场景加载期间保留原场景下该物体。 如果 参数 object target 是组件或GameObject,Unity还将保留该对象下的所有子对象。 Object.DontDestroyOnLoad 不返回值。 可以使用typeof运算符更改其参数类型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。