当前位置:   article > 正文

Unity3D中API常用方法和类详细讲解(事件函数、GameObject类、MonoBehaviour 类)_unity 通过事件获取class

unity 通过事件获取class

下图是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常用方法及调用顺序:

  1. public class API01EventFunction : MonoBehaviour
  2. {
  3. private void Awake()
  4. {
  5. Debug.Log("Awake");
  6. }
  7. private void OnEnable()
  8. {
  9. Debug.Log("Enable");
  10. }
  11. private void Start()
  12. {
  13. Debug.Log("Start");
  14. }
  15. private void FixedUpdate()
  16. {
  17. Debug.Log("FixedUpdate");
  18. }
  19. private void Update()
  20. {
  21. Debug.Log("Update");
  22. }
  23. private void LateUpdate()
  24. {
  25. Debug.Log("LateUpdate");
  26. }
  27. private void OnApplicationPause(bool pause)
  28. {
  29. Debug.Log("OnApplicationPause");
  30. }
  31. private void OnDisable()
  32. {
  33. Debug.Log("OnDisable");
  34. }
  35. private void OnApplicationQuit()
  36. {
  37. Debug.Log("OnApplicationQuit");
  38. }
  39. private void Reset()
  40. {
  41. Debug.Log("Reset");
  42. }
  43. private void OnDestroy()
  44. {
  45. Debug.Log("OnDestroy");
  46. }
  47. }

unity 中的 GameObject 类

 


创建游戏物体的三种方法


点击这里了解官方的 GameObject 类详情。

  1. public class API01EventFunction : MonoBehaviour
  2. {
  3. public GameObject prefab;
  4. private void Start()
  5. {
  6. GameObject go = new GameObject("Plane"); //有时候为了组织 Hierarchy 的结构,可以动态创建空物体放置子对象
  7. go.AddComponent<MeshCollider>(); // 给该物体添加一个组件
  8. go.transform.position = new Vector3(0, 0, 0); // 重新设置物体的位置
  9. // 该方法常用来实例化 Prefab 或者 克隆另一个游戏物体
  10. GameObject gg = GameObject.Instantiate(prefab, prefab.transform.position, prefab.transform.rotation) as GameObject;
  11. // 可以动态创建Unity 中内置的几何物体
  12. GameObject gc = GameObject.CreatePrimitive(PrimitiveType.Plane);
  13. gc.AddComponent<MeshCollider>();
  14. gc.name = "Plane1"; // 设置物体的名字
  15. gc.transform.Translate(new Vector3(0, 0, 0)); // 设置它的物体的位置
  16. gc.GetComponent<MeshCollider>().enabled = false; // 禁用刚才添加的MeshCollider 组件
  17. }
  18. }

Unity3D 中 GameObject、Component、和Object的关系

 


  1. public class API01EventFunction : MonoBehaviour
  2. {
  3. public GameObject ob;
  4. void Start()
  5. {
  6. // 通过GameObject或通过它的Component获取到的name都是GameObject的name
  7. Debug.Log(ob.name);
  8. Debug.Log(ob.GetComponent<Transform>().name);
  9. }
  10. }

使用 GameObject.Destroy 销毁游戏对象、一个组件


public static void Destroy(Object obj, float t = 0.0F);
  • GameObject.Destroy : 删除一个游戏对象,组件或者资源 ( 调用后,游戏物体在场景中会立刻被删除,但是还没被回收;在Unity中会把将要销毁的游戏物体放入垃圾池统一管理)。
  •   物体 obj 现在被销毁或在指定了t时间过后销毁。如果obj是一个Component,它将从GameObject中删除该组件并将其销毁。如果 obj 是GameObject它将销毁GameObject 以及其组件和全部 transform子物体。实际对象破坏始终延迟到当前Update循环之后,但始终在渲染之前完成。
  1. public class API01EventFunction : MonoBehaviour
  2. {
  3. void DestroyGameObject()
  4. {
  5. Destroy(gameObject); // 销毁的是当前脚本所在的游戏物体
  6. }
  7. void DestroyScriptInstance()
  8. {
  9. // 删除当前物体上所在的脚本实例
  10. Destroy(this);
  11. }
  12. void DestroyComponent()
  13. {
  14. // 删除的是当前脚本所在物体上的该组件
  15. Destroy(GetComponent<Rigidbody>());
  16. }
  17. void DestroyObjectDelayed()
  18. {
  19. // 在5秒之后删除该脚本所在的游戏物体
  20. Destroy(gameObject, 5);
  21. }
  22. // 当用户按下Ctrl键时,它将从游戏对象中销毁 BoxCollider 组件
  23. void Update()
  24. {// 当用户按下的是Ctrl键时 , 并且该物体上有 BoxCollider 组件,那么就销毁它
  25. if (Input.GetButton("Fire1") && GetComponent<BoxCollider>())
  26. {
  27. Destroy(GetComponent<BoxCollider>());
  28. }
  29. }
  30. }

使用 GameObject.DontDestroyOnLoad 加载新场景时,不要销毁其目标对象


 点击 这里 进入官网。

public static void DontDestroyOnLoad(Object target);
  • GameObject.DontDestroyOnLoad: 加载新场景时,请勿销毁目标对象。
  • 默认情况下,重新加载一个新场景会销毁当前场景的所有对象。 调用 Object.DontDestroyOnLoad 可以在重新加载一个新场景加载期间保留原场景下该物体。 如果 参数 object target 是组件或GameObject,Unity还将保留该对象下的所有子对象。 Object.DontDestroyOnLoad 不返回值。 可以使用typeof运算符更改其参数类型。

 


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/108047
推荐阅读
相关标签
  

闽ICP备14008679号