离散仿真引擎基础作业与练习

2023-11-19

作业内容



一、简答题

1. 解释 GameObjects 和 Assets 的区别与联系

  • 游戏对象(GameObjects) :游戏对象是unity场景中的所有实例的基类。GameObjects本身并不能完成很多工作,但他们通过作为组件的容器来实现真正的功能。
  • 资源:资源是可以在游戏或项目中使用的任何item的表示,例如3d模型、音频文件、图像或渲染纹理等。
  • 区别与联系:对象是一些资源的集合体,是资源整合的具体表现;资源可以被多个对象使用。游戏对象一般为玩家,敌人,环境等,而资源可组成游戏中所有的对象、被多个对象使用、作为模版实例化游戏中具体的对象。

2. 下载几个游戏案例,分别总结资源、对象组织的结构

  • 资源以文件夹(目录)的形式来组织结构,按照文件类型分类我们可以把他们放到不同的文件夹。资源的目录组织结构主要包括动画,文本,场景,素材,模型,预设以及使用说明等。
  • 游戏对象树通过层次结构来组织,通过整体-部分的关系构成层次结构,主要包括摄像机包,游戏开始位置,场景布局以及文本管理等。

3. 使用 debug 验证 MonoBehaviour 基本行为或事件触发条件

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

测试代码如下:
在这里插入图片描述
把上面的脚本加入到一个对象中运行,控制台结果如下:
在这里插入图片描述
结合上面的运行结果以及官方文档中对这几个函数作用机理的解释,可以知道函数的运行顺序以及触发条件分别是:

  • awake: 当该脚本实例被载入时Awake被调用。(只会被调用一次)
  • OnEable():当对象被启用并激活状态时此函数被调用
  • Start():当且仅在当第一次脚本启用Update方法被调用之前调用。(只会被调用一次)
  • Update():当MonoBehaviour启用时,其Update在每一帧被调用
  • FixedUpdate():按照设置的时间固定频率来循环更新
  • LateUpdate():LateUpdate是在所有Update函数调用后被调用。这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。
  • OnGUI():渲染和处理GUI事件时调用。
  • OnDisable():当对象变为不可用或非激活状态时此函数被调用。
  • OnEnable():当对象被启用并激活状态时此函数被调用

4. 了解 GameObject、Transform、Component 对象

  • 分别翻译官方对三个对象的描述

    • GameObject:

      Base class for all entities in Unity Scenes.
      unity场景中的所有实例的基类

    • Transform:

      Position, rotation and scale of an object
      用来定义对象的位置、旋转、以及缩放比例。

    • Component:

      Base class for everything attached to GameObjects.
      所有附加gameobjects的内容的基类

  • 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件
    在这里插入图片描述
    如图所示

    • table 实体的属性:
      activeInHierarchy:定义游戏对象是否在场景中处于活动状态。
      activeSelf:此游戏对象的本地活动状态。(只读)
      isStatic:仅限编辑器的API,用于指定游戏对象是否是静态的。
      layer:游戏对象所在的层。
      scene:游戏对象所属的场景。
      tag:游戏对象的标签。
      transform:附加到此游戏对象的transform
    • table transform 的属性:从右边 transform 面板中可以看到,transform 显示对象的位置、旋转角度,以及大小。table此时位于位置(0,0,0),旋转角度(0,0,0),大小(长宽高)为(1,1,1)。更多属性可以在官方文档中查询。
    • table 的部件:Mesh Filter、Box Collider、Mesh Renderer

  • 用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
    在这里插入图片描述

