1.解释对象与资源区别于联系,根据官方案例,分别总结资源和对象组织的规则/规律。
下载并查看了Adam和Survival Shooter tutorial两个官方资源案例,这些案例做为资源,能够做为一个模板导入使用,也能够被多个对象使用或者自己实例化为游戏中的对象。导入的过程当中能够自由选择部分资源导入,导入的这些资源能够被本身新建的对象所使用。资源内部能够有不少对象。
Unity商店资源分类有3D模型、动画、音频、脚本、着色器、纹理和材料、编辑器扩展等。资源有Audio, Fonts, GiParamaters, Materials, Models, Prefabs, Scripts, Textures等。对象则有玩家、环境、对手、摄像机、灯光等虚拟父类。资源是能够被多个对象使用的,自己也能够进行实例化。对比起对象,资源更像是集成的可扩展的模板包。设计模式
2.编写简单程序代码,逐一验证MonoBehaviour基本行为触发的条件。
MonoBehaviour is the base class from which every Unity script derives.查阅了官方文档,MonoBehaviour行为有不少,基本行为选取了Awake, Start, Update, FixedUpdate, LateUpdate, Reset, OnGUI, OnDestroy, OnDisable来进行实验研究。
代码:数组
using System.Collections; using System.Collections.Generic; using UnityEngine; public class exam : MonoBehaviour { void Awake () { Debug.Log ("Awake"); } // Use this for initialization 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 Reset () { Debug.Log ("Reset"); } void OnGUI () { Debug.Log ("OnGUI"); } void OnDestroy () { Debug.Log ("OnDestroy"); } void OnDisable () { Debug.Log ("OnDisable"); } }
实验小结:
通过阅读官方文档以及实践检验,发现Awake是在脚本实例被加载时即被调用;
FixedUpdate是当MonoBehaviour启用以后在每个固定的framerate frame中被调用;
LateUpdate是当Behaviour是enabled的状况下在每一frame被调用。
OnDestroy是当MonoBehaviour被销毁时调用
OnDisable是当行为变得无效的时候被调用
OnEnable是当对象启用并激活的时候被调用
OnGUI是当渲染和处理GUI事件时被调用。
Reset是重置为默认值
Start只执行一次,在第一个Update被调用时启用。
Update被叫作每一帧,若是MonoBehaviour被接受。编辑器
3.经过官方参考手册,查找GameObject,Transform,Component对象,简单解释三者之间的关系。(使用UMlet画教程上图)
Unity由Scene中的各类游戏对象(GameObject)构成游戏世界,组件(Component)是用来挂载到游戏对象(Game Object)上的一组相关属性。本质上每一个组件是一个类的实例。不一样类型的游戏对象,均可以当作一个空的游戏对象,经过挂载不一样组件实现不一样功能。Unity脚本也是以组件的形式挂载在GameObject上执行的ide
GameObject:Unity场景中全部实体的基类Base class for all entities in Unity scenes.
class in UnityEngine/Inherits from:Object函数
Transform:指对象的位置、旋转和缩放。
场景中的每一个对象都有一个变换。它用来存储和操纵物体的位置、旋转和缩放。每个变换均可以有一个父函数,它容许你应用位置、旋转和缩放。这是层次结构窗格中看到的层次结构。他们也支持枚举,因此你能够经过儿童使用环:
class in UnityEngine/Inherits from:Component性能
Component:链接到全部基类对象。(Base class for everything attached to GameObjects)
class in UnityEngine/inherits form:Object学习
使用UMlet画图:动画
4.整理官方和其余学习材料,介绍如何用程序(代码)管理一个场景的游戏对象树林。编写简单代码验证如下技术的实现:
4.1查找对象
Unity中提供了五种获取对象的方法
1.经过对象名称(Find)
public static GameObject Find(string name);
经过名字寻找对象并返回它,只返回active GameObject,若是没有GameObject,则返回null。若是名称内包含“/”字符,会当作是hierarchy中的一个路径名。网站
2.经过标签获取单个游戏对象
public static GameObject FindWithTag(string tag))
返回一个用tag作标识的活动的对象,若是没有找到则为null。this
using UnityEngine; using System.Collections; public class findwithtag : MonoBehaviour { public GameObject a; public GameObject b; void Start() { if (b == null) b = GameObject.FindWithTag("Respawn"); Instantiate(a, b.transform.position, b.transform.rotation); } }
3.经过标签获取多个游戏对象
public static GameObject[] FindGameObjectsWithTag(string tag);
返回一个用对象标记的标签,若是没有找到对象则返回空数组。
using UnityEngine; using System.Collections; public class Example : MonoBehaviour { public GameObject a; public GameObject[] b; void Start() { if (b == null) b = GameObject.FindGameObjectsWithTag("Respawn"); foreach (GameObject respawn in b) { Instantiate(a, respawn.transform.position, respawn.transform.rotation); } } }
4.经过类型获取单个游戏对象
返回类型为type的活动的第一个游戏对象。
5.经过类型获取多个游戏对象
返回类型为type的全部活动的游戏对象列表。
4.2添加子对象
public static GameObject CreatePrimitive(PrimitiveType type);
建立一个游戏对象与原始网格渲染器和适当的collider。
using UnityEngine; using System.Collections; public class example : MonoBehaviour { void Start() { GameObject plane = GameObject.CreatePrimitive(PrimitiveType.Plane); GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.position = new Vector3(0, 0.5F, 0); GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); sphere.transform.position = new Vector3(0, 1.5F, 0); GameObject capsule = GameObject.CreatePrimitive(PrimitiveType.Capsule); capsule.transform.position = new Vector3(2, 1, 0); GameObject cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder); cylinder.transform.position = new Vector3(-2, 1, 0); } }
4.3遍历对象树
foreach (Transform child in transform) {
Debug.Log(child.gameObject.name);
}
4.4清除全部子对象
foreach (Transform child in transform) {
Destroy(child.gameObject);
}
5.预设有什么好处?与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
预设是一个很是容易复用的类模板,能够迅速方便建立大量相同属性的对象、操做简单,代码量少,减小出错几率。修改的复杂度下降,一旦须要修改全部相同属性的对象,只须要修改预设便可,全部经过预设实例化的对象都会作出相应变化。而克隆只是复制一个如出一辙的对象,这个对象独立于原来的对象,在修改的过程当中不会影响原有的对象,这样不方便总体改动。
6.解释组合模式。并编写验证程序,向组合对象中子对象 cast 消息,验证组合模式的优势。
组合模式(Composite Pattern),又叫部分总体模式,是用于把一组类似的对象看成一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及总体层次。这种类型的设计模式属于结构型模式,它建立了对象组的树形结构。这种模式建立了一个包含本身对象组的类。该类提供了修改相同对象组的方式。组合模式是将对象组合成树形结构以表示“部分-总体”的层次结构,它使得用户对单个对象和组合对象的使用具备一致性。
经典案例:系统目录结构,网站导航结构等
组合模式的使用,使得Unity离散引擎灵活、易于扩展;Component强组合于GameObject,使得内存空间管理富有效率,提升了性能。