unity3d作业二
1.简单题
解释游戏对象(GameObjects)和资源(Assets)的区别与联系。
对象是资源整合的表现,具有自身的属性和行为,直接出现在游戏场景中,例如一个方块,一块地板,一个太阳,摄影机等
资源是一种素材,可用于对象中,比如前面所述的对象地板,那我可以为地板涂上一个木材质地的贴图,改变外观,资源包括脚本,声音,场景等。
资源对对象起了美化,装饰,增强功能等作用,被对象使用。
下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
资源的组织结构:通过目录结构将资源分类,分在不同的文件夹中,比如动画,音乐,文本,图片等
对象按照层次结构组织,从摄影机,地板,物件,文本等,从整体到部分。
使用 debug 验证 MonoBehaviour 基本行为或事件触发条件
编写测试代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class test : MonoBehaviour {
// Use this for initialization
void Awake () {
Debug.Log("Awake");
}
void Start () {
Debug.Log("Start");
}
void FixedUpdate () {
Debug.Log("FixedUpdate");
}
void OnGUI () {
Debug.Log("OnGUI");
}
void LateUpdate () {
Debug.Log("LateUpdate");
}
void OnDisable () {
Debug.Log("OnDisable");
}
void OnEnable () {
Debug.Log("OnEnable");
}
// Update is called once per frame
void Update () {
Debug.Log("Update");
}
}
测试结果
与说明文档相结合,可以得出以下结论
awake: 脚本载入时被调用。
Start:第一次脚本启用Update被调用之前调用。
OnEable:当对象被启用时被调用
OnDisable:当对象变为不可用时被调用。
OnEnable():当对象被启用时被调用
Update:当start启用后,在每一帧被调用
FixedUpdate:按照固定频率更新
LateUpdate:在所有Update函数调用后被调用
OnGUI:渲染和处理GUI事件时调用
查找脚本手册,了解GameObject,Transform,Component 对象,分别翻译官方对三个对象的描述(Description)
GameObject: 基本对象。他们的主要工作是充当组件的容器去实现真正的功能。
Transform: 用来决定每个对象的位置、旋转角度和比例。每个GameObject都有Transform。
Component: 组件是游戏中对象和行为的细小部分。它们是每个游戏对象的组成部分。
描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件
对象的属性在inspector的第一行,描述了对象的名称,Tag, Layer, Prefab
对象的Transform在紧接着的下一行,位置,旋转,比例
部件包括Transform,Mesh Filter,Box Collider,Mesh Renderer
用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
资源预设(Prefabs)与 对象克隆 (clone)
预设(Prefabs)有什么好处?
主要是为了效率考虑,使用预设就是提前将常用对象进行打包,方便后期游戏制作和debug
预设与对象克隆 (clone or copy or Instantiate of Unity Object) 的关系?
预设是一个模板,可以很容易的创建出相同属性的对象,修改属性的时候也可以同意修改; 克隆则是创建一个跟原有对象一样的对象,是个独立的个体
制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
直接使用instantiate函数
public class Table: MonoBehaviour
{
public GameObject table = null;
void Start()
{
instantiate(table);
}
void Update
{
}
}
编程实践——测试反应力的小游戏:
实现原理很简单,开始设置随机数r,在经过r后提示玩家点击按键,并且开始计时,当玩家按下按键之后记录下玩家的反应时间。
完整代码段请到我的github上观看https://github.com/kisekizzz/unity3d-learning/
此处提出Update的代码段分析:
void Update () {
if(flag == 1){ //游戏开始
time_unit = Time.deltaTime;
//action = string.Format("{0}s",start_delay);
if(start_delay >= rd){ // rd是开始计时的时间,每次开始游戏都会在一个随机时间后开始
action = "点击tap!!!!!!!!"; //玩家此时要点tap按钮
count += time_unit;
final = string.Format("{0}s",count);
}
else{
start_delay += time_unit;
action = "请准备";
}
}
if(flag == -1){ //如果玩家提前点了,flag置为-1
action = "提前点击,失败了";
}
if(flag == 0){ //正常结束
action = "游戏结束";
count = 0;
start_delay = 0;
rd = UnityEngine.Random.Range(1, 6);
}
if(flag == 2){
action = "测试你的反应时间,点击start开始游戏";
}
}
思考题
1. 微软 XNA 引擎的 Game 对象屏蔽了游戏循环的细节,并使用一组虚方法让继承者完成它们,我们称这种设计为“模板方法模式”
为什么是“模板方法”模式而不是“策略模式”呢?
XNA引擎提供虚方法让继承者完成,相当以一个模板继承者根据父类去实现自己的其他功能,因此是模板方法模式。
2. 将游戏对象组成树型结构,每个节点都是游戏对象(或数)
试解释组合模式(Composite Pattern / 一种设计模式)。
将一组相似对象作为单一对象,根据差别对对象进行分层组合,形成一个树形结构。
上一篇: 为什么"亚洲第一程序员"亚一程是鸟哥?
下一篇: 俄罗斯方块小游戏制作: