Unity3d引擎原理详细介绍

2016年12月06日 11:46 0 点赞 0 评论 更新于 2025-11-21 20:58
Unity3d引擎原理详细介绍

体系结构

为了更好地理解游戏的软件架构和对象模型,深入了解Unity3D游戏引擎和编辑器的主要原则是非常有帮助的。

Unity3D引擎

Unity3D是一款屡获殊荣的工具,用于在多个平台创建交互式3D应用程序。它由游戏引擎和编辑器两部分组成。

游戏引擎包含了在游戏研发中常见且频繁使用的软件组件,涵盖的主题包括声音、图形、物理和网络功能等。该引擎支持C#、Boo和JavaScript脚本编程。

编辑器作为脚本和其他组件的集成开发环境,包含游戏场景设置和游戏预览窗口。它配备了多个多语言脚本编辑器和独特的预制装配系统,后续会详细解释。

Unity3D编辑器

Unity有多种许可证。基础版本提供有限功能,可免费用于PC、Mac和Web开发;若要在其他平台使用或获取完整功能集,则需要购买额外的许可证。

尽管有许多免费软件和专有游戏引擎可供选择,如虚幻引擎™或C4™引擎,但选择Unity的原因如下:

  • 多平台部署:可部署在Windows、Mac OSX、Web浏览器、Wii游戏机、iPhone、iPad、Android、微软Xbox 360和PlayStation 3等平台,未来还计划增加闪存和Linux部署。丰富的部署可能性为游戏引擎的使用、货币化和进一步研究提供了更多机会。
  • 社区支持与文档完善:Unity社区提供了强大的支持,引擎和编辑器的文档也非常详尽。
  • 易于学习和开发:该引擎相对容易学习和使用,提供的所有工具支持快速原型开发和迭代,脚本编译速度快,有助于实现快速软件开发的想法。
  • iOS平台成本优势:使用基本许可证即可部署到iPhone、iPad和iPod touch等iOS设备,与其他厂商相比,价格相对低廉。例如,可以使用Unity 3.0、C#脚本和MonoDevelop的IDE来创建机甲和坦克游戏,相关教程可在附录中找到。

Unity3D的简史

以下日期展示了2001年至2011年期间Unity引擎的演变历程:

  • 2001年:Unity技术开始开发自己的游戏引擎,主要目的是创建优秀的游戏并打造良好的开发工具。
  • 2003年:公司认为开发出的引擎本身将是一款出色的产品。
  • 2005年:Unity 1在苹果的全球开发者大会(WWDC)舞台上推出。
  • 2007年:Unity 2.0发布,增加了地形引擎、实时动态阴影和视频播放等功能。
  • 2008年:推出Unity的iPhone版本,卡通网络推出的游戏FusionFall播放量超过800万人次。
  • 2010年:Unity 3.0发布,带来了几十个新功能,如资产管理和兽光照贴图。
  • 2011年:Unity拥有超过500万开发者,60万网络播放器安装量。

游戏架构

机甲和坦克游戏的架构由模块和Unity场景架构组成。

主要模块

本节介绍游戏中最重要的模块及其子系统之间的关系。游戏采用对象与数据胶囊的架构风格,下面的UML组件图展示了子系统及其网络关系。

游戏逻辑

该模块负责管理当前玩家和AI的配置、倒计时计时器以及当前的游戏状态(如暂停、等待网络回复等)。

AI(人工智能)

AI模块包含逻辑单元、组和玩家AI。单位AI通过不同的转向行为控制单元状态,实现寻路或障碍物规避;组AI管理组的行为和活动,如组寻路;玩家模块在更高层次上管理玩家的所有组。人工智能机器学习通过持久性数据模块的接口保存和加载数据。

持久性数据

此模块负责不同游戏会话之间的数据管理,可用于保存和加载数据、存储查找表、为寻路模块提供图信息以及管理机器学习AI的累积数据。

游戏参与者

游戏参与者包括游戏中的地形、单位或建筑物,它们的3D模型通过Unity3D的渲染管线进行可视化。每个游戏参与者都有一个AI模块来控制其行为。

指导行为

指导行为用于计算影响自主游戏代理移动方式和速度的力量,可用于避障、人流控制或简单的寻找任务。

寻路

该模块负责创建路径网格、收集障碍物信息,并为各种寻路请求提供接口。为了提高性能,部分信息会保存到磁盘中以便加载。

输入

此模块跟踪用户输入,对其进行处理并生成反馈。

网络

网络模块负责管理所有游戏参与者的状态,确保两台机器上的游戏状态保持一致,避免网络单元运动抖动。

GUI(图形用户界面)

GUI显示所有按钮、菜单、小地图和倒计时计时器等元素,并负责这些元素的功能和交互,其依赖于游戏逻辑模块实现相应功能。

3D渲染

该模块主要管理Unity3D的场景渲染。主摄像头确定需要渲染的对象,并将它们发送到渲染管线。Unity3D封装了大部分渲染细节,同时也提供了通过像素和顶点着色器进行访问的途径。

Unity场景设置

游戏中的每个地图都由Unity3D的场景表示。以下是Unity层次结构和场景窗口中典型的场景设置:

  • Unity层次的地图:展示了游戏对象的层次结构。
  • 场景视图的地图:呈现了场景的实际视图。

