U1L0-3——Unity工作原理

反射机制和游戏场景

Unity中的反射机制

Unity引擎本质是一个软件,使用它时它是处于运行中的软件
我们是在一个运行中的软件里制作游戏的,Unity开发的本质就是在Unity引擎的基础上,利用反射和引擎提供的各种功能,进行的拓展开发

反射的概念

程序正在运行时,可以查看其它程序集或者自身的元数据

一个运行的程序查看本身或者其它程序的元数据的行为就叫做反射

在程序运行时,通过反射可以得到其它程序集或者自己程序集中
代码的各种信息,比如类,函数,变量,对象等等
我们可以实例化它们,执行它们,操作它们

场景中对象的本质是什么

GameObject类对象是Unity引擎提供给我们的,作为场景中所有对象的根本
在游戏场景中出现一个对象,不管是图片、模型、音效、摄像机等等都是依附于GameObject对象

拟人化记忆:GameObject就是没有剧本的演员

Transform是什么

GameObject对象作为一个出现在舞台(3D场景)中的演员,必须有一个表示自己所在位置的信息
Transform就是一个必不可少的剧本,它的本质就是发了一本表示位置的剧本给演员
(相当于就是用一个Transform类对象和GameObject类对象进行关联)
用于设置和得到演员在世界中的位置角度缩放等信息

反射机制的体现

除了Transform这个表示位置的标配剧本外,我们可以为这个演员(GameObject)关联各种剧本(C#脚本)
让它按照我们剧本中(代码逻辑中)的命令来处理事情
而为演员添加剧本的这个过程,就是在利用反射new一个新的剧本对象和演员(GameObject)对象进行关联,让其按我们的命令做事。

举例体现

前提:Unity帮助我们实现了对象查找和关联

  1. 修改Inspector面板中Transform的内容

    利用反射已知对象,类名,变量名,通过反射为该对象设置变量

  2. 新建一个脚本后,添加给一个指定的GameObject对象

    利用反射已知类名,可以获取所有公共成员,故可以在Inspector面板上创建各公共字段信息

游戏场景

基本知识点

  1. 游戏场景的保存:ctrl+s

  2. 游戏场景的新建:在Project窗口Assets->Scenew文件夹下创建

  3. 多个游戏场景叠加显示:

    可将多个场景拖到Hierarchy窗口,进行同时渲染(没啥用,最多可以复制两个场景不同的东西)

游戏场景的本质

游戏场景文件,后缀为.unity,它的本质就是一个配置文件
Unity有一套自己识别处理它的机制,但是本质就是把场景对象相关信息读取出来
通过反射来创建各个对象关联各个脚本对象

简单来说:

就是Unity通过读取写入这个场景文件,获取对象信息,在Unity运行时,用C#反射来实例化并编辑对象
这些对象的所有字段(成员变量)、组件,都在场景文件当中
比如下面的MyCube,它本身是一个GameObejct,有一个TransForm组件
这个GameOjbect的m_Name是MyCube
其他字段参考:UnityEngine.GameObject - Unity 脚本 API
也就是说,我们可以直接修改场景文件,修改后Unity会提示你重新加载场景,你的修改就会被体现

image

预设体和资源包的导入导出

预制体

Prefab:预先制作好的的物体,文件后缀prefab,Prefab在Scene当中的所有实例都是一样的

我们可以将在场景当中配置好的物体,拖入到Assets->Prefabs文件夹当中,使得其变为一个预制体(prefab)

image

预制体的本质

我们可以文本形式打开.prefab文件,发现它和场景文件(.unity)文件一样,是一个配置文件。原理同场景文件。

注意:中文在这些配置文件中以Unicode编码体现,所以不能直接查找到中文

Prefab的修改

在Scene窗口修改(添加东西)Prefab之后,在Inspector窗口,选择Overrides

image

image

  • Revert All(重置所有):重置所有预制体实例为初始(本来)状态。
  • Apple All(应用所有):应用修改到所有预制体实例

Open Prefab:在Project双击或者在Inspector Open预制体,打开预制体修改模式,这是用来专门修改预制体的,所有修改都会应用。

UnPack Prefab

选中物体右键后,可以选择UnPack Prefab,解除与预制体的关系。

image

实例物体右键->Prefab

有一些有关于物体的Prefab的操作,比如Select Assets(选中预制体源文件)

导入导出资源包

在Project窗口,右键后可以选择导入(Import Package)导出(Export Package)资源包,资源包文件后缀: .unitypackage

image