3D Computer Game Programming-Note 2

1、简答题

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

  游戏对象(GameObjects)是游戏程序空间中的事物,可以是空对象、2D/3D对象、光线、摄像机等,用于表示人物、道具、风景等。游戏对象本身不能做任何事情,需要通过赋予其属性才能成为角色、环境或特殊效果。
  资源(Assets)是构造游戏对象、装饰游戏对象、配置游戏等的物体和数据,可以是来自 Unity 外部创建的文件,如音频文件、图像等,也可以是 Unity 创建的文件,如渲染纹理等。
  联系:资源可以实例化为具体的游戏对象,也可以成为游戏对象的属性;游戏对象可以整合多种资源,也可以被预设为资源。


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

  访问 Unity Asset Store 可以下载喜欢的项目,下面以卡丁车游戏为例:

Unity-离散仿真引擎基础 - 图1

  案例资源的目录组织结构如下:

  Unity-离散仿真引擎基础 - 图2

  可以看到,资源按照类型来组织目录的,例如在 Karting 目录下,资源根据动画、声音、预制、脚本等不同类型来组织。

  案例主场景中游戏对象树的层次结构如下:

  Unity-离散仿真引擎基础 - 图3

  由于案例对象数目过多,此处不展开所有层次讨论。从一二级对象可以看到,对象之间既有互相独立的,也有按照层次关系组合的。比如游戏管理器包括游戏菜单、游戏结果显示等子对象。


  • 编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件。
    • 基本行为包括 Awake()、Start()、Update()、FixedUpdate()、LateUpdate()
    • 常用事件包括 OnGUI()、OnDisable()、OnEnable()

  根据 Unity API 手册编写脚本 Test.cs:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Test : MonoBehaviour
  5. {
  6. void Awake()
  7. {
  8. Debug.Log("Awake!");
  9. }
  10. void Start()
  11. {
  12. Debug.Log("Start!");
  13. }
  14. void Update()
  15. {
  16. Debug.Log("Update!");
  17. }
  18. void FixedUpdate()
  19. {
  20. Debug.Log("FixedUpdate!");
  21. }
  22. void LateUpdate()
  23. {
  24. Debug.Log("LateUpdate!");
  25. }
  26. void OnGUI()
  27. {
  28. Debug.Log("OnGUI!");
  29. }
  30. void OnDisable()
  31. {
  32. Debug.Log("OnDisable!");
  33. }
  34. void OnEnable()
  35. {
  36. Debug.Log("OnEnable!");
  37. }
  38. }

  创建一个空对象 GameObject,将 Test.cs 添加为 GameObject 的部件,运行测试,控制台输出如下:

  Unity-离散仿真引擎基础 - 图4

  Unity-离散仿真引擎基础 - 图5

  其中,事件 OnEnable() 和 OnDisable() 通过点击 GameObject 的 checkbox 触发。


  • 查找脚本手册,了解 GameObject,Transform,Component 对象
    • 分别翻译官方对三个对象的描述(Description)

     GameObject:Unity 场景中所有实体的基类。
     Transform:对象的位置、旋转和比例。
     Component:所有属于 GameObject 的事物的基类。

  • 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、table 的部件

  Unity-离散仿真引擎基础 - 图6

  查看图中 Inspector 面板可以知道:
  table 的对象是 GameObject,第一个选择框是 activeSelf 属性,文本框是对象名称,第二个选择框及下拉菜单是 Static GameObjects 属性;第二行包括 Tag 属性(标记对象状态)和 Layer 属性(标记对象层级);第三行是 Prefabs 属性(对应预制的属性)。
  table 的 Transform 的属性包括 Position(设置对象的 x、y、z 坐标)、Rotation(设置对象绕 x、y、z 轴的旋转角度) 和 Scale(设置对象在 x、y、z 轴上的大小的比例)
  table 的部件包括 Transform、Mesh Filter、Box Colider 和 Mesh Renderer。

  • 用 UML 图描述三者的关系

  Unity-离散仿真引擎基础 - 图7


  • 资源预设(Prefabs)与对象克隆(clone)

    • 预设(Prefabs)有什么好处?
        预设可以将特殊配置的对象打包,然后在场景中的多个位置或项目中的多个场景中重复使用,这样可以避免大量重复的创建和配置工作,同时当由预设实例化的对象需要改动时,只需要改动预设而不需要逐一改动所有对应的对象。

    • 预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
        预设是从一个模板实例化出对象,改动预设时所有由该预设实例化出的对象都会相应地改动,而克隆则是从一个现有对象复制出另一对象,对象之间相互独立,互不影响。

    • 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
        table 预制的制作流程参见 Unity课堂实验杂记——预制,创建脚本 Instantiate.cs,编写如下代码: ```csharp using System.Collections; using System.Collections.Generic; using UnityEngine;

    public class Instantiate : MonoBehaviour {

    1. void Start() {
    2. GameObject Table = Resources.Load("Table") as GameObject;
    3. Instantiate(Table);
    4. }

    } ```

  运行结果:
Unity-离散仿真引擎基础 - 图8

  通过这种方式可以直接由脚本实例化游戏对象,而不需要将预制逐一拖入每个属性框中,当实例化的对象种类非常多时由脚本直接实例化对象无疑是更便捷的方式。

2、编程实践

  实现小游戏:🔗井字棋

注:所有代码均已上传至 github ✈️传送门