离散仿真引擎基础

以下是 3D 游戏编程与设计课程中离散仿真引擎基础章节的作业。

简答题

  1. 解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系。

    • 两者的区别:

      游戏对象是 Unity 中的基本对象,可通过与组件(Component)的结合创建出场景中的角色、道具或风景。一个游戏对象相当于一个容器,可装入多个组件。

      资源是在游戏或其他项目中可以使用的素材,包括 3D 模型、声音、字体和图像等可以从外部引入的文件,也包括动画控制器和渲染纹理等可以在 Unity 中创建的素材。

    • 两者的联系:

      资源可以为游戏对象所用(比如为一个物体添加纹理),游戏对象也可以用于创建资源(通过预制件)。

  2. 下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)。

    以 Unity 的教学项目「卡丁车」为例:

    资源主要是根据类型来组织的,比如脚本文件和场景文件需要分别放置于不同的文件夹中,而存放脚本文件的文件夹又可以进一步细分为系统脚本和 UI 脚本夹等文件夹。

    游戏对象的组织具有一定的层次关系,父对象可由子对象组合而成。比如该项目中的卡丁车对象(Kart)由卡丁车车轮(KartWheels)以及其他对象组成。

  3. 编写一个代码,使用 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 的消息:

  4. 查找脚本手册,了解 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 图描述 三者的关系。

  5. 资源预设(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

游戏截图:

Updated: