unity中的原生对象与托管对象
序
最初在工作中接触到引擎原生层相关的问题,是项目实现的延时执行模块,模块提供接口来进行委托的延时调用:
// 返回一个token用于后续的CancelDelayCall
m_DelayExecuteGuidance = GameFacade.CurrentGame.DelayCall(8.0f, OnPlayerGuideFinished);
// 延时执行的代码示例
private void OnPlayerGuideFinished()
{
// 作为MonoBehaviour的成员方法,访问gameObject
Debug.Log(gameObject.name);
// something else...
}
延时执行模块与协程不同,不会因为gameObject的销毁而取消执行,假设在指定的8s后,组件绑定的gameObject已经销毁,那么试图在访问时就会产生这样的报错:

可以看到延时模块仍然保留了对MonoBehaviour的引用,但在试图通过property访问gameObejct的时候发生了报错,且提示代码位置为“managed-to-native”,体现了本文的主体:引擎的托管(managed)代码对原生(native)代码的访问,下面我们就集中介绍Unity引擎中的原生对象与托管对象。