下面对从顶部面板到底部的所有游戏对象进行说明:

  • CWalls:包含自定义绘制的墙节点和墙壁边缘,可根据地图几何信息进行计算。
  • Directional light(定向光):仅用于计算地形光照贴图,为了性能考虑,通常会关闭。
  • Game Music(游戏音乐):存储游戏的主要音乐,在场景启动时播放。
  • GameController(游戏控制器):持有并管理所有游戏对象,负责游戏逻辑的管理,包含以下子对象:
  • CursorController(光标控制器):管理光标的外观和逻辑。
  • GameInstantiator(游戏实例化):负责按非特定顺序实例化其他对象,持有地图、路径创建和管理障碍信息,管理玩家配置和设置,处理用户输入,还包含玩家重生点和自定义路径、墙壁的引用。
  • GUI:包含地图的所有GUI对象。
  • Machine Learning Controller:控制机器学习所需的所有功能。
  • spawn1, spawn2:实际玩家的重生点,在场景视图中以绿色立方体表示。
  • HPaths:地图边缘的自定义路径节点,在场景编辑器中以红线标记。
  • Main Camera(主摄像机):场景的主摄像头和音频监听设备,所有3D声音从该相机角度观察。
  • PlayArea(游戏场):定义实际可玩的地图区域。
  • Base Prefabs(基地预制):散落在地图上的建筑物。
  • Terrain(地形):Unity地形对象。
  • TestRunner:用于运行单元测试,使用Unity3D的SharpUnit单元测试框架。

MVC模式(模型 - 视图 - 控制器)

Unity引擎的设计鼓励采用MVC面向工程的结构,在本游戏中的结构如下:

  • 模型:包含所有游戏对象、组件和数据文件,可访问游戏物体的渲染器和摄像机对象。
  • 视图:负责呈现模型,主要管理Unity3D的引擎渲染。它需要访问模型的3D模型、纹理、材质和效果,并受输入选项的影响。
  • 控制器:接收用户输入,并调用模型对象上的方法进行响应,在本游戏中由输入子系统表示。用户输入可以影响视图。

多平台开发

Unity允许在不同平台上部署项目,只需进行轻微修改。演示和功能在很大程度上取决于平台的能力,但在某些领域,如不同设备的输入机制,存在较大差异。为了应对这些差异,采用了抽象工厂设计模式来设计这些组件。

抽象工厂模式

抽象工厂模式保护客户免受不同平台上相同概念的不同实现的影响。抽象产品类集合代表一个概念,支持所有平台;抽象工厂类声明创建单一产品的操作,具体工厂类代表特定平台。客户端仅使用抽象工厂和抽象产品的方法,从而与具体平台的实现隔离开来。

输入和持久性数据

游戏中两个需要不同实现的方面是输入机制和持久性文件数据的使用。由于Unity3D不支持跨平台数据库,机甲和坦克游戏使用二进制文件在磁盘上存储持久性数据,不同平台根据自身能力和实现支持相应的文件格式。为了保持可读性和灵活性,采用抽象工厂模式进行跨平台输入处理。

iOS + Unity开发挑战与解决方案

机甲和坦克游戏在iPad™上开发时面临一些挑战,以下是相应的解决方案:

最高多边形计数

iPad™游戏的一个明显限制是图形芯片每帧能够渲染的多边形数量。当每帧多边形数量超过30万个时,帧率会下降到25 FPS以下。在3D建模软件中,通过手动消除边缘、应用预定义算法减少多边形,甚至重建某些模型来降低多边形计数。目前,每个单位的平均多边形数量约为300。在最坏情况下,24个敌人和玩家单元加上最多4000个地形多边形,最重的帧将产生约12500个GPU多边形用于渲染。

绘制调用减少和灯光处理

在移动设备上,每帧的绘制调用数量对性能影响较大。每次绘制一个模型都会向GPU发出一次绘制调用,如果模型有n个子网格,则至少会产生n次绘制调用。每个GUI纹理、选择平面和健康栏都会增加一次绘制调用。每像素光照会导致每个光照通道产生额外的绘制调用,因此所有子网合并成一个模型,并且不使用动态照明,而是将所有模型和地形纹理的灯光进行烘焙。光照烘焙计算每个纹理在静态光源下的亮度,并将光照贴图叠加在纹理上,使模型看起来好像受到灯光影响,但实际上无需进行实时计算。

此外,Unity可以将多个使用相同材质的对象在运行时合并为一个绘制调用,这种方法称为动态配料。例如,在一个场景中,66次绘制调用的来源如下:

  • GUI(图形用户界面):共41次绘制调用,包括缩小贴图按钮、倒计时文本、24个图斑、8个建筑物地图斑和1个相机地图现货等。
  • Terrain(地形):4次绘制调用,每个纹理一次。
  • Visible Models(可见模型):14次绘制调用,每个模型平均产生3次绘制调用,分别用于单元网格、健康栏网格和选择平面网格。较低的绘制调用数量得益于Unity的动态配料。

地形处理

在Unity 3.4(2011年7月发布)之前,Unity不支持iOS平台的地形。为了找到最佳解决方案,测试了两种地形实施方式:在3D程序中模拟地形和将地形分割成不同部分。由于分割地形的过程复杂,纹理大小大或质量受影响,最终选择使用Unity地形引擎,并采用非常低的质量设置。

GUI优化

Unity引擎提供了两种实现GUI的方式:

  • UnityGUI:使用特殊的OnGUI()函数,每帧执行两次,仅用于主菜单和暂停菜单,所有值的计算在OnGUI函数外部完成。
  • GUI纹理:用于所有其他GUI元素,如GUI按钮和小地图,以维持性能。GUI纹理以平面图像形式显示2D内容,每帧渲染一次。

脚本优化

为了提高脚本性能,使用性能分析器进行跟踪。发现最昂贵的方法通常来自寻路或转向行为子系统。寻路模块已进行优化,同时确保昂贵的功能(如转向行为和其他AI程序)不会每帧都被调用。

作者信息

孟子菇凉

孟子菇凉

共发布了 3994 篇文章