【3D游戏编程与设计】离散仿真引擎基础 - 作业

简答题

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)

  • 为什么不用继承设计特殊的游戏对象?

继承一旦变多,管理困难,十分冗杂,而且修改父类代码时子类也会随之修改,但是装饰模式可以在不改变接口的前提下,动态扩展对象的功能,十分灵活。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值