Unity3d 游戏——离散仿真引擎基础简答题
1. 解释游戏对象 (GameObjects) 和资源 (Assets) 的区别与联系。
- 游戏对象 (GameObjects) 用来表示游戏中具体的角色,道具和场景。它们通过容纳组件 (Component) 来实现实际的功能。这些附属于游戏对象的组件能给游戏对象加上所需要的属性和功能。
- 资源 (Assets) 游戏中可能用到的模型、声音、贴图、脚本文件等等,它们不是具体的游戏物体,但可以供多个游戏对象使用。
- 区别和联系 对象一般是一些资源的集合体,是资源整合的具体表现,并且同一个资源能被多个游戏对象使用。另外,一个设计好的对象可以成为模板从而成为一个资源。
2. 下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)。
-
游戏对象树:主要包括摄像机,场景,游戏开始,进行,结束的设计,以及文本。
Main Camera
Canvas
- StartView
- Title
- Start
- Text
- Exit
- Text
- logo
- Load
- Text
- Game
- background
- EnemyCount
- HP
- GameTime
- Over
- Text
- Rese
- Text
- Exit
- Text
EventSystem
BoomAudio
- StartView
-
资源目录组织结构:主要包括动画,声音,场景,素材,模型,预设,脚本等。
Animation
- bom_0.controller
- BoomAudio.controller
- PlayerDeath.anim
- ……
Audio
- backgound.wav
- Boom.wav
- Fire.wav
- Load.wav
- Loss.wav
Object
- Bomb.prefab
- Door.prefab
- Enemy.prefab
- Enemy2.prefab
- fire.prefab
- Player.prefab
- SuperWall.prefab
- wall.prefab
Scence
- MainScene.unity
Script
- Bomb.cs
- Boom.cs
- BuilderPorps.cs
- DoorWall.cs
- EnermyAI.cs
- FollowPlayer.cs
- GameController.cs
- MapController.cs
- PlayerController.cs
- UIController.cs
Sprite
- 42.png
- Door.png
- enemy1.png
- logo.png
- wall4.png
- wall12.png
- yaogan.png
3. 编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件。
-
基本行为包括 Awake(), Start(), Update(), FixedUpdate(), LateUpdate();
-
常用事件包括 OnGUI(), OnDisable(), OnEnable();
-
代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class DebugBeh : MonoBehaviour { void Awake() { Debug.Log("Awake"); } void Start() { Debug.Log("Start"); } void Update() { Debug.Log("Update"); } void FixedUpdate() { Debug.Log("FixedUpdate"); } void LateUpdate() { Debug.Log("LateUpdate"); } void OnGUI() { Debug.Log("OnGUI"); } void OnDisable() { Debug.Log("OnDisable"); } void OnDestroy() { Debug.Log("OnDestroy"); } }
-
截图
-
分析
- Awake: 当一个脚本实例被载入时被调用,或者脚本构造时调用;
- Start: 当前脚本第一次执行update函数之前被调用一次;
- FixedUpdate: 每固定帧绘制时执行一次,由物理引擎调用,和Update不同的是FixedUpdate是渲染帧执行,当渲染帧效率低下时,其调用次数会下降;
- Update: 在所有脚本Start调用完后,在每一帧被调用一次;
- LastUpdate: 在所有Update执行完后执行。
- OnGUI: 渲染和处理GUI后调用;
- OnEnable: 当对象变为可用或被激活时被调用;
- OnDisable: 当对象变为不可用或非激活状态时被调用;
- OnDestroy: 物体从场景中被销毁时以及游戏结束时执行。
-
从控制台信息可以看出,执行顺序为 Awake -> Start -> FixedUpdate -> Update -> LastUpdate -> OnGUI 。
4. 查找脚本手册,了解 GameObject,Transform,Component 对象。
4.1 分别翻译官方对三个对象的描述(Description)
-
以下描述摘自Unity - Scripting API
-
GameObject
Base class for all entities in Unity Scenes.
GameObject 是Unity场景中所有实体的基类。
-
Transform
Position, rotation and scale of an object.
一个物体的位置,旋转和大小。
-
Component
Base class for everything attached to GameObjects.
一切附加到游戏物体的基类。
4.2 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件 。
- ActiveSelf (API: GameObject.activeSelf)属性,可以定义对象的名称,动静态,其中 Tag 属性用于区分游戏中不同类型的对象,可用 GameObject.FindWithTag()来查询对象。
- Transform属性,可以定义对象的位置 (Position),方向 (Rotation),大小 (Scale)。API: Transform.position, Transform.rotation, Transform.localScale。
- 其他 Component(包括Mesh Filter, Mesh Renderer, Default-Material)。
4.3 用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
5. 整理相关学习资料,编写简单代码验证以下技术的实现:
-
查找对象
- 通过名字查找
public static GameObject Find(string name)
- 通过标签查找单个对象
public static GameObject FindWithTag(string tag)
- 通过标签查找多个对象
public static GameObject[] FindGameObjectsWithTag(string tag)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FindBeh : MonoBehaviour { public GameObject table, player; public GameObject[] list1; void Start() { table = GameObject.Find("table"); player = GameObject.FindWithTag("Player"); list1 = GameObject.FindGameObjectsWithTag("Controller"); Debug.Log(table); Debug.Log(player); Debug.Log(list1); } }
- 截图
- 通过名字查找
-
添加子对象
using System.Collections; using System.Collections.Generic; using UnityEngine; public class InitBeh_another : MonoBehaviour { void Start() { GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.name = "cube"; cube.transform.position = new Vector3(0, 1, 2.8f); } }
-
遍历对象树
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraBeh : MonoBehaviour { void Start() { foreach (Transform child in transform) { Debug.Log(child.name); } } }
-
清除所有子对象
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraBeh : MonoBehaviour { void Start() { foreach (Transform child in transform) { Destroy(child.gameObject); } } }
6. 资源预设(Prefabs)与 对象克隆 (clone)
6.1 预设(Prefabs)有什么好处?
- 预设可以提前将设计游戏中所需要的游戏对象设计打包,成为一个资源,在游戏中,可直接加载预设就能快速生成游戏对象。设计时,修改预设就可以完成对生成对象的修改。预设的存在,方便了面向对象思想的应用。
6.2 预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
-
预设与克隆都能创建出与源对象相同的对象。由预设得到的对象与的源预设有关联,预设改变,对象跟着改变;而克隆得到的对象和源对象是独立互不影响的。
-
制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
using System.Collections; using System.Collections.Generic; using UnityEngine; public class InitBeh_3 : MonoBehaviour { public Object table; void Start() { Debug.Log("Init Start"); table = Resources.Load("table"); GameObject anotherTable = (GameObject)Instantiate(table) as GameObject; anotherTable.transform.position = new Vector3(0, Random.Range(5, 7), 0); anotherTable.transform.parent = this.transform; } }
Unity3d 井字棋小游戏见 https://github.com/LeoBarwoo/Unity3d/tree/master/1.井字棋