Homework1
简答题
1、
Assets是一个可以存储声音素材、图像素材、场景、预置、脚本、动画素材等可以供游戏开发的资源库。
GameObject是在一个类型名,继承了Object类型,可供创建可以在游戏的对象的实例。
两者的区别是GameObject是在运行的时候实际存在的对象实例,而Assets是一个资源库,在游戏中不是实际存在的。
联系是GameObject的类型可以以预置(prefabs)的形式存在在资源库中,而且Assets的资源可以组装或添加到GameObject中,使GameObject更有行为性、外观或属性。
2、
同样都是树状结构,资源组织中具有声音素材、图像素材、场景、预置、脚本、动画素材等等分支文件。目的是为了放资源的管理(查找和搜寻)。而对象组织结构中的一个对象B可以是另外一个对象A的child,A是B的parent,他们之间是继承(inherit)关系,在逻辑上的理解是B是A的构成组件,A可以由多个child组成,但是B的实例只能有一个parentA实例。
3、
代码如下
实验结果如下
通过实验结果可以看到执行顺序是在构建对象实例初始化内容时后,Awake函数激活,激活后调用Start函数,UPdate()刷新频率是每秒50帧左右,FixedUpdate()可以固定刷新频率,更新频率可以通过给Time.fixedDeltaTime置位实现。
onGUI()实现如下
onGUI()测试函数如下
UnityGUI 控件使用一种称为 OnGUI() 的特殊函数。只要包含的脚本已启用,每帧OnGUI() 函数都会被调用 - 正如 Update() 函数。用GUI类中的显示函数只能在OnGUI()中使用。和Update的区别是OnGUI渲染和处理GUI事件时调用。Update当MonoBehaviour启用时,其Update在每一帧被调用。
在Unity3D的使用中,有时需要将一些模型停用,也就是停止渲染,这样可以达到提高性能的效果,有时也是为了场景需要。这个时候就要用到setActive,如果调用一次setActive = true就会调用一次Enable(),如果调用setActive一次Disable()。Enable()和Disable()目的是为了启用和禁用组件。通过资料搜寻我知道了一个GameObject有Activity和Enable属性,我们可以设置他来决定一个组件执行的顺序,如果Activity和Enable都是true,那么脚本实例调用顺序为Awake()、Enable()、Start()、FixedUpdate()、Update()、LateUpdate(),
如果Activity=true,Enable=false,那么只调用Awake()
如果Activity=false那么只调用Disable()
4、
GameObject:是unity场景中所有实体的基本类。
Transform:一个对象的位置、角度、规模,每一个场景中的对象可以有一个Transform,他用来存储和操纵位置,角度和物体的规模,每一个Transform都有一个可以让你分层应用位置,角度和规模的父类。
Component:所有绑在GameObjects上的基本类。注意你不能在代码中直接创建一个组件。你需要写脚本代码,然后把脚本绑在GameObject上座位替代。
table的属于GameObject的属性有activeInHierarchy,activeSelf,isStatic,layer,scence,tag,transform,Translate的属性有childCount、eulerAngles、forward、hasChanged、hierarchyCapacity、hierarchyCapacity、hierarchyCount、localEulerAngles、localPosition、localRotation、localScale、localToWorldMatrix、lossyScale、parent、position、right、root、rotation、up、worldToLocalMatrix
5、
GameObject GameObject Find(String name) //返回查找的对象名
GameObject GameObject FindWithTag(string tag) //通过标签查找单个对象
GameObject GameObject[] FindGameObjectsWithTag(string tag) //通过标签查找对象集合
GameObject CreatePrimitive(String name) //创建子对象
foreach(Transform child in table){ //遍历对象树
Debug.Log(child.gameObject.name);
}
foreach (Transform child in transform) { //删除所有的子对象
Destroy(child.gameObject);
}
关系之间的UML图如下:
解释:
TransForm的只能有一个或没有parent作为自己的属性
一个parent可以有多个TransForm
GameObject和TransForm之间可以互相转化,互相引用
一个GameObject可以有一个到多个TranForm
一个GameObject可以有0个到多个组件,
GameObject可以通过序列化变成Prefabs
6、
预设使对象组合能够快速保存和提取。
克隆和预置的区别在于:
1、克隆游戏对象需要场景中有被克隆对象,而创建预制只需事先创建预制即可,允许场景中一开始并不存在该游戏对象。
2、克隆出来的游戏对象并不会随着被克隆体的变化而发生变化,但是使用预制创建出来的对象会随着预制的改变而发生改变。
通过预置创建GameObject
结果如下
7、
组合模式允许用户将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以一致的方式处理单个对象以及对象的组合。组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口。这就是组合模式能够将组合对象和简单对象进行一致处理的原因。
(简单的解释一下,为了同时处理简单对象和组合对象,在组合对象的子类中实现相同的接口,这样组合对象也能和简单对象一致处理,像是事件委托和反射的结合版)
子类对象(my_obj1)方法:
void sayHello() {
print("Hello1!");
}
子类对象(my_obj2)方法:
void sayHello() {
print("Hello2!");
}
父类对象(GameObject)方法:
void Start () {
this.BroadcastMessage("sayHello");
}
结构:
GameObject
|—-
my_obj1
|—-
my_obj2
运行结果:
Hello1!
Hello2!