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

02-离散仿真引擎基础

程序员文章站 2022-09-10 12:43:50
Homework02简答题1. 解释游戏对象(GameObjects)和资源(Assets)的区别与联系区别:游戏对象是具有一定属性与功能的类的实体化,对应为Unity中具有对应职能与属性的组件,例如游戏中常见的玩家、怪物等;资源是预先准备好的模型、图片、音乐等,可以直接并重复使用联系:资源可以添加到游戏对象作为其一部分,而游戏对象可以保存作为一种资源以便捷地重复使用2. 下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)从资源网站下载愤怒的小鸟、...

Homework02

简答题

1. 解释游戏对象(GameObjects)资源(Assets)的区别与联系

  • 区别:游戏对象是具有一定属性与功能的类的实体化,对应为Unity中具有对应职能与属性的组件,例如游戏中常见的玩家、怪物等;资源是预先准备好的模型、图片、音乐等,可以直接并重复使用
  • 联系:资源可以添加到游戏对象作为其一部分,而游戏对象可以保存作为一种资源以便捷地重复使用

2. 下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)

资源网站下载愤怒的小鸟赛车游戏保龄球台球资源后分析总结如下,以愤怒的小鸟为例

资源目录组织结构一般包含Animation(动画)Matreias(材料)Prefab(预制)Scene(场景)Scripts(脚本-即C#代码)Sprites(精灵-即对象)

02-离散仿真引擎基础
游戏对象树层次结构一般包含Camera(摄像头)Background(背景)Light(灯光)和一些自定义对象等等

02-离散仿真引擎基础

3. 编写一个代码,使用debug语句来验证MonoBehaviour基本行为或事件触发的条件

  • 基本行为包括 Awake()、Start()、Update()、FixedUpdate()、LateUpdate()
  • 常用事件包括 OnGUI()、OnDisable()、OnEnable()

编写代码如下并将其添加到Main Camera,点击运行结果见下图:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
    // 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 Awake()
    {
        Debug.Log("Awake");
    }

    void FixedUpdate()
    {
        Debug.Log("FixedUpdate");
    }

    void LateUpdate()
    {
        Debug.Log("LateUpdate");
    }

    void OnGUI()
    {
        Debug.Log("OnGUI");
    }

    void OnDisable()
    {
        Debug.Log("OnDisable");
    }

    void OnEnable()
    {
        Debug.Log("OnEnable");
    }
}

02-离散仿真引擎基础

  • Awake() 在脚本实例被加载时即被调用
  • Start() 仅在Update函数第一次被调用前调用
  • Update() 每一帧触发一次
  • FixedUpdate() 在自设定的帧频下,每一帧触发一次
  • LateUpdate() 当Behaviour是enabled的情况下,在所有Update函数调用后被调用
  • OnGUI() 当渲染和处理GUI事件时被调用
  • OnDisable() 当行为变得无效的时候被调用
  • OnEnable() 当对象启用并激活的时候被调用

4. 查找脚本手册,了解GameObject,Transform,Component对象

  • 分别翻译官方对三个对象的描述(Description)
  • GameObject: Unity场景中所有实体的基类
  • Transform: 物体的位置,选择角度及比例
  • Component: 所有附加在GameObject上的事物的基类
  • 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、table 的部件

    • 本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API。
    • 例如:table 的对象是 GameObject,第一个选择框是 activeSelf 属性。

    02-离散仿真引擎基础

  • table 对象(实体)的属性: 红框框住的五个为对象属性,从左到右、从上到下依次为sctiveSelf-该对象是否显示/渲染、table-为当前对象名称,可自定义、Static-选中表示该对象为静态,运行时不移动、Tag-对象的标签,可用于分类、Layer-对象的层,通常被摄像机用来渲染部分场景,和灯光照射部分场景使用
  • table 的 Transform 的属性: Position-位置、Rotation-旋转角度、Scale-缩放比例
  • table 的部件: 本示例对象含有TransformCubeMesh RendererBox Colloder等部件,可以通过Add Component按钮添加或右键删除
  • 用UML图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
    02-离散仿真引擎基础

5. 资源预设(Prefabs)与对象克隆(clone)

  • 预设(Prefabs)有什么好处?

预设有利于资源重用,减少工作量。当需要重复用到一个对象或一组数据时,我们可以预设一个对象作为模板,就可以很方便的重复使用。所以无论工程中有多少个实例,当我们对预设做出更改时,这些更改会运用与所有实例,这就使得游戏制作起来更加高效和便捷(类似宏定义)

  • 预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?

预设:产生的对象与预设的对象是联系的,当修改预设时,它产生出来的对象也会被修改,类似与指针。克隆:克隆体和母体之间是独立的,相互不干扰,类似于C++中的值拷贝。

  • 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象

如下图,参考课件步骤制作好table后将其拖进Assets则会自动生成table预制

02-离散仿真引擎基础

将 table 预制资源实例化成游戏对象的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class createTable : MonoBehaviour
{
    public GameObject table;
    // Start is called before the first frame update
    void Start()
    {
        GameObject temp = (GameObject)Instantiate(table, transform.position, transform.rotation);
        temp.name = "instance";
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

createTable添加到Main Camera,并把之前做好的table预制拖入选择框

02-离散仿真引擎基础

点击运行效果如下:

02-离散仿真引擎基础

编程实践

实现了井字棋小游戏,由于篇幅原因,详见此博客

思考题

1. 微软XNA引擎的Game对象屏蔽了游戏循环的细节,并使用一组虚方法让继承者完成它们,我们称这种设计为“模板方法模式”。

  • 为什么是“模板方法”模式而不是“策略模式”呢?
  • 模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  • 策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。强调的是内部变化与外部的分离,降低耦合度。
  • 模板方法模式更适合屏蔽游戏循环细节这种有多个子类共有的方法,且逻辑相同的场景

2. 将游戏对象组成树型结构,每个节点都是游戏对象(或数)。

  • 尝试解释组合模式(Composite Pattern / 一种设计模式)。
  • 定义:组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
  • 关键点:树枝和叶子实现统一接口,树枝内部组合该接口。
  • 优点:高层模块调用简单、节点*增加
  • 缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
  • 适用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。
  • 使用 BroadcastMessage() 方法,向子对象发送消息。你能写出 BroadcastMessage() 的伪代码吗?
void BoradcastMessage(string message) {
    foreach (child) {
        Debug.Log(message);
    }
}

3. 一个游戏对象用许多部件描述不同方面的特征。我们设计坦克(Tank)游戏对象不是继承于GameObject对象,而是GameObject添加一组行为部件(Component)。

  • 这是什么设计模式?

桥接模式(Bridge)

  • 为什么不用继承设计特殊的游戏对象?
  • 继承容易导致类与类之间结构混乱
  • 继承具有较高的耦合度、灵活性不高,父类游戏对象发生改变时子类也会跟着变
  • 桥接模式更有利于统一各组件的接口,管理不同类相同行为组件的属性,又不会导致组合爆炸。
  • 桥接模式耦合度低,当部分功能被修改时,不会影响到外部其他部件的功能。

参考资料
模板模式
策略模式
桥接模式
组合模式

本文地址:https://blog.csdn.net/try17875864815/article/details/108587071