1、简答题
- 解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系。
- 两者之间的区别:
- 游戏对象(GameObjects):游戏中的每一个对象都是一个游戏对象。他们本身不会做任何事情,我们赋予他们各自的属性之后,就成为了我们在游戏中看到的角色或环境等。例如我们设置的玩家,关卡等他们都属于游戏对象,我们通过给他们添加各种属性火环境,让他们成为游戏对象。可以将游戏对象看成是一个空容器,我们向其加入其中的组件和赋予其的属性后,它变得与其他游戏对象不同。
- 资源(Assert):资源指的是项目中的素材,包括我们的音频,图片,图片,图像,脚本文件,材质,场景,动作资源等。资源可以导入游戏的程序项目中,之后被项目提供原材料,被添加到游戏对象上去。
- 两者之间的联系:
- 资源通过导入游戏内可以被加到游戏对象上,配合游戏对象完成相应的设计。同时资源可以组件或者整个游戏对象创建游戏实例。
- 2.下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
- 资源结构:资源通过一定的分类能够分成很多种种类,在游戏案例中,一般存在模型,音频,动画,脚本代码,预设,模型等。这些东西分别设立不同的文件夹,并且由于种类对应相应的名字。
- 这样的一个游戏案例,它包含了音频,场景,文本,脚本,等,其中将音频单独放入Audio文件夹,游戏人物放入Sprites文件夹,将帮助信息放入到TutorialInfo文件夹,预设放入Prefabs。同时把游戏的核心放入到_Complete-Game文件夹下,code放入到Scripts,场景放入到Scenes等。
- 对象组织的结构:对象组织的结构一般是树形结构,有些类存在继承等关系,从而实现了一个类下可以存在多个子类,同时子类又可以有自己的子类,进而实现树形结果。
- 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"); }
// 基本行为
// Update is called once per frame 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行为是在脚本实例被加载时即被调用
- Start行为仅在游戏开始时调用一次,之后不再调用,也就是在update第一次调动之前调用一次
- Update行为每一帧触发一次,是实现动画游戏的基础。
- FixedUpdate行为是在自行设定的帧频下,每一帧触发一次
- LateUpdate在所有的updata结束后调用
- OnGUI事件是当渲染和绘制GUI事件时被调用
- OnDisable事件是当行为变得无效或者非激活状态的时候被调用,用于清理代码等
- OnEnable事件是当对象启用并激活的时候被调用
- 查找脚本手册,了解 GameObject,Transform,Component 对象
- 分别翻译官方对三个对象的描述(Description)
- 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件
- 本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API。
- 例如:table 的对象是 GameObject,第一个选择框是 activeSelf 属性。
- 用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
答:1.三个对象的官方描述:
- GameObject是Unity场景里面代表人物,道具,场景的基础对象,所有实体的基类。某种程度上就是一个容器的定义。是他们实现了游戏对象容器的特点。
- Transform是用于储存并操控物体的位置、旋转和缩放的类。用于操作对象的位置,角度等。
- Component是游戏物体一切附加类的基类。比如它是Transform的基类。通过组件能够为游戏对象添加各种脚本行为等。
2.table的介绍
- table的属性有layer(图层),active(非静态)tag(标签,untagged)的属性等。
- transform的属性有position,rotation,scale等。其中
- Position: (0, 0, 0)
- Rotation: (0, 0, 0)
- Scale : (1, 1, 1)
- table 的部件(Components)指 transform,Mesh filter,Box Collider等
3.三者关系:
- 4.整理相关学习资料,编写简单代码验证以下技术的实现:
- 查找对象
- 添加子对象
- 遍历对象树
- 清除所有子对象
-
- 通过名称查找单个对象、
public static GameObject Find(string name);
- 通过标签查找单个对象
public static GameObject FindWithTag(string tag);
- 通过标签查找多对象
public static GameObject[] FindGameObjectsWithTag(string tag);
- 通过类型查找单个对象
GameObject.FindObjectOfType(string typename)
;
- 通过类型查找多个对象
GameObject.FindObjectsOfType(string typename)
public static GameObect CreatePrimitive(PrimitiveTypetype);
遍历对象树
- 添加子对象
public static GameObect CreatePrimitive(PrimitiveTypetype);
- 遍历对象树
foreach (Transform child in transform) { Debug.Log(child.gameObject.name); }
- 清除所有子对象
foreach(Transform child in transform) { Destroy(child.gameObject); }
- 5.资源预设(Prefabs)与 对象克隆 (clone)
-
- 预设有什么好处
- 预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
- 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
- 答:
-
- 预设的优点:预设可以看成是一个模板,可以迅速方便创建大量相同属性的对象、操作简单,代码量少,减少出错概率。,将比较容易多次使用的对象预设,这样以后在重复使用该实体集时就不用再一一使用底层的对象去创建和拼接。
- 预设与克隆的区别:预设的属性一旦改变,其所有实例也会跟着改变,而克隆的个体之间是相互独立的,因此修改对于克隆是没有改变的。
- 尝试解释组合模式(Composite Pattern / 一种设计模式)。使用 BroadcastMessage() 方法
- 向子对象发送消息
代码:
public class Father : MonoBehaviour {
void test()
{
Debug.Log("Hello, dear son!");
}
void Start () {
this.BroadcastMessage("test");
}
}
public class Child : MonoBehaviour {
void test()
{
Debug.Log("Hi, my dear father");
}
}