【Unity3D】资源对象、预设、查找对象、组合模式等知识点
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上执行的
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。
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.5F, );
GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
sphere.transform.position = new Vector3(, 1.5F, );
GameObject capsule = GameObject.CreatePrimitive(PrimitiveType.Capsule);
capsule.transform.position = new Vector3(, , );
GameObject cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
cylinder.transform.position = new Vector3(-, , );
}
}
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,使得内存空间管理富有效率,提高了性能。
【Unity3D】资源对象、预设、查找对象、组合模式等知识点的更多相关文章
- 【Unity3D与23种设计模式】组合模式(Composite)
前段时间在忙一个新项目 博客好久没有更新了 GoF中定义: "将对象以树状结构组合,用以表现部分-全体的层次关系.组合模式让客户端在操作各个对象或组合时是一致的." 是一致的意思就 ...
- 根据对象属性查找对象或者数组(根据对象属性查找某数组内符合该条件的对象,数组内对象属性check为true的对象,存放到数组内) 滚动轴样式
1.根据对象属性查找某数组内符合该条件的对象. optionComwords:[ {optionName:"名称1", optionCode: '1'}, {optionNam ...
- JS设计模式——9.组合模式
组合模式概述 组合模式是一种专为创建Web上的动态用户界面量身定制的模式.使用这种模式可以用一条命令在多个对象上激发复杂的递归的行为. 它可以用来把一批子对象组织成树形结构,并且使整棵树都可被遍历.所 ...
- Java 设计模式系列(九)组合模式
Java 设计模式系列(九)组合模式 将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象的使用具有一致性. 一.组合模式结构 Component: 抽象 ...
- 设计模式(十)组合模式(Composite Pattern)
一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...
- c#设计模式-组合模式
在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象 ...
- C#设计模式系列:组合模式(Composite)
1.组合模式简介 1.1>.定义 组合模式主要用来处理一类具有“容器特征”的对象——即它们在充当对象的同时,又可以作为容器包含其他多个对象. 1.2>.使用频率 中高 2.组合模式结构图 ...
- java设计模式之组合模式
组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 & ...
- 设计模式学习之组合模式(Composite,结构型模式)(10)
转载地址:http://www.cnblogs.com/zhili/p/CompositePattern.html 一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系 ...
随机推荐
- Out of resources when opening file ‘./xxx.MYD’ (Errcode: 24)解决方法
今天朋友向我反映网站出现错误:Out of resources when opening file './xxx.MYD' (Errcode: 24)错误是因为打开的文件数超过了my.cnf的--op ...
- POJ2186(有向图缩点)
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 28379 Accepted: 11488 De ...
- SRAM SROM DRAM DROM DDR NAND FLASH EMMC的区别
RAM(Random Access Memory)的全名为随机存取记忆体,它相当于PC机上的移动存储,用来存储和保存数据的.它在任何 时候都可以读写,RAM通常是作为操作系统或其他正在运行程序的临时存 ...
- SQLServer 微软团队开源项目 (web 版?)
http://www.codeplex.com/site/users/view/SQLTeamAdmin
- centos6.5安装gtk开发环境
0.说明 由于 centos 默认的桌面是 gnome 的,我们知道gnome 的依赖库就是 gtk,而 gtk 各个版本的差异性还是很大的,所以我们需要根据 centos 的不同版本选择和 cent ...
- win7 卸载ie10+ 重新安装ie8
烦恼: erp系统不支持高版本ie10+ 项目开发测试需要安装了高版本ie 项目结束,为了方便使用erp,决定卸载ie11,重新安装ie8 解决方法: 1.win+R打开运行命令,键入appwiz.c ...
- Gym - 100851A Adjustment Office(O(1)求行列和)
Adjustment Office Gym - 100851A 2 3 4 3 4 5 4 5 6 n<=10^6,q&l ...
- java数据结构和算法08(B树的简单原理)
这一篇首先会说说前面剩余的一点知识2-3树,然后简单说说B树,不写代码,只是简单看看原理吧! 为什么要说一下2-3树呢?了解2-3树之后能更快的了解B树: 1.简单看看2-3树 其实我们学过了前面的2 ...
- Mac下安装rJava,xlsx,ReporteRs包
xlsx包可以用来读取excel数据,ReporteRs包可以用来直接输出word报告,这两个包都对rJava包有依赖,所以必须先安装rJava. (1)查看mac的java信息 java版本: &g ...
- 2014-11-1 NOIP模拟赛1
冲刺NOIP2014复赛模拟题第六套第二试 题目名称 日历游戏 最大公约数 密码 英文代号 calendar gcd pasuwado 输入文件名 calendar.in gcd.in pasuw ...