简答题
1. 解释:游戏对象(GameObjects)和资源(Assets)的区别与联系。
-
区别:游戏对象是一个能够容纳实现实际功能的组件。游戏对象本身不做任何事情。它们需要特殊属性 (special properties) 才能成为一个角色、一种环境或者一种特殊效果。每个对象要做很多不同的事情,有专有属性。
资源是可以在游戏或项目中使用的任何项的表示,也是在游戏中可能用到的各种资源、素材,比如模型、声音、图片文件等等。
-
联系:资源可作为模板,实例化成具体的游戏对象,也可以作为游戏对象中的某种属性,同时也可以被多个游戏对象同时使用。
2. 下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
在GitHub上在下载了几个简单的小游戏,比如简单跑酷游戏,在对比观察之后发现:
资源的目录组织结构主要包括动画,预制,场景、脚本等,并将其按照文件的类型分配到不同的文件夹以便管理。
游戏对象树的层次结构包括游戏环境的设置(如摄像机,开始位置,场景等等)、游戏的控制、玩家以及目标等。
3. 编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件()
- 基本行为包括 Awake() Start() Update() FixedUpdate() LateUpdate()
- 常用事件包括 OnGUI() OnDisable() OnEnable()
首先,新建一个游戏对象,将以下内容的脚本挂在其上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
void Awake() {
Debug.Log("Awake");
}
void Start() {
Debug.Log("Start");
}
void Update() {
Debug.Log("Update");
}
void FixedUpdate() {
Debug.Log("FixedUpdate");
}
void LateUpdate() {
Debug.Log("LateUpdate");
}
void OnGUI() {
Debug.Log("OnGUI");
}
void OnDisable() {
Debug.Log("OnDisable");
}
void OnEnable() {
Debug.Log("OnEnable");
}
}
运行结果
事件 | 执行条件 |
---|---|
Awake | 当一个脚本实例被载入时Awake被调用,或者脚本构造时调用 |
Start | 第一次进入游戏循环时调用 |
Update | 所有 Start 调用完后,被游戏循环调用 |
FixedUpdate | 每个游戏循环,由物理引擎调用 |
LateUpdate | 所有 Update 调用完后,被游戏循环调用 |
OnGUI | 游戏循环在渲染过程中,场景渲染之后调用 |
OnDisable | 当对象变为不可用或非激活状态时被调用 |
OnEnable | 当对象变为可用或激活状态时被调用 |
4. 查找脚本手册,了解 GameObject,Transform,Component 对象
- 分别翻译官方对三个对象的描述(Description)
GameObject : Base class for all entities in Unity Scenes.
GameObject: Unity场景中所有实体的基类
Transform : Position, rotation and scale of an object.
Transform: 对象的位置,旋转和缩放
Component : Base class for everything attached to GameObjects.
Component :所有附加到GameObjects的基类。
-
描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件(本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API。)
Inspector 面板上从上到下- table 对象的属性:sctiveSelf表示该对象是否显示、渲染;当前对象名称;Static签名的方框选中表示该对象为静态,运行时不移动;Tag标签,为untagged;Layer对象的层,为default;prefabs表示预设,为选中,翻转和应用。
- Transform 的属性:分别是位置、旋转角度和缩放大小
- 下面的是table 的部件,有Mesh Filter、Box Collider、Mesh Renderer,可以通过最下面的Add Component添加
-
用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
5. 资源预设(Prefabs)与 对象克隆 (clone)
- 预设(Prefabs)有什么好处?
可以将经常用到的对象做成一个模板,这样可以被置入多个场景中,也可以在一个场景中多次置入,减少了工作量,不需要反复去重新设置对象,而且只要预设原型发生改变,所有的实例都会产生变化,适合批量处理。
- 预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
克隆是对已经存在的游戏对象或预设进行复制,克隆体和被克隆体之间是独立的,不会互相影响。而预设是实例和预设的对象是惠相互影响的,当修改预设时,实例也会被修改,预设应该是在克隆之前的,预设的对象才能被不断克隆。
- 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
首先,按照课程网页的教程制作一个table预制
将 table 预制资源实例化成游戏对象
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CreateTable : MonoBehaviour
{
public GameObject Table;
// Start is called before the first frame update
void Start()
{
GameObject instance = (GameObject)Instantiate(Table, transform.position, transform.rotation);
}
}
将脚本拖放到main camera上,点运行
编程实践,小游戏
思考题
1. 微软 XNA 引擎的 Game 对象屏蔽了游戏循环的细节,并使用一组虚方法让继承者完成它们,我们称这种设计为“模板方法模式”。
- 为什么是“模板方法”模式而不是“策略模式”呢?
模板方法模式的主要思想:定义一个算法流程,将一些特定步骤的具体实现、延迟到子类。使得可以在不改变算法流程的情况下,通过不同的子类、来实现“定制”流程中的特定的步骤。
策略模式的主要思想:使不同的算法可以被相互替换,而不影响客户端的使用。
模板方法模式更适合多个子类有公有的方法,并且逻辑基本相同的情况。
2. 将游戏对象组成树型结构,每个节点都是游戏对象(或数)。
- 尝试解释组合模式(Composite Pattern / 一种设计模式)。
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
- 使用 BroadcastMessage() 方法,向子对象发送消息。你能写出 BroadcastMessage() 的伪代码吗?
BroadcastMessage(){
FOR childObject IN ObjectTree
sendMessage();
}
3.一个游戏对象用许多部件描述不同方面的特征。我们设计坦克(Tank)游戏对象不是继承于GameObject对象,而是 GameObject 添加一组行为部件(Component)。
- 这是什么设计模式?
装饰模式(Decorator Pattern)
- 为什么不用继承设计特殊的游戏对象?
继承一旦变多,管理困难,十分冗杂,而且修改父类代码时子类也会随之修改,但是装饰模式可以在不改变接口的前提下,动态扩展对象的功能,十分灵活。