组件(Component)这个概念最早是在2005年《Game Programming Gems 5》的《Component Based Object Management》中接触到的,当时感觉在设计上很实用。后来,发现Unreal Engine 3的一个重要的改进就是抛弃了以前的基于纯派生关系的对象 模型 ,而转为使用 基于组件的对象 模型 。对于这种设计思想,Unity比Unreal贯彻的更彻底——一切皆Component。

那么到底什么是“基于组件”的对象 模型 ?它能够解决什么问题?

在传统的设计中,我们一般会使用“派生”来描述对象之间的关系。子类通过派生父类,来获得父类的功能。在设计游戏对象时,会根据游戏本身的需要而为游戏对象添加各种功能支持,比如渲染,碰撞,刚体,粒子系统等等。这些通用功能为了能够为各种派生类提供服务,都必须实现到基类中。这样就导致了游戏对象基类变得非常庞大臃肿,即难使用,又难维护。

”基于组件“的对象 模型 就是把所有需要提供给游戏对象的基础功能都独立成单独的”组件模块“(Component),一个具体的游戏对象可以将它需要的功能模块组合到一起使用。所有”功能“不再是父类中的接口,而变成子对象实例,为游戏对象提供服务。这样既保证了功能代码的可重用性,又增加了整个对象体系的模块化和灵活度。

在Unity中,GameObject除了作为Component的容器之外,基本上没有其他功能。所有需要的功能都要通过组合Component来实现。脚本本身也是Component,用来在GameObject上通过控制其他Component来实现自定义的功能。虽然这些Component在物理上是完全并列的关系,但是他们之间还是会有一定的层次关系的。在设计一个游戏对象的具体功能时,组件一般会被分为三个层次。

引擎的基础组件

Unity本身提供的各种内部功能组件。比如渲染组件,物理组件,声音组件等等。这些组件实现了所有引擎提供的基础功能,会被脚本使用来组合高级功能。

模块功能脚本组件

通过脚本实现的一些相对独立的通用模块功能的组件。这类 组件的设计 是脚本可重用的关键,需要仔细分析游戏对象中哪些功能可以被独立出来成为一个可重用的功能模块组件,并且在实现上应该尽量降低与其他组件的耦合性。比如在设计一个角色游戏对象时,需要为他设计换装功能。换装功能其实就是对显示子对象进行分组管理,切换显示状态。这个功能相对独立,与其将他实现到角色中,不如独立成一个功能模块组件。角色游戏对象和其他所有需要换装功能的游戏对象都可以通过包含这个模块组件来实现换装功能。

模块功能组件之间还可能有依赖关系,也就是一个功能模块组件可能依赖与另一个功能模块组件,从而在这个组件层次上形成更多的子层次。

高层的胶水代码脚本

这些脚本用来真正将引擎基础组件和模块功能组件组合到一起实现最终游戏对象逻辑。用“胶水代码”来形容这些脚本非常的贴切,就是把所有这些子功能“粘”在一起。比如设计一个Player脚本,将所有需要的组件功能组合起来,实现一个玩家的具体游戏逻辑。因为这一层次代表的都是最高层的游戏行为控制对象,是具体的游戏逻辑的“胶水”代码,不会再为更上层提服务,所以本身的可重用性并不高。但是这些对象之间按照类型区分,往往会有一些功能上的重合,所以反而可以继续使用派生关系来实现功能的重用。比如在Character中实现所有的基础功能(这些功能又是通过组合基础组件来实现的),而Player和NPC都从Character派生,来继承所有Character的功能,并继续实现自己特殊的功能。一个功能到底应该用组件实现还是用派生实现并没有非常明确的界限,应该根据需要灵活运用。

在使用Unity的过程中,如果要实现的是demo级别的小工程,并不需要考虑很多,直接用脚本实现功能就可以了。但是如果要有效地组织复杂的工程,提高代码的重用性,充分理解和合理的利用“基于组件”的对象 模型 设计思想还是很重要的。