5. 整理相关学习资料,编写简单代码验证以下技术

  • 查找对象

    通过对象名称(Find方法) static GameObject Find (string name)
    通过标签获取单个游戏对象 static GameObject FindWithTag (string tag)
    通过标签获取多个游戏对象 static GameObject[] FindGameObjectsWithTag (string tag)
    通过类型获取单个游戏对象 static Object FindObjectOfType(Type type)
    通过类型获取多个游戏对象 static Object FindObjectsOfType(Type type)

    使用名称和标签分别编写简单代码进行查找
    在这里插入图片描述
    结果如下,查找成功
    在这里插入图片描述

  • 添加子对象

    函数:static GameObect CreatePrimitive(PrimitiveTypetype)

    使用代码在table下新建一把椅子
    在这里插入图片描述
    可以看到此时table下多了一个子对象new_chair,同时图像上也多出了一把椅子
    在这里插入图片描述

  • 遍历对象树
    代码
    在这里插入图片描述
    运行,可以看到输出了table下的四个子对象的名字
    在这里插入图片描述

  • 清除所有子对象
    代码
    在这里插入图片描述
    执行,可以看到原先table下的四张椅子都已经被清除了
    在这里插入图片描述

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

  • 预设(Prefabs)有什么好处?
    预设是组件的集合体 , 预设可以提前将设计游戏中所需要的游戏对象进行设计打包,成为一个模板。在设计的过程中,随时可以直接从资源当中加载,成为一个游戏对象。因此,创建预设体可以帮助我们很方便的重复创建具有相同结构的游戏对象。

  • 预设与对象克隆 (clone or copy or Instantiate of Unity Object) 的关系?
    预设是一个非常容易复用的类模板,可以迅速方便创建大量相同属性的对象。一旦需要修改所有相同属性的对象,只需要修改预设即可,所有通过预设实例化的对象都会做出相应变化。克隆只是复制一个一模一样的对象,这个对象独立于原来的对象,在修改的过程中不会影响原有的对象。

  • 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
    在这里插入图片描述
    在执行前需要把预制的table拖拽到右边脚本对应的位置obj上。
    在这里插入图片描述
    运行,可以看到table被成功实例化了
    **FFF,t_70**



二、编程实践—简单计算器

游戏内容: 简单计算器
技术限制: 仅允许使用 IMGUI 构建 UI
作业目的:

  • 提升 debug 能力
  • 提升阅读 API 文档 能力

1. 计算器的预期功能

  • 对数字进行加减乘除四种基本运算
  • 可以回退及清零
  • 拥有小数处理的能力

2. 计算器的实现步骤(代码)

  • 构建计算器的UI界面
    在这里插入图片描述
    OnGUI函数在前面已经介绍过,函数中的代码可以帮助我们在unity上创建一个简易的计算器的UI,其中变量compute_string用来保存需要计算的表达式。函数具体使用以及参数可以通过上面的链接参阅API文档。

  • 计算器功能实现
    为了让计算器能够有我们想要的功能,还需要添加几个函数进行支持。

    • 计算的具体实现函数 compute
      compute 函数对要计算的表达式 str 做处理,并返回计算结果。计算的大致流程为:预处理(分离数字与操作符)–>对优先级高的操作符进行计算(第一个for循环)–>对优先级低的操作符进行计算(第二个for循环)。
      其中,预处理的结果为,将数字和操作符按照输入顺序分别保存在List<float> numbersList<char> operators上;对操作符进行运算包括:取对应操作符两边的数字(如操作符位置为0,那么对应的操作数为 numbers[0] 和 numbers[1] ),保存运算结果,将对应位置的操作数删除/取代为新的计算结果,删除已完成计算的操作符,取操作符的 index 前移一位。其中最后一步是为了在删除操作符后下一次循环执行时能够取到正确的值。
      在这里插入图片描述

    • 预处理函数 pre_treat
      函数比较简单,处理的结果为分别保存数字和操作符。
      在这里插入图片描述

    • 判断函数is_number & is_operator
      很简单的两个函数,主要是辅助之前的操作。
      在这里插入图片描述

3. 在unity中查看运行效果

嗯,是一个一点都不花里胡哨的计算器。
在这里插入图片描述
经过检验计算器的使用是没问题的,就是界面“简易”了点。不过本次作业比较多,所以就暂且做到这里啦~

4. github地址与视频链接

https://github.com/xxxufj/unity3D-.git



