1. 简答题
- 解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系。
游戏对象是资源的集合体,是资源整合的结果。
资源可以被一个或多个游戏对象使用,游戏对象也能被预设为资源,作为模板重复使用。
- 下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
资源:动画、音效、图片、对象、新手指引、材质、场景、预设、脚本
对象:玩家、环境、对手、摄像机、音乐、灯光等虚拟父类。
- 编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件
- 基本行为包括 Awake() Start() Update() FixedUpdate() LateUpdate()
- 常用事件包括 OnGUI() OnDisable() OnEnable()
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestBehavior : MonoBehaviour
{
void Awake() {
Debug.Log ("onAwake");
}
void Start () {
Debug.Log ("onStart");
}
void Update () {
Debug.Log ("onUpdate");
}
void FixedUpdate() {
Debug.Log ("onFixedUpdate");
}
void LateUpdate() {
Debug.Log ("onLateUpdate");
}
void OnGUI() {
Debug.Log ("onGUI");
}
void OnDisable() {
Debug.Log ("onDisable");
}
void OnEnable() {
Debug.Log ("onEnable");
}
}
- 查找脚本手册,了解 GameObject,Transform,Component 对象
- 分别翻译官方对三个对象的描述(Description)
- 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件
- 本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API。
- 例如:table 的对象是 GameObject,第一个选择框是 activeSelf 属性。
- 用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
1. GameObject(游戏对象):Unity场景中所有实体的基类,是Unity中的基本对象,代表角色,道具和场景。其本身无法完成许多功能,但它们充当部件的容器以实现真正的功能。
Transform(变换):确定场景中每一个对象的位置,旋转和缩放。每个游戏对象都有变换这一属性。
Component(部件):是游戏中对象和行为的基本要素。它们是每个游戏对象的功能部件。
2. table 对象(实体)的属性:activeSelf(第一个选择框)、isStatic(Static下拉栏左侧的选择框)、Layer、Tag、Transform
table 的 Transform 的属性:Position、Rotation、Scale
table 的部件:Mesh Filter、Box Collider、Mesh Renderer
3.
- 整理相关学习资料,编写简单代码验证以下技术的实现:
- 查找对象
- 添加子对象
- 遍历对象树
- 清除所有子对象
1. 查找对象:
//通过对象名称
//传入的name可以是单个的对象的名字,也可以是hierarchy中的一个路径名
public static GameObject Find (string name);
//通过标签获取单个游戏对象
public static GameObject FindWithTag (string tag);
//通过标签获取多个游戏对象
public static GameObject[] FindGameObjectsWithTag (string tag);
//通过类型获取单个游戏对象
public static Object FindObjectOfType(Type type);
//通过类型获取多个游戏对象
public static Object[] FindObjectsOfType(Type type);
2. 添加子对象
public static GameObject CreatePrimitive(PrimitiveType type);
3. 遍历对象树
foreach(Transform child in transform)
{
Debug.Log(child.gameObject.name);
}
4. 清除所有子对象
foreach(Transform child in transform)
{
Destroy(child.gameObject);
}
- 资源预设(Prefabs)与 对象克隆 (clone)
- 预设(Prefabs)有什么好处?
- 预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
- 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
1. 预设在被修改时可以保持所有副本同步,且能够提高使用资源的效率。
2. 修改预设时,预设的副本也会发生变化。修改克隆对象时,其副本是独立于被克隆的对象,不会发生变化。
3.
public GameObject table;
void Start ()
{
GameObject instance = (GameObject)Instantiate(table, transform.position, transform.rotation);
}
void Update () {}
- 尝试解释组合模式(Composite Pattern / 一种设计模式)。使用 BroadcastMessage() 方法
- 向子对象发送消息
组合模式将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。它模糊了树型结构问题中简单元素和复杂元素的概念,客户程序可以跟处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
//父类对象方法
public class Father : MonoBehaviour
{
void test()
{
Debug.Log("Printed by father.");
}
void Start ()
{
this.BroadcastMessage("test");
}
}
//子类对象方法
public class Son : MonoBehaviour
{
void test()
{
Debug.Log("Printed by son.");
}
}
2. 编程实践,小游戏