Unity3D研究:Unity3D引擎架构设计相关推荐

  1. Unity3d 引擎原理详细介绍、Unity3D引擎架构设计

    体系结构 为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则. Unity3D 引擎 Unity3D的是一个屡获殊荣的工具,用于 ...

  2. Unity3d 引擎原理详细介绍、Unity3D引擎架构设计 - zhibolife

    时间 2014-03-24 11:18:00  博客园-所有随笔区原文  http://www.cnblogs.com/zhibolife/p/3620440.html 体系结构 为了更好地理解游戏的 ...

  3. Unity3d 引擎原理详细介绍、Unity3D引擎架构设计- zhibolife(转载分享)

    体系结构 为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则. Unity3D 引擎 Unity3D的是一个屡获殊荣的工具,用于 ...

  4. 3D引擎架构设计篇-姜雪伟-专题视频课程

    3D引擎架构设计篇-169人已学习 课程介绍         本课程是针对3D引擎架构设计,涵盖引擎的基础模块,多线程基础框架,大场景加载,地形多纹理优化技术,GPU优化渲染,物理引擎,AI算法以及A ...

  5. 基于时序数据的微内核预警引擎架构设计

    一个完整的监控生态体系包括"监.析.控"三个环节,预警平台作为偏"析"的一环,既要对监控数据做规则分析,又要为控制系统生成预警日志,起着承上启下的作用.监控平台 ...

  6. 3D引擎架构设计高级篇

    3D引擎架构设计最核心的技术包括:引擎框架设计,引擎内存管理,大场景加载以及卸载,引擎的渲染,模型骨骼插件:其他的模块还有粒子,AI,行为树,UI等等吧. 市场上对于引擎开发的需求也是比较大的,而且薪 ...

  7. 这是我见过最好的流程引擎架构设计!

    大家好,我是宝哥! 导读:本文为各位分享现代流程引擎的定义与架构设计. 1 什么是流程引擎 流程引擎是一个底层支撑平台,是为提供流程处理而开发设计的.流程引擎和流程应用,以及应用程序的关系如下图所示. ...

  8. Unity3D快速实现UI架构设计二

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  9. 基于linux的贪吃蛇游戏设计_基于ECS的游戏引擎架构设计「译」

    摘要 游戏编程设计和组织是困难而复杂的,为了简化开发进程,会使用被称为游戏引擎的游戏框架(framework),该框架包含了一组实用工具.本项的目的是探索游戏引擎设计和开发一个模块化和可扩展的游戏引擎 ...

最新文章

  1. ubuntu下载搜狗输入法并设置开机自启动
  2. 论文解读 | 基于正则化图神经网络的脑电情绪识别
  3. Android studio git 本地仓库和远程仓库节点对比
  4. 为什么需要超过48k的采样音频?
  5. QGIS中如何加载identify
  6. 履带式机器人运动模型及应用分析(图片版)
  7. linux7重启network,mmp的 rhel7 network重启一直失败,求原因!!!
  8. 倾角传感器原理及市场现状浅析
  9. 大华海康NVR录像JAVA下载及WEB播放
  10. Python 微信自动发送消息
  11. 《SEM长尾搜索营销策略解密》一一1.5 互联网时代,世界不再匮乏
  12. Git之http方式永久保存用户名密码
  13. JAVA学习DAY3 - 循环 输出平行四边形,等腰三角形,菱形
  14. 数据标注软件labelme详解
  15. 【渝粤教育】国家开放大学2018年春季 0553-21T色彩 参考试题
  16. Origin画图技巧之设置框图默认设置
  17. 用pip freeze >requirements.txt命令迁移模块
  18. 数智经济转型下如何抢占文创发展新机遇?中国移动咪咕聚焦新一代年轻人需求
  19. ConcurrentMap
  20. 分清规范化(标准化、归一化)、离散化、正则化、

热门文章

  1. 选择法排序的两种方法
  2. 双 JK 触发器 74LS112 逻辑功能。真值表_时序逻辑电路设计(一):同步计数器...
  3. bimface 生成曲线路劲
  4. Adobe Flash CS6 配置错误,错误代码:1
  5. android NDK编译openblas和向量检索库faiss
  6. Win10系统修复工具(联想win10系统修复工具)+资源
  7. vmware Workstation设置bios启动
  8. oracle 查询上级,通过sql语句递归查找所有下级或上级用户
  9. 搭建Freekan私人影视电影网站,cpolar内网穿透发布上线
  10. AURIX TC3xx Safety Mannaul