三、思考题

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

  • 为什么是“模板方法”模式而不是“策略模式”呢?
    模板方法模式的主要思想是定义一个算法流程,并将一些特定步骤的具体实现延迟到子类。这使得可以在不改变算法流程的情况下,通过不同的子类来实现“定制”流程中的特定步骤。
    策略模式的主要思想是使不同的算法可以被相互替换,不影响客户端的使用。
    将模板方法和策略模式对比可以发现,模板方法更加强调算法流程是按照特定顺序被执行的,只不过其中某些部分可以变化(具体实现在子类中完成)。其实现主要是通过定义受保护的虚函数来定义可变化的地方。
    这样来看,微软 XNA 引擎的 Game 对象屏蔽了游戏循环的细节并使用一组虚方法让继承者完成的方法是完全符合模板方法定义的。

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

  • 试解释组合模式(Composite Pattern / 一种设计模式)。
    组合模式(Composite Pattern),又叫部分整体模式,用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次,创建了对象组的树形结构。

  • 使用 BroadcastMessage() 方法,向子对象发送消息。你能写出 BroadcastMessage() 的伪代码吗?
    在这里插入图片描述
    如图,控制台中输出了预期结果
    在这里插入图片描述

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

  • 是什么设计模式?
    装饰器模式(Decorator Pattern)

  • 为什么不用继承设计特殊的游戏对象?
    继承是实现类复用的重要手段,但却不是唯一的手段,通过类的关联组合同样可以做到,而且如果使用得当,会比通过继承更富有弹性。“装饰器模式”就是通过组合来实现类似复用和包装,这就是OO设计的另一个原则“合成复用原则”:尽量使用合成/聚合的方式,而不是使用继承。
    装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。它作为现有的类的一个包装,创建了一个装饰类用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

