离散仿真引擎基础
以下是 3D 游戏编程与设计课程中离散仿真引擎基础章节的作业。
简答题
-
解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系。
-
下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)。
以 Unity 的教学项目「卡丁车」为例:
资源主要是根据类型来组织的,比如脚本文件和场景文件需要分别放置于不同的文件夹中,而存放脚本文件的文件夹又可以进一步细分为系统脚本和 UI 脚本夹等文件夹。
游戏对象的组织具有一定的层次关系,父对象可由子对象组合而成。比如该项目中的卡丁车对象(Kart)由卡丁车车轮(KartWheels)以及其他对象组成。
-
编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件。
基本行为包括 Awake() Start() Update() FixedUpdate() LateUpdate()。
常用事件包括 OnGUI() OnDisable() OnEnable()。
创建 TestMonoBehaviour 脚本文件,然后创建一个空的游戏对象并将脚本添加到该游戏对象中。
// TestMonoBehaviour.cs using UnityEngine; public class TestMonoBehaviour : MonoBehaviour { // This function is always called before any Start functions and also just after a prefab is instantiated. void Awake() { Debug.Log("Awake"); } // This function is called before the first frame update only if the script instance is enabled. void Start() { Debug.Log("Start"); } // This function is called once per frame. void Update() { Debug.Log("Update"); } // This function is often called more frequently than Update. void FixedUpdate() { Debug.Log("FixedUpdate"); } // This function is called once per frame, after Update has finished. void LateUpdate() { Debug.Log("LateUpdate"); } // This function is called multiple times per frame in response to GUI events. void OnGUI() { Debug.Log("OnGUI"); } // This function is called when the behaviour becomes disabled or inactive. void OnDisable() { Debug.Log("OnDisable"); } // This function is called just after the object is enabled. void OnEnable() { Debug.Log("OnEnable"); } }
控制台中出现相应的输出:
在 Inspector 面板中取消勾选该对象,控制台中会出现 OnDisable 的消息:
-
查找脚本手册,了解 GameObject,Transform,Component 对象。
分别翻译官方对三个对象的描述(Description)
-
GameObject:
官方解释:The fundamental object in Unity scenes, which can represent characters, props, scenery, cameras, waypoints, and more. A GameObject’s functionality is defined by the Components attached to it
翻译:游戏对象是 Unity 场景中的基本对象,它能代表角色、道具、风景、摄像头和航点等元素。一个游戏对象的功能由附着在其上的组件决定。
-
Transform:
官方解释:The Transform is used to store a GameObject’s position, rotation, scale and parenting state.
翻译:Transform 用于存储游戏对象的位置、旋转和伸缩的程度,以及(对象树中的)父子关系。
-
Component:
官方解释:Base class for everything attached to GameObjects.
翻译:Component 是所有附着于游戏对象的元素的基类。
描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、table 的部件。本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在查看 Inspector 面板上每一个内容,应该知道其对应的 API。例如:table 的对象是 GameObject,第一个选择框是 activeSelf 属性。
table 的对象是 GameObject,第一个选择框是 activeSelf,用于控制该游戏对象的活动状态。第二个选择框是 static 属性,用于决定游戏对象是否是静态的,同时也可以选择游戏对象在哪一个方面静态。第三个选择框是 Tag,用于选择游戏对象的标签。第四个选择框是 Layer,用于选择对象所在的层。
table 的 Transform 的属性有三个:Position、Rotation 和 Scale,分别用于设置游戏对象的位置、旋转角度和伸缩程度。
table 的部件有:Transform、Cube(Mesh Filter)、Mesh Renderer、Box Collider,以及 Default-Material。
用 UML 图描述 三者的关系。
-
-
资源预设(Prefabs)与 对象克隆 (clone)
预设(Prefabs)有什么好处?
预设可以作为模版,生成多个相同的对象,因此提高了开发效率。
预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
如果在预设中修改了属性,由预设生成的对象也会发生相应的改变;而如果克隆的原对象发生改变,克隆生成的对象不会受影响。
制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
制作 table 预制并创建 InitTable 脚本如下。将脚本拖入新建的空对象的 Inspector 中,然后将 table 预制拖入 Table 属性框中,最后运行游戏即可。
using UnityEngine;
public class InitTable : MonoBehaviour {
public GameObject table;
void Start() {
Instantiate(table, new Vector3(0f, 0f, 0f), Quaternion.identity);
}
}
编程实践,小游戏
游戏内容: 井字棋 或 贷款计算器 或 简单计算器 等等。
技术限制: 仅允许使用 IMGUI 构建 UI。
作业目的:了解 OnGUI() 事件,提升 debug 能力。提升阅读 API 文档能力.
项目代码可见 GitHub。
游戏截图: