1、简答题
-
解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系。
游戏对象(GameObject)指的是一个能够容纳实现实际功能的组件。
资源(Assets)指的是在游戏中可能用到的各种东西,比如模型、声音文件、贴图文件等等。
联系在于游戏对象可以保存为资源,资源可以实例化为游戏对象。 -
下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
通过下载一个射击小游戏和一个赛车小游戏,总结发现
资源的目录组织结构主要包括动画,文本,场景和一些使用说明等。
游戏对象树的层次结构包括摄像机,开始位置,场景布局以及文本等。 -
编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件
(1)基本行为包括 Awake() Start() Update() FixedUpdate() LateUpdate()
(2)常用事件包括 OnGUI() OnDisable() OnEnable()
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript :
MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Debug.Log("start\n");
}
// Update is called once per frame
void Update()
{
Debug.Log("update\n");
}
private void Awake()
{
Debug.Log("awake\n");
}
private void FixedUpdate()
{
Debug.Log("fixedupdate\n");
}
private void LateUpdate()
{
Debug.Log("lateupdate\n");
}
private void OnGUI()
{
Debug.Log("ongui\n");
}
private void OnDisable()
{
Debug.Log("ondisable\n");
}
private void OnEnable()
{
Debug.Log("onenable\n");
}
}
运行结果如下:
-
查找脚本手册,了解 GameObject,Transform,Component 对象
分别翻译官方对三个对象的描述(Description)
GameObject是Unity场景里面所有实体的基类。但是它本身不能做任何事情,在它成为一个角色之前需要给他一个特征、环境或者特殊的影响。
Transform被用来储存一个游戏对象的位置、旋转角度、大小。每个GameObject都会有一个Transform组件依附。
Component是游戏中对象和行为的螺母和螺栓,是一切附加到游戏物体的基类。描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件
第一个选择框是activeSelf:可以定义对象的名称,动静态等属性
第二个选择框是Transform:可以定义对象的位置、面向方向、大小
第三个选择框是Box Collider:可以调整坐标系的位置、大小
第四个选择框是Component:可以给对象增加行为用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
-
资源预设(Prefabs)与 对象克隆 (clone)
预设(Prefabs)有什么好处?
预设相当于一个对象的模板,预设的存在,方便了面向对象思想的应用,方便我们在设计游戏中更加便捷。预设使得修改的复杂度降低,一旦需要修改所有相同属性的对象,只需要修改预设即可,所有通过预设实例化的对象都会做出相应变化。预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
克隆是将已经存在的游戏对象,或者是资源当中的预设进行复制。克隆可以是对已经添加在视图当中的游戏对象进行复制,也可以是对资源当中,我们提前预设好的模板进行克隆。所以,修改预设会使通过预设实例化的所有对象都做出相应变化,而对象克隆本体和克隆出的对象是不相影响的。
2、 编程实践,小游戏
-
游戏内容: 井字棋 或 贷款计算器 或 简单计算器 等等
-
技术限制: 仅允许使用 IMGUI 构建 UI
-
作业目的:
了解 OnGUI() 事件,提升 debug 能力
提升阅读 API 文档能力关键代码解析
主要通过OnGUI函数控制整个游戏过程
private void OnGUI()
{
GUI.skin.button.fontSize = 20;
GUI.skin.label.fontSize = 20;
if (GUI.Button(new Rect(300, 250, 150, 50), "Reset"))
{
num = 0;
turn = 1 - turn;//轮流下第一个
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
map[i, j] = 0;
}
}
}
int win = getwin();
if(win==1) GUI.Label(new Rect(350, 50, 100, 50), "O wins");
else if(win==2) GUI.Label(new Rect(350, 50, 100, 50), "X wins");
else if(win==3) GUI.Label(new Rect(350, 50, 100, 50), "Draw");
for (int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(map[i,j]==1)
{
GUI.Button(new Rect(i * size + 300, j * size + 100, size, size), "O");
}
else if(map[i,j]==2)
{
GUI.Button(new Rect(i * size + 300, j * size + 100, size, size), "X");
}
else if(GUI.Button(new Rect(i * size + 300, j * size + 100, size, size), ""))
{
if (win == 0)
{
if (turn == 0)
{
map[i, j] = 1;
}
else map[i, j] = 2;
turn = 1 - turn;
num++;
}
}
}
}
}
当每个玩家下完后都会判断接下来轮到谁下了,所选位置是否可以下,是否有人获胜,获胜或者平局应该出现相应的提示,还有就是通过点击reset重新开始游戏。