1. 解释对象与资源的区别与联系
- 对象:对象直接出现在游戏场景中,是资源整合的具体表现,对象一般有玩家,敌人,游戏场景,摄像机等虚拟父类,这些父类没有实例化,而他们的子类实例化并包含了这些游戏对象,我们可以对这些对象进行操作。
- 资源:资源可以是我们自定义或下载下来的素材,可以被多个对象使用,有些资源可以做为模板并实例化为对象。资源文件夹(Asset)通常包含脚本,预设,场景,声音等。
2. 下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
- 资源的目录组织结构:
- 主要包括动画,文本,场景,素材,模型,预设以及使用说明等。
- 游戏对象树的层次结构:
- 主要包括摄像机包,游戏开始位置,场景布局以及文本管理等。
3. 编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件
public class firstTry : MonoBehaviour {
//Awake() Start() Update() FixedUpdate() LateUpdate()OnGUI() OnDisable() OnEnable()
// Use this for initialization
void Awake(){
Debug.Log ("onAwake");
}
void Start () {
Debug.Log ("onStart");
}
// Update is called once per frame
void Update () {
Debug.Log ("onUpdate");
}
void FixedUpdate(){
Debug.Log ("onFixedUpdate");
}
void LateUpdate(){
Debug.Log ("onLateUpdate");
}
void OnGUI(){
Debug.Log ("onGUI");
}
void OnDisable()
{
Debug.Log ("onDisable");
}
void OnEnable(){
Debug.Log ("onEnable");
}
}
3. 查找脚本手册,了解 GameObject,Transform,Component 对象
- 分别翻译官方对三个对象的描述(Description)
GameObjects是Unity中代表角色,道具和风景的基本对象。它们本身并不是很完整,但它们充当组件的容器实现了具体的功能。
Transform变换组件决定了每个对象在场景中的位置,比例和旋转,每个对象都有一个变换组件。
组件(Component)是用来绑定到游戏对象(Game Object)上的一组相关属性。本质上每个组件是一个类的实例。 - 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件
table的对象是GameObject,第一个选择框是activeSelf 属性,第二个文本框是对象名称,第三个选择框为static属性。第二行有Tag属性和Layer属性,第三行为prefabs(预设)属性。Transform属性包括position(位置),Rotation(旋转),Scale(比例)。Component对象有Transform,Mesh Filter,Box Collider,Mesh Renderer。 - 用 UML 图描述 三者的关系
4. 整理相关学习资料,编写简单代码验证以下技术的实现:
- 查找对象
- 添加子对象
- 遍历对象树
- 清除所有子对象
//按名字查找
var cubeF = GameObject.Find("Cube");
if (null != cubeF) {
Debug.Log ("find cube");
}
cubeF = GameObject.Find ("/Cube");
if (null != cubeF)
Debug.Log ("find cube~");
//按标签查找
var sphere = GameObject.FindWithTag("Sphere");
if (null != sphere)
{
Debug.Log("Sphere~");
}
//添加子对象到init
GameObject circle = GameObject.CreatePrimitive (PrimitiveType.Sphere);
circle.transform.position = new Vector3 (2, 2, 2);
circle.transform.parent = father.transform;
//遍历对象树
GameObject[] game = GameObject.FindObjectsOfType<GameObject>();
foreach (GameObject tem in game) {
Debug.Log (tem.name);
}
//删除所有子对象
foreach (GameObject tem in game) {
GameObject.Destroy (tem);
}
5. 资源预设(Prefabs)与 对象克隆 (clone)
- 预设(Prefabs)有什么好处?
1.使对象和资源能够重复利用。
2. 相同的游戏对象可以用同一个预制来创建。
3. 对预设进行修改后,所有的游戏对象都会发生改变。
总体而言,预设资源储存了完整储存了对象的组件和属性,相当于模板,使用预制能够方便我们创建相同的游戏对象并赋予他们相同的行为,比如用一块砖创建一堵墙。 - 预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
- 克隆游戏对象需要场景中有被克隆对象,而创建预制只需事先创建预制即可,允许场景中一开始并不存在该游戏对象。
- 克隆出来的游戏对象并不会随着被克隆体的变化而发生变化,但是使用预制创建出来的对象会随着预制的改变而发生改变。
- 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
GameObject prefab = (GameObject)Instantiate (prefab1);
6. 尝试解释组合模式(Composite Pattern / 一种设计模式)。使用 BroadcastMessage() 方法, 向子对象发送消息。
- 答:组合模式允许用户将对象组合成树形结构表现“整体-部分”的层次结构,使得客户以一致的方式处理单个对象以及对象的组合,组合模式实现的关键地方是单个对象与复合对象必须实现相同的接口,这就是组合模式能够将组合对象和简单对象进行一致处理的原因。
父对象:
void test(){
Debug.Log ("Hello world");
}
// Use this for initialization
void Start () {
this.BroadcastMessage ("test");
}
子对象:
void test(){
Debug.Log ("Hello world");
}