1、简答题
解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系。
- 对象(GameObject)是指出现在游戏中的具体事物,它可以是我们创建的精灵和各种形状的物体,也可以是游戏场景和摄像机等。游戏对象本身不做任何事情,它们需要特殊属性才能成为一个角色、一种环境或者一种特殊效果。
- 资源(Assets)是可以通过Unity资源商店下载并使用的素材,它可以被多个对象使用,它包括一些预设、脚本、声音等。
一个对象通过使用资源实现自身的实例化,使其能够真正地在游戏中被应用。
下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
资源的组织结构:预设、脚本、精灵、动画、模型、使用说明等。
对象的组织结构:位置信息、文本管理、摄像机、对象的结构信息等。
编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件
基本行为包括 Awake() Start() Update() FixedUpdate() LateUpdate()
常用事件包括 OnGUI() OnDisable() OnEnable()
代码;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
private void Awake()
{
Debug.Log("Awake.");
}
// Start is called before the first frame update
void Start()
{
Debug.Log("Start.");
}
// Update is called once per frame
void Update()
{
Debug.Log("Update.");
}
private void FixedUpdate()
{
Debug.Log("FixedUpdate.");
}
private void LateUpdate()
{
Debug.Log("LateUpdate.");
}
private void OnGUI()
{
Debug.Log("OnGUI.");
}
private void OnDisable()
{
Debug.Log("OnDisable.");
}
private void OnEnable()
{
Debug.Log("OnEnable.");
}
}
在Unity中将脚本添加给一个cube并运行后可以看到结果:
执行顺序与课件中的基本一致。
查找脚本手册,了解 GameObject,Transform,Component 对象
分别翻译官方对三个对象的描述(Description)
GameObject: Unity场景中所有实体的基类
Transform: 对象的位置,旋转和缩放
Component: 附加到GameObjects的所有内容的基类
描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件
本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API。
table 的对象是 GameObject,第一行第一个选择框是 activeSelf 属性,第二个框是所选对象的名称,第三个选择框是static属性;第二行第一个是tag属性,第二个是Layer属性;第三行是Perfabs属性。
Transform第一行是Position属性,包括xyz三个坐标值;第二行是Rotation属性,同样包括三个坐标值;第三行是Scale属性,同样包括三个坐标值。
table的部件由4个组成,包括table1, table2, table3和table4。
用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
整理相关学习资料,编写简单代码验证以下技术的实现:
查找对象
//search object
var findObj = GameObject.Find("Object");
if (findObj == null) Debug.Log("Object found.");
else Debug.Log("Object not found.");
添加子对象
//add sub object
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.transform.position = new Vector3(0, Random.Range(0, 5), 0);
obj.transform.parent = this.transform;
遍历对象树
//traverse object tree
GameObject game[] = GameObject.FindObjectOfType<GameObject>();
foreach (GameObject g in game)
{
Debug.Log(g.name);
}
清除所有子对象
//clear all object
GameObject game[] = GameObject.FindObjectOfType<GameObject>();
foreach (GameObject g in game)
{
GameObject.Destroy(g);
}
资源预设(Prefabs)与 对象克隆 (clone)
预设(Prefabs)有什么好处?
预设 (Prefab) 是存储在工程视图中可重复使用的游戏对象 ,它可以放入多个场景中,并且每个场景可以使用多次,当我们向一个场景中添加一个预设时,就会创建它的一个实例,所以无论工程中有多少个实例,当我们对预设做出更改时,这些更改会运用与所有实例,这就使得游戏制作起来更加高校和便捷。
预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
对象克隆需要场景中事先已存在对象,而预设允许场景中无对象存在,它只需事先创建预制即可,而场景中不存在对象时无法创建克隆对象;其次预设创建出的对象会根据预设的改变而改变,而克隆创建出的对象不会随被克隆对象的改变而改变。
制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
public GameObject table;
// Start is called before the first frame update
void Start()
{
Resources.Load("table");
Debug.Log("Start.");
GameObject prefab = (GameObject)Instantiate(table);
prefab.transform.position = new Vector3(0, Random.Range(0, 5), 0);
prefab.transform.parent = this.transform;
}
先将table拖入项目视图,然后删除对象,接着新建一个空对象GameObject,将table预制拖入对象层标签,编写好代码后运行,发现视图中生成了table。