目录
1.简答题
(1)解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系。
区别:游戏对象是直接出现在场景中的,可以被玩家看到并且进行操作的,是组成游戏场景的基本部分,如玩家、敌人、环境等;资源是用于修饰游戏对象的,赋予对象一定特殊属性的,如Materials、Script、Sound等。
联系:对象是资源整合的具体表现,一个对象可以利用一个或多个资源,一个资源也可以被一个或多个对象利用。
(2)下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
在网络上随便找到一个游戏项目,这里找到的是MiniCar
资源目录结构如下:
除了这些以外,还有Sound、Image类的资源,可见资源文件并不是一类文件,而是由一大类可以被继续划分为小类的文件。
对象组织如下:
可以看到,该游戏下又可能会含有许多子对象,子对象可能还由多个子对象构成,这就是所说的游戏对象树的层次结构。
(3)编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件
check脚本代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class check : MonoBehaviour
{
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");
}
void FixUpdate(){
Debug.Log("FixUpdate");
}
void LateUpdate(){
Debug.Log("LateUpdate");
}
void OnGUI () {
Debug.Log("OnGUI");
}
void OnDisable () {
Debug.Log("OnDisable");
}
void OnEnable () {
Debug.Log("OnEnable");
}
}
根据文档各个函数的触发条件为:
Awake:脚本被实例化时调用;
Start:在该游戏对象刚开始被创建时调用;
Update:每帧调用一次;
FixedUpdate:按照自设定的频率执行;
LateUpdate:在bahaviour为enabled的时候,该帧结束的时候调用;
OnGUI:渲染GUI的时候调用;
OnDisable() 当行为变得无效的时候被调用;
OnEnable() 当对象启用并激活的时候被调用;
运行结果:
之后的调用都是Update、OnGUI和LateUpdate。
(4)查找脚本手册,了解 GameObject,Transform,Component 对象
(a)分别翻译官方对三个对象的描述(Description)
Game Object:Base class for all entities in Unity Scenes.
翻译:Unity Scenes中所有实体的基类。
Transform:Position, rotation and scale of an object.
翻译:一个object的位置、旋转和尺寸。
Component:Base class for everything attached to GameObjects.
翻译:所有附加到Game Object上的东西的基类。
(b)描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件
table的属性有:activeSelf(active),tag(Untagged),Layer(Default),Prefab(unchosen),Transform(具体值如下)
Transform的属性:分为三种,Position(位置)为(-2,0,0),Rotation(旋转)为(0,0,0),Scale(尺寸)为(1,0.2,1);
部件有:Mesh Filter,Box Collider,Mesh Renderer
(c)用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
(5)资源预设(Prefabs)与 对象克隆 (clone)
(a)预设(Prefabs)有什么好处?
预置是类似于生成一个游戏对象的模板,在之后需要创建相同的对象时可以直接调用预设,从而使得对象和资源可以重复利用,而且在需要修改对象的时候只需要修改预设即可。
(b)预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
预设和克隆都是通过复制产生游戏对象,而克隆需要当前场景已经存在游戏对象,预设设置好之后不需要有相应游戏对象;除此之外,克隆产生的游戏对象是相互独立的,可以任意修改其中的某一个对象,而如果修改预设则会导致所有对象改变。
(c)制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class prelab : MonoBehaviour
{
public GameObject table;
// Start is called before the first frame update
void Start()
{
GameObject prefabTable = (GameObject)Instantiate(table.gameObject);
}
// Update is called once per frame
void Update()
{
}
}
2.编程实践——井字棋
项目实现比较简单,将脚本编写好之后直接拉到camera中运行即可。
具体代码参考GitHub
效果如下:
平局
X获胜
O获胜