02-离散仿真引擎基础
Homework02
简答题
1. 解释游戏对象(GameObjects)
和资源(Assets)
的区别与联系
- 区别:
游戏对象
是具有一定属性与功能的类的实体化,对应为Unity中具有对应职能与属性的组件,例如游戏中常见的玩家、怪物等;资源
是预先准备好的模型、图片、音乐等,可以直接并重复使用 - 联系:
资源
可以添加到游戏对象
作为其一部分,而游戏对象
可以保存作为一种资源
以便捷地重复使用
2. 下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
从资源网站下载
愤怒的小鸟
、赛车游戏
、保龄球
、台球
资源后分析总结如下,以愤怒的小鸟
为例
资源目录组织结构一般包含Animation(动画)
、Matreias(材料)
、Prefab(预制)
、Scene(场景)
、Scripts(脚本-即C#代码)
、Sprites(精灵-即对象)
游戏对象树层次结构一般包含Camera(摄像头)
、Background(背景)
、Light(灯光)
和一些自定义对象
等等
3. 编写一个代码,使用debug语句来验证MonoBehaviour基本行为或事件触发的条件
- 基本行为包括 Awake()、Start()、Update()、FixedUpdate()、LateUpdate()
- 常用事件包括 OnGUI()、OnDisable()、OnEnable()
编写代码如下并将其添加到
Main Camera
,点击运行结果见下图:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class test : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Debug.Log("Start");
}
// Update is called once per frame
void Update()
{
Debug.Log("Update");
}
void Awake()
{
Debug.Log("Awake");
}
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()
在脚本实例被加载时即被调用Start()
仅在Update函数第一次被调用前调用Update()
每一帧触发一次FixedUpdate()
在自设定的帧频下,每一帧触发一次LateUpdate()
当Behaviour是enabled的情况下,在所有Update函数调用后被调用OnGUI()
当渲染和处理GUI事件时被调用OnDisable()
当行为变得无效的时候被调用OnEnable()
当对象启用并激活的时候被调用
4. 查找脚本手册,了解GameObject,Transform,Component对象
- 分别翻译官方对三个对象的描述(Description)
GameObject
: Unity场景中所有实体的基类Transform
: 物体的位置,选择角度及比例Component
: 所有附加在GameObject上的事物的基类
-
描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、table 的部件
- 本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API。
- 例如:table 的对象是 GameObject,第一个选择框是 activeSelf 属性。
table 对象(实体)的属性
: 红框框住的五个为对象属性,从左到右、从上到下依次为sctiveSelf
-该对象是否显示/渲染、table
-为当前对象名称,可自定义、Static
-选中表示该对象为静态,运行时不移动、Tag
-对象的标签,可用于分类、Layer
-对象的层,通常被摄像机用来渲染部分场景,和灯光照射部分场景使用table 的 Transform 的属性
:Position
-位置、Rotation
-旋转角度、Scale
-缩放比例table 的部件
: 本示例对象含有Transform
、Cube
、Mesh Renderer
、Box Colloder
等部件,可以通过Add Component
按钮添加或右键删除
- 用UML图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
5. 资源预设(Prefabs)与对象克隆(clone)
- 预设(Prefabs)有什么好处?
预设有利于资源重用,减少工作量。当需要重复用到一个对象或一组数据时,我们可以预设一个对象作为模板,就可以很方便的重复使用。所以无论工程中有多少个实例,当我们对预设做出更改时,这些更改会运用与所有实例,这就使得游戏制作起来更加高效和便捷(类似宏定义)
- 预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
预设
:产生的对象与预设的对象是联系的,当修改预设时,它产生出来的对象也会被修改,类似与指针。克隆
:克隆体和母体之间是独立的,相互不干扰,类似于C++中的值拷贝。
- 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
如下图,参考课件步骤制作好table后将其拖进
Assets
则会自动生成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 temp = (GameObject)Instantiate(table, transform.position, transform.rotation);
temp.name = "instance";
}
// Update is called once per frame
void Update()
{
}
}
将
createTable
添加到Main Camera
,并把之前做好的table预制拖入选择框
点击运行效果如下:
编程实践
实现了井字棋小游戏,由于篇幅原因,详见此博客
思考题
1. 微软XNA引擎的Game对象屏蔽了游戏循环的细节,并使用一组虚方法让继承者完成它们,我们称这种设计为“模板方法模式”。
- 为什么是“模板方法”模式而不是“策略模式”呢?
模板方法模式
:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。策略模式
:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。强调的是内部变化与外部的分离,降低耦合度。- 模板方法模式更适合屏蔽游戏循环细节这种有多个子类共有的方法,且逻辑相同的场景
2. 将游戏对象组成树型结构,每个节点都是游戏对象(或数)。
- 尝试解释组合模式(Composite Pattern / 一种设计模式)。
- 定义:组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
- 关键点:树枝和叶子实现统一接口,树枝内部组合该接口。
- 优点:高层模块调用简单、节点*增加
- 缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
- 适用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。
- 使用 BroadcastMessage() 方法,向子对象发送消息。你能写出 BroadcastMessage() 的伪代码吗?
void BoradcastMessage(string message) {
foreach (child) {
Debug.Log(message);
}
}
3. 一个游戏对象用许多部件描述不同方面的特征。我们设计坦克(Tank)游戏对象不是继承于GameObject对象,而是GameObject添加一组行为部件(Component)。
- 这是什么设计模式?
桥接模式(Bridge)
- 为什么不用继承设计特殊的游戏对象?
- 继承容易导致类与类之间结构混乱
- 继承具有较高的耦合度、灵活性不高,父类游戏对象发生改变时子类也会跟着变
- 桥接模式更有利于统一各组件的接口,管理不同类相同行为组件的属性,又不会导致组合爆炸。
- 桥接模式耦合度低,当部分功能被修改时,不会影响到外部其他部件的功能。
本文地址:https://blog.csdn.net/try17875864815/article/details/108587071
上一篇: python如何运行js语句
下一篇: 西班牙巴塞罗那之行5个免费去处
推荐阅读