为什么最好使用 Awake 和 OnDestroy 而不是构造函数和析构函数?

Ale*_*nko -2 unity-game-engine

我是 Unity 的新手,有我的流程 - 我有一个对象,我需要初始化我的.dll,然后我还需要某个地方来实现我的.dll,所以有 2 个选项(就我而言)来做到这一点

public class Player : MonoBehaviour
{
    Player()
    {
        //1 option for call some INIT methods from .dll
    }

    ~Player()
    {
        //1 option for call some RELEASE methods from .dll
    }

    private void Awake()
    {
        //2 option for call some INIT methods from .dll
    }

    private void OnDestroy()
    {
        //2 option for call some RELEASE methods from .dll
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上,我为此目的使用 constructor + destructor,但根据我遇到的示例,我明白这不是 Unity 中的最佳实践,所以问题是 - 为什么?这里有什么问题?

Tho*_*mas 5

Unity为处理游戏相关事件(加载、更新、物理碰撞...)而不是内存相关事件(构造、销毁)提供了一个生命周期

创建:

您不能GetComponent<T>(...)在构造函数中调用 unity api(例如),因为MonoBehaviours它们只是某个特定的装饰器,GameObject并且GameObject在构造函数运行时无法验证创建是否已完成!

UnityAwake为每个对象只运行一次,当对象创建完成并MonoBehaviour添加所有对象时。

销毁:

此外,由于 c# 提供了开箱即用的内存管理,一旦没有对对象的更多引用(不会在删除最后一个引用后立即调用,即使在调用 时也不会),在不确定的时间点调用对象析构函数IDisposable.Dispose()

Unity的OnDestroy被称为正好当对象被“破坏”,从而成为统一的生命周期无法使用。这是您需要知道的时间点,即您的游戏何时运行。c# 的析构函数在这里完全没用。