3D Homework1
一、简答题
1.解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系。
游戏中出现的任何对象实例均为游戏对象,比如人、桌子等游戏中的实物。而资源则是游戏存储在硬盘中的文件,如图片、视频、音频、脚本等。
游戏对象描述了具体的资源实例,资源文件中可包含一个或多个游戏对象。
2.下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
案例一:Roll-a-ball
- 资源的目录组织结构:根目录下有README、游戏目录和游戏有关素材目录。素材目录下则有游戏图标和版本信息等文件。游戏目录下则有unity编辑文件、Script文件夹、Prefabs文件夹和Materials文件夹,Prefabs中包含了预制对象,Materials中则存放了一些游戏对象的图片样式,Script文件夹中存放了与游戏逻辑业务相关的C#代码。
- 游戏对象树的层次结构:光源、地面、操控对象、摄像机、墙和食物等游戏对象处于同一层次,均为第一层。而墙的游戏对象中又包含东、南、西、北四面不同的墙。同样,食物游戏对象中又有12个不同的子对象。
案例二:SpaceShooter
- 资源的目录组织结构:与案例一相似,根目录下只是多了Audio、Models等文件夹来存放不同类型的素材。除此之外,在游戏目录里,有两个unity文件。其他文件夹所存放文件类型与案例一中的游戏相同。
- 游戏对象树的层次结构:这个游戏的游戏对象主要有Background、Game-controller、Boundary、石头、飞机等,其中预制的石头、飞机等游戏对象需多次调用。
3.编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件。
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class hello : MonoBehaviour {
// Use this for initialization
void Start () {
Debug.Log("Start");
}
private void Awake()
{
Debug.Log("Awake");
}
// Update is called once per frame
void Update () {
Debug.Log("hello world");
}
}
运行结果:
Awake:程序一开始调用一次
Start:Awake之后调用一次
Update:每一帧被调用一次
4.查找脚本手册,了解 GameObject,Transform,Component 对象。
a) 分别翻译官方对三个对象的描述(Description)
GameObject:
从角色和收藏品到光线、摄像头和其他的物品,游戏中的每个物体都是一个游戏对象。
Transform:
Transform决定了视图中每一个物体的位置、旋转和缩放。每个游戏对象都有一个Transform。
Component:
Component是一个游戏中对象和行为的组件,它们是每个游戏对象的基本元素。
b) 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件
属性:一个游戏对象的属性由多个Component部件组成。
Transform属性:位置属性(在坐标原点处)、旋转属性(未设置旋转)、缩放属性(为大小为1的立方体)
Component:部件列表中的cube代表的是此游戏对象的形状是立方体。box-collider则设置了游戏对象的碰撞属性,碰撞的中心点设为了坐标原点,碰撞的有效体积则设为1。Mesh-Renderer表示游戏对象的网格渲染。
c) 用 UML 图描述 三者的关系。
5.整理相关学习资料,编写简单代码验证以下技术的实现:
查找对象:
void Start () {
var obj = GameObject.Find("Chair");
if(obj != null)
Debug.Log("Find seccessed!");
else
Debug.Log("Find failed!");
}
结果输出为“Find seccessed!”,查找成功。
添加子对象:
void Start () {
print("hello");
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.name = "a cube";
cube.transform.position = new Vector3(0, Random.Range(0, 5), 0);
cube.transform.parent = this.transform;
}
结果在“init”对象下生成了“a cube”子对象。
遍历对象树:
void Start () {
object[] gameObjects;
gameObjects = GameObject.FindObjectsOfType(typeof(Transform));
foreach (Transform iter in gameObjects)
Debug.Log(iter.name);
}
结果输出了游戏中所有对象的名字。
删除所有子对象:
void Start () {
for (int i = 0; i < transform.childCount; i++)
Destroy(transform.GetChild(i).gameObject);
}
结果“init”对象中的两个“sub”子对象均被删除。
6.资源预设(Prefabs)与 对象克隆 (clone)
a) 预制的好处:
1. 可以快速、方便的创建大量可以重复使用的资源。
2. 可以在程序运行时来执行实例化操作,可以提高程序运行效率和节省内存空间。
b) 预制与对象克隆关系:
1. 相同点:两者均可以用于对象的复制相同的游戏对象。
2. 不同点:预制可以快速进行批量复制对象,但对象克隆往往用来复制少量的对象。
c) 预制实例化:
void Start () {
GameObject contain = GameObject.Find("init");
GameObject obj = (GameObject)Resources.Load("tb");
GameObject pre_table = Instantiate(obj);
pre_table.transform.position = new Vector3(0, Random.Range(5, 7), 0);
pre_table.transform.parent = contain.transform;
}
结果在原来的table上方出现了一个一摸一样的table。
7.尝试解释组合模式(Composite Pattern / 一种设计模式)。
Composite Pattern:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
BroadcastMessage() 方法向子对象发送信息:
父对象代码:
this.BroadcastMessage("sendFromInit", "Zhuangwz is handsome!");
子对象代码:
public void sendFromInit(string s){
Debug.Log(s);
}
输出结果为(“Zhuangwz is handsome!”)。