1.解释对象与资源的区别与联系,根据官方案例,分别总结资源和对象组织的规则/规律。
答:在显式支持面向对象的语言中,”对象”一般是指类在内存中装载的实例,具有相关的成员变量和成员函数(也称为方法)。对象一般都是直接体现于游戏的场景中,整合了各种游戏的资源。对象一般指游戏中玩家、队友、敌人、周围生物、环境事物、摄像机和音乐等虚拟父类,这些父节点本身没有实体,但它们的子类真正包含了游戏中会出现的对象。而资源文件夹通常有对象、材质、场景、声音、预设、贴图、脚本、动作,在这些文件夹下可以继续进行划分。资源可以被多个对象使用。有些资源作为模板,可实例化成游戏中具体的对象。
2.编写简单程序代码,逐一验证 MonoBehaviour 基本行为触发的条件。
答:验证如下:
(1)当一个脚本实例被载入时Awake被调用。
(2)Start仅在Update函数第一次被调用前调用。
(3)当MonoBehaviour启用时,其Update在每一帧被调用。
(4)渲染和处理GUI事件时调用OnGUI。
(5)当MonoBehaviour启用时,其 FixedUpdate 在每一帧被调用。
(6)当Behaviour启用时,其LateUpdate在每一帧被调用。
(7)Reset,重置为默认值。
(8)当对象变为不可用或非激活状态时OnDisable函数被调用。
(9)当MonoBehaviour将被销毁时,OnDestory函数被调用。`
3.通过官方参考手册,查找 GameObject,Transform,Component 对象,简单解释三者之间的关系。(使用UMLet 画教程上图)
答:GameObject是Unity场景里面所有实体的基类.Transform附加到GameObject(游戏物体)(如无附加则为空)。Component是一切附加到游戏物体的基类。因此,GameObject中包含了Component,而Transform属于Component的一种。GameObject必定包含一个Transform组件,也可能包含其它Component。
4.整理官方和其他学习材料,介绍如何用程序(代码)管理一个场景的游戏对象树林。编写简单代码验证以下技术的实现:
(1)查找对象
(2)添加子对象
(3)遍历对象树
(4)清除所有子对象
答: (1)查找对象:Unity中常用到查找对象,非隐藏的、隐藏的,各种方法性能有高有低,使用又有各种条件限制。
1.1 GameObject.Find 通过名字或路径查找游戏对象。
GameObject.Find("GameObject");
GameObject.Find("GameObject/ChildGameObject);
1.2 Transform.Find
GameObject root = GameObject.Find("root");
root.SetActive(false);
root.transform.Find("root/AnyChildObjectName");
1.3 其他查找
GameObject.FindWithTag
GameObject.FindGameObjectsWithTag
Resources.FindObjectsOfTypeAll
(2)添加子对象
public static GameObect CreatePrimitive(PrimitiveTypetype)
(3)遍历对象树
foreach (Transform child in transform) {
Debug.Log(child.gameObject.name);
}
(4)清除所有子对象
foreach (Transform child in transform) {
Destroy(child.gameObject);
}
5.预设有什么好处?与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
答:Prefabs(预设)是最非常用的一种资源类型,是一种可被重复使用的游戏对象。它可以被置入多个场景中,也可以在一个场景中多次置入。它可以预设物体,类似与C/C++中的指针,可大大降低资源的占用,特别是手机开发方面,并还可以方便的设置物体的属性,预设类似于一个模板,通过预设可以创建相同属性的对象,这些对象和预设关联。一旦预设发生改变,所有通过预设实例化的对象都会产生相应的变化(适合批量处理)。对象克隆不受克隆本体的影响,因此A对象克隆的对象B不会因为A的改变而相应改变。
6.解释组合模式。并编写验证程序,向组合对象中子对象 cast 消息, 验证组合模式的优点。
答:组合模式,是将对象组合成树形结构以表示”部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式可以让客户端像修改配置文件一样简单的完成本来需要流程控制语句来完成的功能。组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口。
子类对象(my_obj)方法:
void say() {
print("3DGame!");
}
父类对象(GameObject)方法:
void Start () {
this.BroadcastMessage("say");
}
结构:
GameObject
my_obj
my_obj
运行结果:
3DGame!
3DGame!
GUI简单计算器
using UnityEngine;
using System.Collections;
public class calc : MonoBehaviour {
public string strPutkeyCode;
public UILabel strResult; //显示结果
public static string str1; //操作数 1
public static string str2; //操作数 2
public static string strOpt; //加减乘除符号
int sum = 0; //sum用来记录结果
void OnClick() {
if(strPutkeyCode == "=") {
if(strOpt == "/") {
sum =int.Parse(str2)/int.Parse(str1);
}
else if(strOpt == "*") {
sum =int.Parse(str1)*int.Parse(str2);
}
else if(strOpt == "+") {
sum =int.Parse(str1)+int.Parse(str2);
}
else if(strOpt == "-") {
sum =int.Parse(str2)-int.Parse(str1);
}
str1 = "";
str2 = sum.ToString();
Debug.Log(sum);
strResult.text = sum.ToString();
}
if(strPutkeyCode == "CE") { //结果清零
Debug.Log("CE");
strResult.text = "0";
sum = 0;
str1 = "";
str2 = "";
}
if(strPutkeyCode == "C") { //后删一个数字或符号
Debug.Log("C");
str1=str1.Substring(0,str1.Length-1);
if(str1 == "") {
strResult.text = "0";
return;
}
strResult.text = str1;
}
if(strPutkeyCode == "/" || strPutkeyCode == "*" ||strPutkeyCode == "-"||strPutkeyCode == "+") {
strOpt=strPutkeyCode;
if(str1 != "") {
str2=str1;
}
strResult.text = str2;
Debug.Log("code---");
str1="";
}
if(strPutkeyCode =="1" ||strPutkeyCode =="2" ||strPutkeyCode =="3" ||strPutkeyCode =="4" ||
strPutkeyCode =="5" ||strPutkeyCode =="6" ||strPutkeyCode =="7" ||strPutkeyCode =="8" ||
strPutkeyCode =="9" ||strPutkeyCode =="0") {
str1 += strPutkeyCode;
strResult.text = str1;
Debug.Log(str1);
}
}
void Start () {
}
}