Unity如何在脚本中调用“update()”?

我知道你可以将你的C ++代码暴露给像ChaiScript这样的脚本语言。 从这里你可以调用你在C ++中创建的代码。 但是,在Unity中,它们在脚本中具有函数,例如Update()被调用。 换句话说,我如何从C ++调用脚本函数?

脚本语言经常公开一组API函数,允许你检查和确定一个加载脚本的属性,在你的情况下定义了什么函数。 这自然会因脚本语言而异,并且还取决于您的本地语言与脚本语言绑定。

例如在Lua中,我可以加载一个脚本,然后检查是否声明了一个特定的函数。 我经常为Update()和其他方法做到这一点,所以如果定义的话,我会创建一个映射,然后在游戏模拟过程中调用那些重载callback的脚本。

在Unity的情况下,他们的MonoBehavior是他们MonoBehavior的一个契约,他们只是想看看你是否覆盖了契约中的特定函数,如果是,那么在模拟游戏的适当时候调用callback函数。

Unity使用自己的消息系统来调用Update等方法。 你也可以使用它,例如Component.SendMessage 。

我认为消息系统的底层实现使用某种forms的reflection来确定一个类有什么方法,并调用相应的方法。

( 这篇文章的答案更好地解释了它 )

C++C#可以很容易地交互。 (在实践中,C ++相对于名称修改的问题往往迫使有一个中间的C层)

有几个资源你可以看看,如本地插件上的Mono P / Invoke docs和unity docs。

C++代码调用C#函数就像使用函数指针一样( C#委托可以用这种方式编组)。


关于Unity如何处理callback,这是另一个问题。 我不知道确切的底层实现,但像Update这样的大多数MonoBehaviours钩子都不是虚拟抽象方法,也没有实现任何接口。

为什么? 不知道,我经常问自己为什么(老实说,我更喜欢更像一个接口像ISerializationCallbackReceiver更明确的方法)。

关于如何在函数指针和C#方法之间进行绑定,可能会创建一个委托实例。 SendMessage和Update之间的问题是非常不同的。

我猜Unity会被迫为SendMessage使用Reflection,因为方法名只在运行时才知道。 仔细使用它,因为reflection真的很贵。

对于其他更新,开始等。问题更简单,因为方法名称,签名和目标对象都知道。 所以昂贵的绑定过程只能在初始化中使用一次。 这是一篇不错的文章 。