一、解释对象与资源的区别与联系,根据官方案例,分别总结资源和对象组织的规则/规律
资源指的是游戏中那些直接可见的、对用户展现出的元素,包括图片、音乐、视频、人物、字体。
对象指的是数据?资源的载体?
资源可以被很多对象复用,很多资源构成游戏的场景。
资源的组织:首先按照大类分为音频、视频、字体、图片等,再往下可能是按照场景划分。对象的组织:可以按照玩家、环境、摄像机、音乐等进行分类,这些父类本身没有实体,只是一个逻辑的关系,他们的子类(可以理解为叶结点,构成游戏的主题)
二、编写简单程序代码,逐一验证 MonoBehaviour 基本行为触发的条件。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CamBeha : MonoBehaviour {
void Awake() {
Debug.Log ("onAwake");
}
void Start() {
Debug.Log ("onStart");
}
void Update() {
Debug.Log ("onUpdate");
}
void OnGUI() {
Debug.Log ("onGUI");
}
void Reset() {
Debug.Log ("onReset");
}
void onDisable() {
Debug.Log ("onDisable");
}
void onDestroy() {
Debug.Log ("onDestroy");
}
}
Awake触发条件:实例正在载入的时候
Start触发条件:脚本可以被执行的第一帧,所有update没有执行之前
update触发条件:脚本可以被执行后,执行完start的每一帧
OnGUI触发条件:每次GUI被渲染的时候
Reset触发条件:在inspectors视图中被用户点击的时候
onDisable触发条件:当这个行为被disable的时候(虽然我不知道什么时候会被disable)
onDestroy触发条件:当这个对象销毁的时候(被Destory方法销毁)
三、通过官方参考手册,查找 GameObject,Transform,Component 对象,简单解释三者之间的关系。(使用UMLet 画教程上图)
GameObject是所有游戏对象的基类(base class),component对象是所有组件的基类(base class),这类对象都attack(不会翻译,只可意会)到gameobject上,transform是component的一个超类(继承自component),每个GameObject都有一个Component。
四、整理官方和其他学习材料,介绍如何用程序(代码)管理一个场景的游戏对象树林。编写简单代码验证以下技术的实现:
查找对象
public static GameObject find(string name) // 根据对象名查找
public static GameObject FindWithTag(string tag) // 根据标签查找对象
添加对象
public static GameObject CreatePrimitive(PrimitiveType type);
public static Object Instantiate(Object original); // 通过克隆添加子对象
遍历对象树:
void travel(GameObject father) {
foreach (Transform child in transform) {
travel(child);
// do something here
}
}
清除所有子对象:
public static void Destroy(Object obj, float t = 0.0F);
void deleteAllChild() {
foreach (Transform child in transform) {
Destory(child); // 因为是object这个对象的方法,所有对象的基类
}
}
六、解释组合模式
组合模式类似于数据结构中的树的结构,有一个主对象,其他作为组件。在我的理解看来,他就是一种分级的模式。组合模式实现的关键就是简单和复合对象要实现相同接口,使用户能够像操作简单对象一样操作复合对象。
以下代码为向子对象cast消息示例:
public class CamBeha : MonoBehaviour {
// Use this for initialization
void Start () {
this.BroadcastMessage ("sayHello");
}
}
public class myBeh : MonoBehaviour {
void sayHello() {
Debug.Log ("hello world");
}
}