Unity3D学习笔记(0) 离散仿真系统与 Unity 事件模型
游戏对象(GameObjects) 和 资源(Assets)的区别与联系
游戏对象是出现在场景中的所有物体。
资源是项目中的素材,包括图像、视频、脚本文件、预制文件等。
联系:
游戏对象可保存为资源,资源可以作为组件或整个游戏对象创建游戏对象实例。
资源、对象组织的结构(资源的目录组织结构与游戏对象树的层次结构)
资源通过文件夹的形式来组织,可按照文件类型分类放到不同的文件夹。
案例中资源下包含两个文件夹,code文件夹存放脚本文件,GameObject文件夹存放一个制作好的游戏对象。
游戏对象通过整体-部分的关系构成层次结构。
案例中游戏对象包含摄像机、灯光和table对象,table下包含4个chair对象组成桌椅套件。
验证 MonoBehaviour 基本行为或事件触发的条件
MonoBehaviour是每一个脚本对象的基类,它有一些方法可以覆盖,这些方法会在运行的特定时间被调用
- 基本行为包括 Awake() Start() Update() FixedUpdate() LateUpdate()
- 常用事件包括 OnGUI() OnDisable() OnEnable()
-
行为和事件的区别:行为由游戏引擎调用,事件由游戏对象或系统状态触发
using System.Collections; using System.Collections.Generic; using UnityEngine; public class table : MonoBehaviour { void Awake () { Debug.Log ("Table Awake"); } void Start () { Debug.Log ("Table Start"); } void Update () { Debug.Log ("Table Update"); } void FixedUpdate () { Debug.Log ("Table FixedUpdate"); } void LateUpdate () { Debug.Log ("Table LateUpdate"); } void OnGUI () { Debug.Log ("Table OnGUI"); } void OnEnable () { Debug.Log ("Table OnEnable"); } void OnDisable () { Debug.Log ("Table OnDisable"); } void OnDestroy () { Debug.Log ("Table OnDestroy"); } }
启动
每一帧
结束
执行顺序
GameObject,Transform,Component
- GameObject: 场景中所有实体的基类
- Transform: 对象的位置、旋转(角度)和大小
-
Component: GameObject所有附加物的基类
案例中table对象是GameObject把可视化图形编程界面与 Unity API 对应起来
点击该按钮,打开Manual文档
点击切换到对应的Unity API右侧Inspector面板上依次为:
- 对象(实体)的属性 GameObject.activeSelf
- Transform 属性 Transform
- Mesh Filter 属性 MeshFilter
- Box Collider 属性 BoxCollider
- Mesh Renderer 属性 MeshRenderer
用 UML 图描述三者的关系
验证以下技术:
-
查找对象 GameObject.Find
GameObject table, chair1; table = GameObject.Find("table"); Debug.Log (table.name); table = GameObject.Find("/table"); Debug.Log (table.name); chair1 = GameObject.Find("chair1"); Debug.Log (chair1.name); chair1 = GameObject.Find("/table/chair1"); Debug.Log (chair1.name);
-
添加子对象
public GameObject prefab; void Start () { GameObject container = GameObject.Find("Container"); GameObject prefabInstance = Instantiate(prefab); prefabInstance.transform.parent = container.transform; }
运行前将对象拖进来 -
遍历对象树
直接子对象
void Example() { foreach (Transform child in transform) { child.position += Vector3.up * 10.0F; } }
所有子对象
void Example() { Recursive(gameObject); } private void Recursive(GameObject parentGameObject){ //Do something you want //...... foreach (Transform child in parentGameObject.transform){ Recursive(child.gameObject); } }
-
清除所有子对象
foreach (Transform child in transform) { GameObject.Destroy(child.gameObject); }
资源预设(Prefabs)与 对象克隆 (clone)
-
Prefabs(预设)是一种可被重复使用的游戏对象,具有以下特点:
- 它可以被置入多个场景中,也可以在一个场景中多次置入。
- 当你在一个场景中增加一个Prefabs,你就实例化了一个Prefabs。
- 所有Prefabs实例都是Prefab的克隆,所以如果实在运行中生成对象会有(Clone)的标记。
- 只要Prefabs原型发生改变,所有的Prefabs实例都会产生变化。
-
预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系
预设与克隆都能创建出相同的对象。预设创建出的对象与源预设依然有联系,后者的更改会影响到前者。但是克隆出的对象与源对象不再有联系。
-
制作 table 预制,将 table 预制资源实例化成游戏对象
先在Asset目录下创建一个名为Resources的文件夹,这个命名是U3D规定的方式,然后把table放进Resources文件夹。
GameObject newTable = Instantiate(Resources.Load ("table") as GameObject); newTable.transform.parent = this.transform;
组合模式(Composite Pattern)
组合模式将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性,像修改配置文件一样简单的完成本来需要流程控制语句来完成的功能。
-
使用 BroadcastMessage() 方法向子对象发送消息
父对象
void res(){ Debug.Log (this.gameObject.name); } void Start () { this.BroadcastMessage ("res"); }
子对象
void res(){ Debug.Log (this.gameObject.name); }
小游戏
- 游戏内容: 井字棋
- 技术限制: 使用 IMGUI 构建 UI
- 实践目的:
- 提升 debug 能力
- 提升阅读 API 文档能力
参考资料
https://www.jianshu.com/p/c987b9259896
http://gad.qq.com/content/coursedetail/5562
https://blog.csdn.net/u010145745/article/details/39160141
https://blog.csdn.net/yy763496668/article/details/51576694
https://www.cnblogs.com/wangchengfeng/p/3664895.html
https://blog.csdn.net/jukaiblog/article/details/10088021
https://blog.csdn.net/alayeshi/article/details/51093624
上一篇: Week03-3DHomwork