离散仿真引擎基础作业与练习 的相关文章

  • 设计模式七大原则

    1 设计模式的目的 编写软件过程中 程序员面临着来自耦合性 内聚性以及可维护性 可扩展性 重用性 灵活性 等多方面的挑战 设计模式是为了让程序 软件 具有更好 1 代码重用性 即 相同功能的代码 不用多次编写 2 可读性 即 编程规范性 便
  • linux内核中的设计模式

    创建型 Object Pool Object Pool模式可以提升性能 尤其是在对象的分配 初始化成本高 使用频率高 但使用时间短的情况下 对象池可以设置对象池的大小和回收时间缓存预分配的对象 NT和Linux都有简单的预分配缓存对象的机制
  • Unity里清除Console控制台Log的函数

    Log输出部分转发来自 http blog sina com cn s blog 13c4bf4b40102wz0r html 在控制台输出中 是开发者常用到的一种函数 通过Debug类来实现 打印字符串 Debug Log log 如果有
  • unity粒子特效附上贴图后播放动画

    转自 http jingyan baidu com article f96699bbb1a0d6894f3c1b77 html 参考 http www unitymanual com thread 2993 1 1 html dsign a
  • 单例模式的八种写法比较

    单例模式是最常用到的设计模式之一 熟悉设计模式的朋友对单例模式都不会陌生 一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式 但是除了这两种方式 本文还会介绍其他几种实现单例的方式 让我们来一起看看吧 简介 单例模式是一种常
  • unity中的一些快捷键(齐)

    重命名的快捷键是F2 ALT 鼠标左键点击Hierarchy对象可以展开和收起对象的所有子物体 SHIFT 空格 可以对当前窗口进行放大缩小
  • java-IO流(5)-IO流中的设计模式(装饰器模式和适配器模式)的介绍

    目录 1装饰器模式 1 1定义 1 2代码实现 1 3装饰器特点 1 4装饰器在IO流中的使用 2配适器模式 2 1Adapter适配器 2 2代码实例 2 3适配器特点 2 4适配器优缺点 2 5适配器在IO中的使用 3装饰器与适配器异同
  • Unity使用spine动画

    Unity使用spine动画 在 Unity 中 常常使用 Spine 来制作一些动画 引擎本身并不能直接播放 Spine 动画 需要额外导入一个 RunTime 插件库才能支持 官网插件导入 当然 也可以到 Spine 官网关于 Unit
  • Input.GetAxis _ Unity3d

    Input GetAxis 获取轴 static function GetAxis axisName string float Description描述 Returns the value of the virtual axis iden
  • [Unity XLua]热更新XLua入门(一)-基础篇

    Aladdin XLua 前言 前段时间腾讯开源了一个内部热更框架XLua在Unity开发群里引起一阵热议 也受到广大开发者的热捧 然后我当然也抱着好奇的心去学习学习 后面也会将扩展之后的工程放在git上 大家一起学习交流 在此感谢XLua
  • [设计模式]模板方法模式(Template Method)

    1 意图 定义一个操作中的算法的骨架 而将一些步骤延迟到子类中 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 2 动机 其实就是如意图所描述的 算法的骨架是一样的 就是有些特殊步骤不一样 就可以
  • 组合型模式

    概述 对于这个图片肯定会非常熟悉 上图我们可以看做是一个文件系统 对于这样的结构我们称之为树形结构 在树形结构中可以通过调用某个方法来遍历整个树 当我们找到某个叶子节点后 就可以对叶子节点进行相关的操作 可以将这颗树理解成一个大的容器 容器
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • 二十四种设计模式之策略模式

    一 什么是策略模式 简单来说 策略模式是将每一个算法封装到拥有共同接口的不同类中 使得算法可以在不影响客户端的情况下发生变化 也可以理解为可供程序运行时选择的 不同的类 不同的解决方案 策略模式的特点 高内聚低耦合 可扩展 遵循ocp原则
  • Java设计模式:模板方法模式

    作者主页 欢迎来到我的技术博客 个人介绍 大家好 本人热衷于 Java后端开发 欢迎来交流学习哦 如果文章对您有帮助 记得 关注 点赞 收藏 评论 您的支持将是我创作的动力 让我们一起加油进步吧 文章目录 一 模板方法模式的定义 二 模板方
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 设计模式(3)--对象结构(5)--外观

    1 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口 这个接口使得 这一子系统更加容易使用 2 两种角色 子系统 Subsystem 外观 Facade 3 优点 3 1 对客户屏蔽了子系统组件 减少了客户处
  • 2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

    微服务彻底改变了应用程序开发世界 将大型整体系统分解为更小 更易于管理的组件 这种架构风格的特点是独立 松散耦合的服务 带来了从可扩展性 模块化到更高的灵活性等众多优势 DevOps 团队如何最好地利用这种方法来实现最高效率 答案在于理解并
  • C++设计模式 --1.工厂模式和单例模式

    文章目录 1 工厂模式 简单工厂模式 工厂方法模式 抽象工厂模式 2 单例模式 懒汉式 饿汉式 1 工厂模式 简单工厂模式

