Unity学习第二周
我下面写的可能会有很多错误,请见谅,我会更加努力学习弥补这些错误,感谢!
这一期博客借鉴了很多人的博客,看了下外国网站,并不能看懂。。。。所以很多理解都来源于野路子嘿嘿
通过两个星期的学习,我对unity有了一定的了解,在课上我们通过新建游戏对象,然后修改它的属性,如transform可以调整游戏对象的位置、形状、大小。甚至可以多个游戏对象组成一个整体,成为预设等等。在接触了脚本的编写后,我深刻体会到了C#、JAVA等语言面向对象的好处,关于这几天遇到的问题提出以下简单的见解。
对象与资源
资源是硬盘中的文件,包含纹理,材质、场景、声音、预设、脚本等,而对象则是直接出现在游戏的场景中,是资源整合的具体实例。对象一般是以资源作为模板实例化成的,如unity自带案例中的赛车游戏,赛车、建筑物都是以实例化的对象存在于游戏场景,它们的模型、纹理等等都作为资源存在了Assets文件夹中。资源与对象是一种一对多的关系,一个资源可以被多个对象使用,一个对象可以涵盖多个资源。
MonoBehaviour
MonoBehaviour是所有行为对象的基类,没有public构造函数,只能由游戏对象创建。调度相关方法为:
由于unity采用离散仿真原理,每一秒都被分割成了很多个小的时间片,再一帧一帧地播放达到仿真的效果。为了确认不同事件何时执行,遇到冲突该先处理哪个事件,unity采用如图实现离散仿真系统:
我们可以逐一验证MonoBehaviour基本行为的触发条件
public class verification : MonoBehaviour // MonoBehaviour始终是基类
{
void Awake() {
Debug.Log(“This is Awake”);
}
void Start() {
Debug.Log(“This is Start”);
}
void Update() {
Debug.Log(“This is Update”);
}
void FixedUpdate() {
Debug.Log(“This is FixedUpdate”);
}
void LateUpdate() {
Debug.Log(“This is LateUpdate”);
}
Void OnGUI() { // 与Update有些类似,每次有gui事件的时候就会被触发, // 一帧可能会调用多次,用于渲染和处理GUI事件
Debug.Log(“This is OnGUI”);
}
void Reset() { // 编辑器模式情况下点击reset按钮时调用,
// 可以做调试的初始化工作
Debug.Log(“This is Reset”);
}
void OnMouseOver() { // 当鼠标悬停在GUIElement或Collider上时调用
Debug.Log(“This is OnMouseOver”);
}
}
还有一大堆方法,具体可以看http://jiangyongyuan.iteye.com/blog/2116663
GameObject、Transform、Component
GameObject为实例化的游戏对象,包含了一个或以上的Component,Transform属于Component,且任何GameObject必然包含Transform组件。类关系图如下
管理一个场景的游戏对象树林
查找对象
首先要保证对象是active状态
1.通过对象名称
public static GameObject Find (string name)
传入的name可以是单个对象的名字,也可以是hierarchy中的一个路径名,若找到则返回该对象,否则为null
2.通过标签获取单个游戏对象
public static GameObject FindWithTag (string tag)
返回一个用tag做标识的活动的对象,否则null
3.通过标签获取多个游戏对象
public static GameObject[] FindGameObjectsWithTag (string tag)
返回一个用tag做标识的活动的游戏物体的列表,否则null
4.通过类型获取单个游戏对象
public static Object FindObjectOfType(Type type)
返回类型为type的活动的第一个游戏对象
5.通过类型获取多个游戏对象
public static Object FindObjectsOfType(Type type)
返回类型为type的所有的活动的游戏对象列表
添加子对象
public static GameObject CreatePrimitive(PrimitiveType type)
遍历对象树
unity中的GameObject是没有层次关系的,但是每个GameObject都有一个transform组件,这个组件实现了IEnumerable接口,从而支持计数器,因此可以使用循环遍历子物体
foreach(Transform child in transform)
{
Debug.Log(child.gameObject.name);
}
/* transform是所需要找的物体GameObject的Transform
·清除所有子对象
foreach(Transform child in transform)
{
Destroy(child.gameObject);
}
预设与克隆对象
当我们幸幸苦苦做出来一个超棒的人物模型的时候总是会感慨过程的艰难,这时候我们可以把这个模型作为预设以便以后使用,这样的人物模型,以后即可以修改成魔兽,也可以修改成天使、恶魔之类的造型,这样可以把我们做好的对象作为一个资源存储起来以便以后使用,预设就是这样的一个方便的模板。虽然预设也可以创造出对象,但是与对象克隆不同,对象克隆后,克隆体与本体之间就再无关联,简单来说,就是克隆体发生任何改变,本体都不会受到影响,而预设作为一个模板,当预设的属性发生改变时,场景中的任何一个由该预设创建出来的对象的属性都会发生相应的变化。因此,预设可以用于批量处理。
组合模式
是组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。以资源管理器为例,文件夹属于容器构件,因为它可以容纳其他文件或文件夹。文件相当于叶子结构,因为它不能再包含任何文件或文件夹。组合模式把文件和文件夹当成统一的一个对象来处理,可以让客户端可以统一的对待单个对象和组合对象。而实现这一点则是靠简单对象和复合对象拥有相同的接口。
组合模式包含三个内容:
1.Component(抽象构件):是所有叶子构件和容器构件的共同父类,里面声明了叶子构件和容器构件的所有方法。
2.Leaf(叶子构件):对于从父类中继承过来的容器构件的方法,由于它不能实现,可以抛出异常。
3.Composite(容器构件):主要处理从父类那里继承过来的容器构件的方法
组合模式使用面向对象思想实现树形结构的构建和处理,描述了如何将容器对象和叶子对象递归组合,实现简单高效的统一管理。由于在实际开发中树形结构用的非常多,所以组合模式也是应用特别广泛的一种设计模式。它的缺点是,在对文件或者文件夹进行操作时,无法对文件或文件夹进行精确控制。
我new了一个unity项目,创建了两个GameObject的空对象,组织结构为:
分别挂载了一个脚本
这里父类函数中的BroadcastMessage()函数会将所有子类中函数名为Test的方法都执行一遍。自然,结果如图:
接下来会推出我做的井字棋游戏或者计算器或者什么的。。。期待吗?先赶完其他作业在发。