课程网址:离散仿真引擎基础
以下是作业内容:
1、简答题
-
解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系。
- 游戏对象(GameObject)
游戏对象(GameObject)是游戏资源的容器,可以构成游戏的一切,如场景、物品、人物等,是在游戏运行时动态创建的。 - 资源(Assets)
资源(Assets)指的是在游戏中可能用到的各种数据,比如模型、声音、贴图文件等等,是磁盘上真实的文件。 - 两者之间的联系
资源可以为游戏对象的创建提供必要的条件,游戏对象的创建离不开资源,如行为需要脚本控制,贴图需要有资源的图片文件。
- 游戏对象(GameObject)
-
下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
由于网络原因,此项暂且放弃 -
编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件
- 基本行为包括 Awake() Start() Update() FixedUpdate() LateUpdate()
- 常用事件包括 OnGUI() OnDisable() OnEnable()
编写代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MyMonoBehaviourTestScript : MonoBehaviour { private void Awake() { Debug.Log("Awake"); } void Start () { Debug.Log("Start"); } void Update () { Debug.Log("Update"); } private void FixedUpdate() { Debug.Log("FixedUpdate"); } private void LateUpdate() { Debug.Log("LateUpdate"); } private void OnGUI() { Debug.Log("OnGUI"); } private void OnDisable() { Debug.Log("OnDisable"); } private void OnEnable() { Debug.Log("OnEnable"); } }
执行后发现:
Awake 当一个脚本实例被载入时Awake被调用。或者脚本构造时调用
Start 第一次进入游戏循环时调用
FixUpdate 每个游戏循环,由物理引擎调用
Update 所有 Start 调用完后,被游戏循环调用
LastUpdate 所有 Update 调用完后,被游戏循环调用
OnGUI 游戏循环在渲染过程中,场景渲染之后调用 -
查找脚本手册,了解 GameObject,Transform,Component 对象
-
分别翻译官方对三个对象的描述(Description)
GameObject:Base class for all entities in Unity Scenes.
游戏对象:统一场景中所有实体的基类。Transform: Position, rotation and scale of an object.
变换:物体的位置、旋转和缩放。Component:Base class for everything attached to GameObjects.
组件:附加到gameobjects的所有内容的基类。 -
描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件
- 本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API。
- 例如:table 的对象是 GameObject,第一个选择框是 activeSelf 属性。
??? 没有图,以后再写。
- 用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
- 资源预设(Prefabs)与 对象克隆 (clone)
- 预设(Prefabs)有什么好处?
预设资源用作模板,从中可以在场景中创建新的预设实例。并且当预设模板改变时会同时应用于所有使用该预设的游戏对象。 - 预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
克隆是将场景中已有的对象复制一份,克隆的对象和与原有对象独立,预设是创建对象的模板,创建对象后预设改变,使用该预设的对象也会改变。 - 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
using System.Collections; using System.Collections.Generic; using UnityEngine; public class InitBeh : MonoBehaviour { // Use this for initialization void Start () { Object t = Resources.Load("table"); GameObject table = Instantiate(t) as GameObject; }
- 预设(Prefabs)有什么好处?
-
2. 编程实践,小游戏
见github井字棋游戏
3. 思考题
-
微软 XNA 引擎的 Game 对象屏蔽了游戏循环的细节,并使用一组虚方法让继承者完成它们,我们称这种设计为“模板方法模式”。
-
为什么是“模板方法”模式而不是“策略模式”呢?
“模板方法”模式是指定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
“策略模式”是指定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
微软 XNA 引擎的 Game 对象定义了具体的运行流程,如start、fixupdate、update等,需要做的只是重载这些预定义好的方法,所以是模板方法模式,策略模式是指有多种策略,每个策略的具体流程可能不同,通过策略的继承来实现。
-
-
将游戏对象组成树型结构,每个节点都是游戏对象(或数)。
-
尝试解释组合模式(Composite Pattern / 一种设计模式)。
组合模式是指将对象组合成树形结构以表示 “部分-整体” 的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
组合模式(Composite Pattern) 也称为 整体-部分(Part-Whole)模式,它的宗旨是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户对单个对象和组合对象的使用具有一致性。
组合模式的核心是借助同一接口,使叶子节点和树枝节点的操作具备一致性。 -
使用 BroadcastMessage() 方法,向子对象发送消息。你能写出 BroadcastMessage() 的伪代码吗?
for object in subObjects: sendMessage(object)
-