[Unity3D] 理解Unity3D是如何运行脚本的

Q : unity3D里面的脚本编写是什么样的原理?运行起来是怎么样的呢?

脚本的运行是什么原理?
比如说,编写一个c#脚本,在update()中写个destroy(gameobject,3.0f)的函数,保存c#脚本,在unity场景中建个cube,然后cube添加刚才新建的脚本,运行时cube就会消失,这是为什么呢?
望各位大牛指导一下!
(ps:我觉得学习一样东西要从本质开始学起……)

ANS1 :

我从两个方面来回答:
  第一、Unity引擎的脚本继承自MonoBehaviour,所以你在这个脚本中可以使用Awake、Start、Update、FixedUpdate等等函数,这些函数构成了Unity中每一个GameObject的生命周期,关于这些函数的作用及其运行顺序,你可以自己通过搜索引擎来了解,我想说的是,这些函数都是在Unity引擎(使用C++开发)中定义的,通过反射或者类似反射的技术,Unity让脚本中的函数和引擎对应起来,所以你可以通过这种方式来为Unity编写脚本,所有继承自MonoBehaviour的脚本都需要附着在GameObject上方能够生效,脚本可以作为一种特殊的组件附着在GameObject上,这是Unity的组件化设计风格,所以每个GameObject的逻辑都能够实现独立。
  第二,关于问题中提及的两个方法,Update方法表示每一帧都运行,游戏开发你必须要理解这个概念,因为你执行了Destroy方法,该方法将销毁当前一个物体,所以实际上你在第一帧销毁自身以后,这个物体的生命周期就结束了,具体表现就是它从场景里消失了,当物体消失时它附着的脚本从此失去作用,希望你能够尽快理解这些内容!

作者:飞鸿踏雪
链接:https://www.zhihu.com/question/46838523/answer/105134483

ANS2 :

  想了解unity脚本系统的话建议您可以参考下lua脚本嵌入游戏系统的相关资料。国内很流行使用lua脚本来扩展游戏逻辑的编写,应该比较容易查到。一个典型的例子是cocos2d-x引擎的lua绑定,题主可以去看看。
  unity引擎底层也是c++的,通过把mono虚拟机整合到引擎中,然后使用互操作(Interop)手段,把C++中的类和方法暴露给C#语言,这样您在C#代码中调用相应的函数,就可以使底层的C++模块执行相应的行为。您在unity3d官方的api文档中看到的为数众多的类,其中很大一部分,底层都是在执行C++的代码。
  除了这个之外还有另一种,就是Event Function。官方的API文档中当提及Event Function时会给出一个专门的分类,叫”Messages”。比如最典型的MonoBehaviour类里提供了大量的message供您去实现,其中包括我们最熟悉的Start和Update。Event Function是unity3d中的一种特殊的回调,它们是在游戏主循环执行过程中某个特定的时机被调用的,这样作为脚本扩展者,就可以在引擎执行过程中的这个时机插入自己想要执行的行为。具体每个Event Function在哪个时机可以参考unity3d官方手册:Unity - Manual: Execution Order of Event Functions
  您举例的这个事情,实际上是在Update这个时机,引擎会执行您的Destroy(this.gameObject, 3.0f),于是您在参数中传入的这个gameObject在3秒后就会被销毁。而您眼中所见的那个Cube模型,本身也是寄宿同一个GameObject上的一个模型渲染组件,它的作用是让您的Cube模型得以显示。当您销毁掉GameObject的时候,所有它挂载的组件也都会被销毁,所以自然而然Cube也就消失了。

作者:迷途吧
链接:https://www.zhihu.com/question/46838523/answer/105146427