随机推荐

  • 上海万应云——大数据精准招商系统

    上海万应云数字科技有限公司 基于全国企业大数据与企业特有的经营数据 进行动态分析与整合 形成如下几个业务领域 1 针对地方政府 产业园 形成产业政策分析 产业链路图谱 区域经济报告 高潜企业挖掘 全面把握当地的产业经济状况 投融资实际落地情
  • [JAVA]将Set转换成int[]数组

    今天在写练习的时候 碰到了方法的返回值为int 可我却使用的是HashSet来实现 想return发现类型对不上的问题 于是尝试了toArray方法 但toArray方法返回的是Object类或者是一个包装类 就找到了这个set转换成int
  • 动态一键换肤实现思路和demo

    前言 浏览器切换样式无非是通过css 总共有以下三种方法 内联style 注入style 注入link 那么我们想要实现一键换肤 那么我们为了剥离干净dom和css 我们只能选择style和link这两种方法 核心思路 在html的head
  • Java反射机制和线程

    JAVA反射机制 已经加载过这个类 通过类名来找到这个类的所有相关信息 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任意一个对象的成员变量和方法 生成动态代理 反
  • 远程桌面dos开启

    lt DOCTYPE html PUBLIC WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml strictdtd gt 注册表内容 Windows Registry Editor Versio
  • 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 前置知识 1 算法稳定性 在一个序列中 能保证两个相等的数 经过排序之后 其在序列的前后位置顺序不变 A1 A2 排序前 A1 在 A2 前面 排序后 A1 还在 A2 前面 2 时间复杂度 时间复杂度是用于衡
  • Sublimewebinspector 断点不能打上的解决方法

    最近老大在sublime上开发出了我们产品的开发包 这个开发包能像ZenCoding一样快速打出前端代码 这样开发者用我们产品的概率就大多了 但是对于产品中的js代码 现在还没有很好的工具 搬砖的我小有雄心壮志的想给我们的产品开发一个JS代
  • 生成专题4

    文章转自微信公众号 机器学习炼丹术 作者 陈亦新 欢迎交流共同进步 联系方式 微信cyx645016617 学习论文 Analyzing and Improving the Image Quality of StyleGAN 文章目录 4
  • vue学习语法校验笔记总结

    vue语法校验需要安装eslint plugins vue插件 插件安装完成后 进入 插件配置 即可找到刚才安装插件 它的对应的配置文件是 eslintrc js 选项对应说明如下 module exports extends plugin
  • ES6之Map和Set有什么不同?

    一 Map 1 定义 Map是ES6提供的一种新的数据结构 它是键值对的集合 类似于对象 但是键的范围不限于字符串 各种类型的值都可以当做键 Object结构是 字符串 值 的对应 Map结构则是 值 值 的对应 2 代码示例 Map本身是
  • Mybatis的注解方式开发

    目录 一 环境搭建与测试 二 注解方式的单表CRUD 三 注解方式的复杂关系映射 属性与列的对应关系 多表查询 一对一 一对多 四 注解方式使用二级缓存 前面的文章使用的都是XML配置的方式进行开发 当然 Mybatis也可以使用注解的方式
  • c++ for循环的新写法

    for循环遍历一个数组 string类 vector类等 老写法 include
  • gzip压缩的json文件在谷歌浏览器(chrome)中可以正常解析,但是在safari浏览器乱码

    gzip压缩的json文件在谷歌浏览器 chrome 中可以正常解析 但是在safari浏览器乱码 挺奇怪的一个问题 json数据通过gzip压缩之后 axios接收到的数据在chrome中是正常的 但是在safari中却是乱码 文件流 后
  • jsp页面中获取参数值

    1 GET方法用根据URL获取参数值 1 1 jsp页面 1 2 3 6 7 8 9 10
  • oracle 不完整恢复,Oracle——不完全恢复

    不完全恢复分为用户不完全恢复和RMAN不完全恢复 若联机重做日志文件或者归档日志文件有丢失 则只能进行不完全恢复 一 不完全恢复的分类 1 time recover选项 指定恢复到某个时间点 常用 2 cancel recover选项 停止
  • buuctf - crypto - Rabbit

    rabbit 加解密 在线Rabbit加密 Rabbit解密 在线工具
  • 把路由器设置为交换机或者二级路由设置联网

    五台电脑用了一个路由 还有一台没有连上 结果又买了一个路由 问问能把剩下的电脑接上吗 该怎么接法 1 做二级路由 把第二個路由器作为二级路由用 接线的方法就像你接第一个主路由器那样 从第一个路由器LAN口出来的一条网线接在第二个路由器的WA
  • 姿态估计之2D人体姿态估计 - (OpenPose) Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields

    参见 论文翻译 openpose magic ll的博客 CSDN博客 OpenPose论文解读 知乎 Openpose论文阅读 jmucvm的博客 CSDN博客 openpose论文总结 htt789的博客 CSDN博客 OpenPifP
  • ELK配置记录(filebeat+kafka+Logstash+Elasticsearch+Kibana)

    一 简介 elk日志平台 日志收集 分析和展示的解决方案 满足用户对 志的查询 排序 统计需求 elk架构 filebeat 采集 kafka Logstash 管道 Elasticsearch 存储 搜索 Kibana 日志应用 各组件功
  • 离散仿真引擎基础作业与练习

    作业内容 一 简答题 1 解释 GameObjects 和 Assets 的区别与联系 2 下载几个游戏案例 分别总结资源 对象组织的结构 3 使用 debug 验证 MonoBehaviour 基本行为或事件触发条件 4 了解 GameO