欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

unity3d作业二

程序员文章站 2022-04-07 17:30:04
...

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");

	}
}

测试结果
unity3d作业二
与说明文档相结合,可以得出以下结论
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 的部件

unity3d作业二
对象的属性在inspector的第一行,描述了对象的名称,Tag, Layer, Prefab
对象的Transform在紧接着的下一行,位置,旋转,比例
部件包括Transform,Mesh Filter,Box Collider,Mesh Renderer

用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)

unity3d作业二

资源预设(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/

unity3d作业二
unity3d作业二
此处提出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 / 一种设计模式)。

将一组相似对象作为单一对象,根据差别对对象进行分层组合,形成一个树形结构。

相关标签: 游戏