Unity3D中API常用方法和类详细讲解(事件函数、GameObject类、MonoBehaviour 类)

下图是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");
    }
}

unity 中的 GameObject 类

 


创建游戏物体的三种方法


点击这里了解官方的 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 组件
    }
}

Unity3D 中 GameObject、Component、和Object的关系

 


public class API01EventFunction : MonoBehaviour
{
    public GameObject ob;
    void Start()
    {
        //  通过GameObject或通过它的Component获取到的name都是GameObject的name
        Debug.Log(ob.name);
        Debug.Log(ob.GetComponent<Transform>().name);
    }
}

使用 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循环之后,但始终在渲染之前完成。
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>());
        }
    }
}

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


 点击 这里 进入官网。

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

 


GameObject.FindObjectOfType 和  GameObject.FindObjectsOfType 来查找到挂载特定类型组件的游戏对象


public sta
  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值