从原型设计到培训应用、Digital Twins、人机界面以及产品配置器,借助 Unity Industry,您可以开发和发布的应用种类几乎无穷无尽。
您是否想了解您的组织如何利用 Unity?您是新订阅用户,还是经验丰富的 Unity Industry 开发者,希望提升自己的技能?无论您是初次打开编辑器的新手,还是已成功发布过多个项目的资深开发者,了解如何最有效地利用 Unity 的强大功能总是大有裨益,这能让您的日常工作体验尽可能高效且愉快。
借助 CAD 转 3D 功能、响应式用户界面、代码架构等,提升工作效率
本指南概述了“Unity Industry基础”模板,这是一个专为 Unity Industry 开发者设计的新型编辑器内学习模板。

“Industry Fundamentals”模板可在 Unity Hub 中获取,适用于 Unity Industry 订阅用户或拥有 30 天试用期的用户。
《行业基础》的核心要点
通过一系列操作指引,Unity Industry Fundamentals 模板将向您展示在 Unity Industry 项目中实现重要功能的步骤,包括:
- 如何使用 Asset Transformer Toolkit 将 CAD 模型转换并优化为可直接应用于实时工业项目的 3D 素材资源
- 如何构建HMI并将用户界面与实时数据连接起来
- 如何实现一个既支持自动导航又支持手动导航的导航系统
- 如何设置虚拟摄像机,以便用户在复杂且庞大的环境模拟中始终获得所需的视角
- 如何设计 C# 脚本,利用 ScriptableObjects 处理机器人行为、状态管理和数据流,从而保持数据层的解耦
《行业基础》旨在帮助您提升 Unity 开发效率,使开发过程更加专注且富有成效。您将学到的技巧适用于多种类型的实时 3D 工业应用,包括人机界面 (HMI)、培训模拟、Digital Twins 和产品配置器。
获取“行业基础”模板
在开始之前,如果您尚未找到并下载该模板,以下是操作步骤。
如果您是 Unity Industry 的订阅用户:
1.打开 Unity Hub 并升级至 Unity 6.4
2.创建一个新项目,然后搜索“行业基础”,或者转到“学习”类别并选择其中的模板。
如果您没有 Unity Industry 订阅:
1.请访问我们的免费试用页面,并按照提示操作以获取免费试用资格。
2.试用期开始后,请按照“行业版”订阅用户的操作步骤进行。
一个可供您浏览和修改的模板

后台界面(自动模式下),显示仓库小地图
该模板包含四个操作指引,将引导您了解创建 3D 交互式工业应用程序的工作流程和具体步骤。在 Unity 编辑器中打开项目后,您会在“Scenes”文件夹中找到名为“Warehouse”的完成场景。该场景是一个完整的仓库环境,地面上分布着多台机器人,随时准备进行拣货、上架和搬运库存。
该演示场景专为快速原型设计而打造;只需将您自己的 3D 模型拖放至场景中,添加一个组件,所有连接便会自动完成。您的素材资源将出现在用户界面中,并立即表现得像一个自主机器人,在环境中移动,并对用户界面的输入和输出做出响应。
打开“游戏”视图,进入“播放”模式,然后通过用户界面在模拟仓库中开始操作,该界面允许您控制和监控每台机器人,并实时显示机器人的电池电量和健康状态等数据。该界面提供了一张小地图,显示机器人当前的位置。您还可以通过将模式从自动切换为手动,手动覆盖部分机器人设置,并使用 WASD 键控制每个机器人的移动。调整每个机器人的速度,并使用滑块来延长或缩短其ARM。
让我们来看看这款仓库模拟游戏的主要特点。
观看:准备开始

资产转换工具包:从CAD到优化后的3D素材资源

“工业基础”模板中“主仓库”示例场景中的一个机器人3D模型
CAD 软件在建模时优先考虑数学精度和基于几何的细节,而实时应用程序则需要在视觉质量与实际性能考量之间取得平衡,例如可控的多边形数量、高效的纹理采样,以及可用于剔除和批处理的层次结构。
包含在 Unity Industry 许可证中的 Unity Asset Transformer Toolkit,是连接贵组织 CAD 数据与 Unity 项目之间的桥梁。它通过自动化的数据准备工作流,将您现有的数据与 Unity 无缝集成,从而为您节省时间和精力。您可以导入任何3D或CAD文件格式,无需多次导入或重新创建模型,同时能够完全控制网格大小和质量,从而针对目标设备优化数据性能。
在“行业基础”示例中,您将了解如何将新的机器人素材资源导入 Unity。该机器人模型基于原始CAD文件制作,属于粗糙的原始模型,外观粗糙,不适合用于精致的演示。“资产转换工具包”用于转换和优化模型,以便在适用于桌面和网络等平台的交互式 3D 应用程序中使用。
如需了解如何在编辑器中安装并打开 Asset Transformer Toolkit,请观看本节末尾的视频。
首先,让我们来看看工具栏。
探索“资产转换工具包”工具栏

“资产转换器工具包”工具箱
以下是对工具栏中可用操作的简要说明:
- 导入模型:点击此处开始导入流程,将您的 CAD 数据导入 Unity。
- 网格划分与优化:使用这些功能来简化几何体并删除任何不必要的细节,例如孔洞或内部面。
- Remesh:此功能可让您完全重建几何体,以满足高性能应用场景的需求。
- 层级:使用这些工具清理从 CAD 装配体中导入的任何杂乱的对象结构。
- 转换:快速修复模型中的枢轴点和对齐问题。
- UV 和碰撞器:使用这些设置来生成 Unity 进行纹理贴图和基于物理的交互所需的数据。
导入时保留模型设置和修改
本指南并未详细介绍导入流程;编辑器内的操作指引以及本节末尾的视频将带您逐步完成所有重要步骤。
这里需要重点说明的是,当您选择要导入的文件时,项目窗口中的 Assets 文件夹内会生成一个与您的模型同名的 ScriptableObject。
这不是实际的模型;其优势在于,ScriptableObject 包含一组设置,您可以利用这些设置导入模型,从而保留其原有设置和修改。如果对 CAD 模型进行了修改,并且需要重新导入,您无需从头开始重新设置所有内容。所有这些设置都将保存在 ScriptableObject 中。

当您选择要导入的文件时,项目窗口中的 Assets 文件夹内会生成一个与您的模型同名的 ScriptableObject。此 ScriptableObject 包含一组设置,可用于导入模型,从而保留其设置和修改内容。
当您选中 ScriptableObject 并打开其“检查器”窗口时,会在顶部看到“导入模式”字段,该字段可设置为“预制件”或“场景”:
- 预制:对于单个对象
- 场景:对于非常庞大且细节丰富的素材资源,例如包含数千甚至数百万个对象的高层建筑
检查器还提供了三个选项卡:模型、规则引擎和细节级别(LOD):
- 型号:在此处,您可以设置模型导入参数。在此步骤中,原始源模型将被转换为经过优化的3D素材资源。
- 规则引擎:定义一组规则,以便您能够直接从数据摄取步骤开始,自动完成模型的数据准备工作。当源模型随着时间推移而演变时,规则集会特别有用。请参阅下一节,了解规则引擎和规则集的介绍。
- LODs:添加 LOD 规则以生成 LOD;这些规则可在模型导入过程的最后一步直接生成。
设置完成后,点击“导入”,该模型预制件将被添加到“项目”视图中的 Assets > 3DModels 文件夹中。您可以将模型拖放到“场景”视图中,这样也会将其添加到“层级”中。
观看:安装 Unity Asset Transformer Toolkit

优化 3D 素材资源
Asset Transformer Toolkit 提供了一系列工具,用于清理导入的模型,使其适应实时环境,同时保持视觉保真度并保留所需的元数据。这可以通过在导入过程中使用前述的规则集自动完成,也可以在导入后通过“资产转换器”工具栏中的工具,作为单独的操作手动完成。
整理层级结构
在模板中,如果您按照步骤导入一个新的机器人素材资源,会发现它在“层级”视图中的结构过于复杂。点击展开其中一个基本元素(例如名为 body_body_main_01-1 的 GameObject),你会在其“检查器”中看到,与该部件相关的所有元数据都已添加到一个组件中。不过,其子对象中包含一个网格过滤器,该过滤器会显示实际的几何体以及当前分配给它的材质信息。

“body_body_main_01-1”对象的一个子GameObject,已为其添加了Mesh Filter组件。
将所有这些细节与元数据整合到一个对象中,而不是分开存放,这样效率更高。
要解决这个问题,请使用“合并”工具。默认情况下,“合并”工具设置为“合并所有内容”。你最好不要应用此操作,因为这会将所有内容合并为一个预制件。你希望保留所有对象的最终层级。如果您在下拉菜单中选择“最终层级”选项,系统将指示“合并”工具沿“层次结构”列表向下遍历,查找每棵树中的最后一个对象,然后将其与紧邻其上方的对象合并。

“资产转换工具包”中的合并工具

大规模的屠杀
如果像本例中这样,模型中包含大量几何体,那么简化过程可能会非常繁琐。因此,您也可以选择进行大规模的剔除。
通过将简化工具中的“标准”选项设置为“质量”,并在“层次结构”中选择 CAD 模型的顶层,您可以选择目标质量级别,然后运行该工具将简化操作应用于所有对象。
将此操作应用于质量设置为“低”的机器人资产后,三角面数量减少了65%,目前仅略低于20万个,从而使其在移动设备上运行时更加优化。
调整法线
进行此类深度优化时,常会出现的一个问题是,它可能会破坏模型的平滑性。经过降采样处理后,图像在光线下的外观和呈现效果可能会发生变化,你可能会突然发现一些伪影,或者边缘比之前更锐利。这个问题可以通过调整模型的法线来解决。“素材资源转换工具包”提供了一系列工具,可用于调整或重置模型的法线。
观看:优化 CAD 模型

使用规则集,在重新导入素材资源时节省时间
在设计过程中,CAD模型通常会经历多次迭代。如果在CAD应用程序中修改模型后,每次重新导入模型时都必须执行上述所有操作,这将导致效率低下。
这取决于您目前处于设计流程的哪个阶段,以及需要进行多少次设计迭代,这可能会变得相当繁琐。
这正是规则集发挥重要优势之处。您在 Unity Asset Transformer Toolkit 的规则引擎中设置的规则集,是一系列称为“操作”的指令序列。Unity 会在导入过程中自动执行这些操作,您也可以手动应用它们,从而自动完成许多通常需要对 CAD 模型执行的操作。
创建规则集
规则集本质上是一套操作指南,它会指导资产转换工具包根据给定的条件查找特定的对象,然后执行您指定的操作。例如,当你在 CAD 文件中看到这个材质名称时,请将其映射到这个 Unity 材质上。当你发现名称符合此格式的零件时,请将它们归类在一起。当多边形数量超过此阈值时,生成LOD级别。这些规则可帮助您将原本繁琐的手动工作实现自动化。
“行业基础”模板的“规则集”文件夹中包含若干预设规则集。这些内容值得研究,不仅因为它们的功能,更因为它们能引导你思考如何确定优化优先级。在该模板中,有一组规则用于处理机器人模型:对于用户关注度较高的机械臂关节,需要保持高细节;而对于不太显眼的底座部分,则可以降低细节程度。另一个负责仓库环境,该环境的几何体虽然较为简单,但数量庞大,因此采用激进的LOD生成策略是合理的。
有一套规则集,它会在导入过程中自动执行数据降采样和层级清理操作。该模板还提供了一组规则,可自动将环境光遮蔽效果渲染到顶点数据中,从而提升模型的视觉保真度。最后,还有一些规则集,它们将向您展示如何在导入过程中替换材质和对象
要创建规则集:
1.在项目文件夹中,右键单击并选择“创建”>“资源转换器”>“规则集”。
2.为您的规则集设置名称。
3.在专用选项卡中编辑规则集(该选项卡会自动在“检查器”旁边打开)
4.向序列中添加项目,例如过滤器、操作和额外的规则。规则按顺序从上到下应用。
请看下图,右侧显示了一个已打开的规则集。默认情况下,第一个操作设置为“获取”。这将选中场景中的一个对象,此后执行的所有操作都将应用于该选中的对象。

某款机器人模型的规则集(右侧)
“获取”操作将选中整个机器人模型,后续的所有操作都将应用于整个机器人模型,因此你需要一种方法来定位模型内部那些你想对其应用后续操作的特定元素。为此,请在此规则中添加一个“过滤”操作,并将操作设置为“按元数据过滤”,以便使用随 CAD 模型导入的元数据。
高效重新导入素材资源
像上面这样的规则集可以通过以下方式手动运行:
- 选择要应用的对象
- 选择规则集,然后点击“运行”按钮
不过,您也可以进行设置,使规则集在导入过程中自动应用。要进行此设置,请选择位于素材资源 > 3DModel 文件夹中创建的导入设置 ScriptableObject,您会在其检查器中看到,“导入”按钮现已更名为“重新导入”。
选择“规则引擎”按钮,然后指定要在导入过程中运行的规则集。
如果完成设置后点击“重新导入”按钮,每次重新导入 CAD 模型时,系统都会对其应用指定的规则。您还可以在导入规则中嵌套多个规则和规则集,以确保在导入过程中它们都能被应用。
观看:规则集

观看:高级规则集

在模板中添加一个新机器人
在了解了如何导入、优化并自动化整个流程之后,现在是时候将这些CAD数据转化为仿真环境中的一个功能完备、数据驱动的机器人了。
该模板提供了您在整个过程中所需的所有组件,包括用于将模型与用户界面关联的 C# 脚本,以及用于配置系统以便在不同机器人变体之间切换,并实时测试机器人行为的脚本。
让我们来看看模板中介绍的工作流之一。
仓库场景中有几台机器人,您希望配置任何新的机器人模型,使其具备与其他机器人相同的功能。为此,您需要重新导入模型——既然规则集已经就位,这将是一个高效且可预测的过程。具体步骤如下:
1.在“项目”>“3D模型”中,你会找到一个名为“ScriptableObject”的导入素材资源,其中包含了之前设置的所有配置。打开其“检查器”,并在“规则引擎”选项卡中确认已设置好导入规则。

“规则引擎”选项卡(右侧)显示了此前为该模型设置的规则集
2.在“模型”选项卡中,请确认已选中“导入元数据”设置。这对过滤器和所有规则集的正常运行至关重要。
3.重新导入模型后,您可以在“素材资源”>“3D模型”中找到它,然后将其拖放到“场景”视图中。
4.在“层级视图”中,你会发现场景中的现有机器人都嵌套在一个名为“Robots”的父级 GameObject 之下。展开此项,选择其中一个子机器人对象,你会发现它附带了一个名为“Robot”的脚本,其中包含一个名为“Robot Data”的可编程对象,该对象存储了每个机器人的所有信息。

机器人数据 SO ScriptableObject,其中包含每个机器人的所有信息
5.如果你查看“素材资源 > Warehouse > RobotData”文件夹,你会发现当前场景中的四个机器人各自都有一个独立的 RobotDataSO ScriptableObject。你需要将同一个 ScriptableObject 附加到新机器人上。
6.要执行此操作,请在“素材资源”文件夹中右键单击,然后选择“创建”>“行业模板”>“机器人数据”。请将其命名为与机器人型号对应的名称。
7.点击您添加的新机器人以打开其“检查器”,然后点击“添加组件”,在下拉菜单中找到名为 Robot.cs 的机器人脚本并将其添加。
8.将新的机器人 ScriptableObject 拖放到新脚本的“数据”字段中,系统会自动添加所有其他脚本和组件,使该机器人能够像其他机器人一样运行。
请按照模板中的操作指引操作,了解如何将 CAD 数据导入实时应用程序以创建 Digital Twins,以及如何设置控件通过用户界面监控机器人。
观看:用户界面与交互性

使用 UI Toolkit 创建监控后台
Unity 提供了两种创建用户界面(UI)的系统:Unity UI(uGUI)和 UI 工具包。“行业基础”使用 UI Toolkit。
UI Toolkit 旨在实现跨平台的卓越性能和适应性,其设计灵感源自标准网络技术。如果您有开发网页或应用程序的经验,那么 UI Toolkit 的核心概念对您来说应该并不陌生。UI Toolkit 提供了一系列强大的工具和工作流,可充分利用您对标记语言和样式表的现有知识。
UI 工具包:受标准网络技术启发
借助 UI Toolkit,您可以将用户界面的结构、样式和行为分离,这与使用 HTML、CSS 和 JavaScript 的方式类似。
UXML 是一种受 HTML 和 XML 启发的标记语言,用于定义用户界面结构和可复用的模板。虽然您可以使用 C# 构建 UI,但使用 UXML 可以在 Unity UI 构建器窗口中直接处理 UI 布局,从而提供可视化编辑体验。
CSS 是一组样式表,用于为用户界面应用视觉样式和布局规则。与 CSS 类似,USS 支持标准 CSS 属性的子集。虽然您可以在 C# 中定义样式,但建议使用 USS,因为它能确保样式在整个用户界面中被复用,从而打造统一的视觉风格并简化样式管理。

在 UI Builder 中创建后台界面
UI Toolkit 支持一种数据绑定系统,可让您将 UI 元素的属性与数据源关联起来。这意味着,当数据发生变化时,用户界面会自动更新,反之亦然。
在本节中,我们将探讨后台的设计及其与数据绑定的交互方式。
《工业基础》中的后台布线

后台界面:左侧显示机器人列表,右侧显示详细信息和控制选项
后台分为几个独立的区域:顶部显示概览信息,左侧列出机器人列表,右侧则显示详细信息和控制选项。仪表盘的 USS 文件定义了一个完整的设计系统,包括颜色和间距变量,以及用于按钮和状态指示器等重复元素的类。
每个机器人有三种状态:标准、警告或危急,这些状态需要通过视觉方式呈现。USS 定义了三类状态——标准状态、警告状态和危急状态,每类状态都有不同的背景颜色。一个 C# 脚本会根据机器人的状态来添加或移除这些类。当机器人的电量低于临界阈值时,其生命值会随时间逐渐下降;电量越低,生命值的损失速度就越快。如果机器人的健康状态或电量进入警告或危急范围,状态类别将相应更新,并在后台向操作员提供即时视觉提示。

每个机器人有三种状态:标准、警告或危急,这些状态需要通过视觉方式呈现。
在实际项目中,这种分离意味着设计师无需修改代码即可调整警告颜色,而程序员无需了解 CSS 也能添加新的状态类型。
UIController 脚本
UIController 脚本将所有内容整合在一起。它在启动时缓存对 UI 元素的引用,为按钮和滑块注册事件回调,订阅机器人管理器的事件,并在状态发生变化时更新 UI。该模板展示了两种更新用户界面的方法:对于电池电量等连续值,采用数据绑定;对于机器人选择等离散事件,则采用显式代码。
数据绑定

UI Toolkit 中的数据绑定
与其编写代码来手动更新每个标签和进度条,不如在 UXML 中声明绑定,将 UI 元素的属性与数据源上的属性关联起来。当数据发生变化时,用户界面会自动更新。
该模板将 UI 元素直接绑定到每个机器人的 RobotDataSO 可编程对象上。该功能可显示电池电量、健康状况、温度和转速。UXML 声明了诸如“此标签的文本应为该数据源的 Battery 属性,并以百分比格式显示”这样的绑定。
此绑定是双向的;例如,ARM臂展滑块不仅显示数值,还会设置该数值。当用户拖动滑块时,关联的属性会随之更新,从而驱动机械臂移动。用户界面不再仅仅是显示界面,而是变成了一个控制面板。
转换器是数据绑定中不可或缺的一部分,用于处理数据类型与显示格式之间的差异。数据源中的“电池”字段是一个范围在 0 到 100 之间的 float 数,但您希望显示“75%”而非“75.0”。该模板包含注册了格式化函数的转换器素材资源。您在绑定中引用了这些转换器,它们会在数据从源头传输到显示端的过程中对值进行转换。
小地图

后台中的小地图;小地图的背景来自俯视摄像头的渲染纹理
小地图展示了 UI Toolkit 中的自定义渲染效果。小地图的背景来自俯视摄像机的渲染纹理。机器人位置点是基于从世界坐标系转换到UI空间后的坐标进行定位的UI元素。每帧,代码都会读取每个机器人的世界坐标,计算其在小地图元素上的对应位置,并更新该点的坐标——这是一种简单而有效的方法,用于展示空间关系。
观看:UI 深度解析

设置自动和手动导航

仓库中的预烘焙导航网格
机器人是如何知道自己可以移动到哪里的?仓库里布满了障碍物——货架、托盘、其他机器人——每台机器人都需要找到绕过它们的路径。这就是 Unity AI 导航系统的职责。
如果您在编辑器中打开仓库场景,前往顶部工具栏并点击“切换可见性”按钮,NavMesh 就会以蓝色叠加层的形式出现在场景中。NavMesh 是 Unity 生成的网格,用于近似表示环境中的可通行区域和障碍物,以便进行路径规划和 AI 控制的导航。
更高效的方案是将导航网格预渲染到场景中,而不是在运行时动态生成。在烘焙过程中,导航系统会分析您的场景,并根据您设定的参数,找出所有代理(在此指机器人)可以移动的区域。

Unity 的 AI 导航系统负责处理自动控制和手动控制的移动逻辑。
在该模板中,每个机器人都知道自己的行进路线,因为它们都附加了 NavMesh Agent 组件。它还提供了一些可调整的预设,例如速度、加速度参数、避让半径和高度。

Nav Mesh Agent 组件
虽然大部分移动逻辑由 NavMesh 系统管理,但在“素材资源 > 仓库 > 脚本”中,还有一个名为 RandomAgentMovement 的脚本,用于设置目标目的地。该场景包含特定的预设目的地。在运行时,该脚本会将其中一个目的地分配给一个机器人,然后持续检测该机器人与该目的地的距离。如果机器人到达了那个目的地,它会在那里暂停几秒钟。随后,脚本会指定一个新的目标位置;借助导航网格,机器人会自动确定并沿着通往目标的最佳路径前行。

RandomAgentMovement 脚本
在某些应用场景中,当任意数量的物体需要与机器人等自主代理共同进行手动控制时,可能会遇到挑战。机器人需要能够感知移动物体,例如开合的门或移动的货箱。要让机器人感知这些移动,必须将其集成到NavMesh配置中。
为了在《Industry Fundamentals》中实现这一功能,已在导航网格系统中添加了一个 NavMeshObstacle 组件。这会指示导航网格在机器人周围划定一个指定区域。随着机器人的移动,该区域也会随之移动,从而防止机器人穿过货架等障碍物,或与其他机器人发生碰撞。
如果您切换到手动模式来控制机器人,系统会分配并激活 NavMeshObstacle 组件,同时禁用 NavMeshAgent 组件。

在导航网格上移动的仓库机器人

模式之间的切换是通过机器人的 ScriptableObject 数据实现的。OperationMode 属性取值为 Auto 或 Manual,各种组件会检查该值以决定如何操作。用户界面中设有用于切换模式的按钮,这些按钮会更新数据素材资源,从而触发组件的响应。这种数据驱动的方法意味着,添加新模式或更改模式行为时,无需修改多个脚本。
观看:NavMesh 操作指南

基于Cinemachine的虚拟摄像机系统
“行业基础”模板通过以下三种方式使用 Cinemachine 虚拟摄像机系统(您可以将其作为软件包下载):
- 创建一个能够跟随当前选定机器人的摄像头,并在切换不同卡片时实现机器人视角之间的平滑过渡
- 为了让摄像头始终锁定在机器人的身上,使其在仓库中移动时,并确保镜头不会穿透物体
- 将 3D 视图直接推送到后台界面
核心概念很简单:你的场景中包含一个由 Cinemachine Brain 组件管理的 Unity 摄像机 GameObject,以及多个定义潜在镜头的虚拟摄像机。“大脑”组件会根据虚拟摄像机的优先级在它们之间进行切换。只有优先级最高的已启用虚拟摄像机才能控制您所看到的画面。
《工业基础》中的相机
如果你打开仓库场景,你会看到几台机器人散落在各处,它们会为你提供一些可供使用的元素,供你在添加自己的机器人之前使用。请务必确保在将您自己的机器人添加到场景中时,也为它分配了一台虚拟摄像机。
在“层级”视图中,找到提供默认镜头的“Cinemachine Shots”游戏对象。

仓库中的Cinemachine虚拟摄像机
点击“播放”后,每个机器人都会拥有自己的“跟随”摄像头,该功能是在运行时通过脚本添加的。该脚本会获取场景中机器人数量的列表(包括新添加的),并为其中的每个机器人创建一个 Cinemachine Camera 组件以及一个 Third-Person Follow 组件。“第三人称跟随”组件可让您创建一个位于移动物体后方的摄像机,该摄像机将跟随被指定为跟踪目标的任意物体。

带有Cinemachine组件的RobotFollowCam GameObject,其中包括
对于后台界面,Cinemachine 采用了两种不同的实现方式:一个用于显示当前渲染视角的3D摄像机,以及一个用于小地图的摄像机。小地图使用了一个渲染纹理,该纹理通过一个独立的摄像机从俯视角度渲染画面,并将渲染结果输出到渲染纹理中。3D 相机并不使用纹理,而是通过运行中的应用程序渲染实际相机的视角,不过是通过 UI 中的一个矩形切口来实现的。
Cinemachine 允许您构建灵活的摄像机系统,其中 Cinemachine 的核心模块将负责处理在不同摄像机之间切换的所有逻辑,并创建虚拟摄像机,这些虚拟摄像机将作为实际主摄像机的位置占位符。最后,它还提供了诸如第三人称跟随镜头等额外组件,这些组件承担了构建实时应用程序时通常需要处理的大量繁重工作。
观看:《Cinemachine》通关攻略

使用通用渲染管线优化照明
通用渲染管线(URP)是 Unity 提供的一种可扩展渲染解决方案。它旨在呈现高质量的视觉效果,同时在从高端台式机到移动设备和网页浏览器等各种平台上都能高效运行。对于工业应用而言,这种灵活性至关重要。您可能需要同一个应用程序既能在贸易展上作为自助终端显示屏运行,又能作为面向远程客户的网页应用,同时还能作为面向现场技术人员的平板应用。
该模板的 URP 配置位于“设置”文件夹中。“渲染管线”素材资源用于控制全局渲染设置。了解这些设置的功能,有助于您针对自己的项目进行明智的调整。

“工业基础”模板中仓库场景中的一个机器人
Forward+ 渲染
该模板采用 Forward+ 渲染技术,既能高效处理多光源场景,又能保持与各类硬件的兼容性。Forward+ 通过在屏幕空间中对灯光进行聚类来工作,因此与传统的正向渲染不同,向场景中添加更多灯光不会对性能造成负面影响。
抗锯齿功能可平滑几何体与背景交界处出现的锯齿边缘。该模板在“高质量”档位下使用4倍MSAA,在中等档位下使用2倍MSAA,而在低质量档位下不使用MSAA。MSAA 在现代 GPU 上运行迅速,但会占用更多内存,因此分层方法可根据目标设备进行调整。
使用阴影级联
阴影能提升画面质感,但可能导致计算成本增加。该模板采用了阴影级联技术,可在镜头附近生成高分辨率阴影,而在远处则生成低分辨率阴影。
烘焙光与光探针的结合
该模板的照明采用混合方案。对于仓库地面、墙壁和货架等静态几何体,请使用烘焙光照。像机器人这样的动态对象会使用实时光照和光探针。
光探针是场景中不可见的点,用于采样烘焙后的光照。当动态对象移动到光探针附近时,它会获取该位置的环境光。该模板在仓库各处设置了光传感器,使机器人能够与环境融为一体,而非仅仅置身其上。
LightRig 系统又增添了一层功能。每个机器人都配有一组聚光灯,当选中该机器人时,这些聚光灯就会亮起。这使得视觉焦点集中在正在活动的机器人上,而无需使用昂贵的全局光照技术。该实现仅仅是一个组件,它会根据选中状态来开启或关闭灯光。

每个机器人都配有一组聚光灯,当选中该机器人时,这些聚光灯就会亮起。
环境光源自一张HDRI图像,它能提供细腻的环境光,既能填补阴影,又能为金属表面提供反射的光源。该模板包含多种HDRI选项,以便您观察不同的光照环境如何影响场景的氛围。
C# 脚本
让我们来看看模板中使用的脚本和可脚本化对象。
如前几节所述,机器人的所有细节,例如其动作、故障原因以及向用户界面发送报表的方式,都包含在一个 ScriptableObject 中。如果您进入“项目”视图,然后依次选择“素材资源” > “仓库” > “RobotData”,您将找到每个机器人的 ScriptableObject。打开其中一个机器人的“检查器”,您将看到该机器人的详细信息,例如名称、当前运行模式、当前状态、当前激活的变体、电池电量、健康状况、运行温度、速度等。ScriptableObject 本身不会执行任何操作;在此语境下,它仅仅是一个容器,用于存储该模型特有的所有数据。
此外,还有一个 ScriptableObject 对象,其中存储了整个机器人舰队的数据,包括所有机器人的平均电量、正在移动的机器人数量,以及各状态类别中的机器人数量。所有这些信息都会显示在后台界面中。
脚本用于将所有这些数据与实际的机器人关联起来,并赋予它们相应的功能,例如移动或在不同变体之间切换。在模板中,您可以在“Warehouse scripts”文件夹中找到它们。有一些脚本用于控制机器人,并将所有可编程对象与实际模型关联起来。选择其中一项,您会看到有“机器人”、“模拟器”和“变体”脚本。
RobotManager
RobotManager 脚本会在启动时将所有数据加载并激活。该脚本是单例,因此整个场景中只有一个实例。应用程序启动时,会检测场景中的所有机器人,并将它们存储在一个列表中。该脚本包含两个关键事件:ActiveRobotChanged 事件会在用户每次选择不同的机器人时触发,而 RobotListChanged 事件则会在列表中添加或移除机器人时触发。
该脚本是整个项目通信的核心。在浏览其他脚本时,你会发现其中许多都订阅了这些事件。

RobotManager 脚本
OverallDataUpdater 脚本每帧运行一次,并指示 OverallData 可编程对象遍历每个机器人的数据,统计数值,并更新车队汇总信息。因此,虽然整体数据包含了所有信息,但这段脚本才是真正让它运行起来的关键。

OverallDataUpdater 脚本
每个机器人都会利用导航网格来判断自己可以移动和不能移动的区域。但它们也需要一个行动目标,正如前文所述,每台机器人均可切换至自动或手动模式。为了管理所有这些内容,该模板包含一个 RobotEditor 脚本,可通过“素材资源 > 仓库 > 脚本 > 编辑器”访问。当您将一个可脚本化对象(ScriptableObject)分配给机器人预制件时,此脚本会自动向该预制件添加所需的所有内容。
当机器人处于自动模式时,RandomAgentMovement 脚本处于激活状态。该脚本包含一组目标。脚本启动时,会随机选择一个目标,并派遣代理前往该处。每帧都会检查代理是否已到达。它会检查剩余距离、路径是否仍在计算中,以及代理是否已停止移动。一旦这三个条件都满足,它会等待一段随机时间(1到3秒),然后选择一个新目标,机器人便会重新开始整个过程。
正如您在模拟中看到的,这些机器人在仓库里四处游走,到达每个目的地时,它们都会停顿片刻,仿佛在那里做些什么,然后转身前往下一个目标。
此外,您可能还记得,当切换到手动模式时,Robotscript 会禁用 NavMesh Agent 组件,并启用已开启路径规划功能的 NavMesh Obstacle 组件。激活了该组件的机器人将在导航网格上移动,并在其周围的导航网格上开辟出一条通道。当另一台处于自动模式的机器人在其附近时,由于NavMesh中存在空隙,它将无法穿过该障碍物;它会寻找一条绕过障碍物的新路径。当您切换回自动模式时,系统会移除该 Nav Mesh Obstacle 组件,并重新启用 NavMeshAgent。
RobotDataSimulator 脚本模拟了实际环境中可能发生的情况,例如机器人在移动时电池电量耗尽、设备发生故障等。该脚本还会将更新写入 ScriptableObject,从而告知 UI 后台应显示哪些内容。
最后,对于每个模型,您可以在“变体”脚本中指定不同的变体及其行为。当您点击用于在不同变体之间切换的按钮时,该脚本将启用或禁用相应的变体。
观看:C# 架构与 ScriptableObjects

性能优化
工业应用通常需要在多种硬件设备上都能良好运行,这意味着必须仔细考虑如何优化用户体验。以下是该模板中采用的一些策略。
- 更新频率管理:并非所有操作都需要在每一帧中执行。遥测模拟器每帧都会更新,因为用户在手动驾驶时期望获得即时反馈。汇总统计数据每秒更新一次,因为整个车队的平均值变化速度不会比这快多少。该模板支持自定义配置,因此您可以调整响应速度与 CPU 占用率之间的平衡。
- UI 查询缓存:UI Toolkit 的 Q 方法可通过名称或类名查找元素,虽然方便,但会带来一些代价。每帧调用 Q 来查找同一个元素会浪费处理周期。该模板在启动时查询一次,将引用存储在字段中,此后便使用这些缓存的引用。
- NavMesh 查询优化:完整的路径规划(即计算从 A 到 B 的完整路径)计算成本较高,但验证单个点则成本较低。手动控制器使用 NavMesh.SamplePosition 而不是 CalculatePath,因为它只需知道下一步是否有效,而无需知道整个路径。
- LODs:该机器人模型具有多个细节级别,系统会根据屏幕大小自动进行选择。在特写镜头下,你能看到所有细节;而稍远处的机器人虽然几何结构被简化了,但依然能清晰辨认。该模板的LOD阈值是针对仓库环境进行优化的;您需要根据场景中典型的视距来调整这些阈值。
- 渲染纹理分辨率:这在画质、GPU 内存和填充率之间取得了平衡。监控摄像头和小地图不需要全分辨率,因此它们渲染的纹理较小。这减少了 GPU 需要填充的像素数量,同时也减少了这些纹理占用的内存。
- 物理层过滤:该模板将机器人放置在“Bot”图层上,并配置了物理设置,确保仅相关图层之间发生碰撞。机器人会与地面以及彼此发生碰撞,但不会与 UI 射线投射目标或其他将碰撞体用于非物理目的的系统发生碰撞。
- 质量等级:该模板定义了三个级别,每个级别的设置都比前一个更少。在运行时,您需要检测设备功能或提供用户设置,然后调用 QualitySettings.SetQualityLevel 进行切换。URP 渲染管线素材资源支持按层级覆盖,因此您可以在不影响高端设备的情况下,降低低端设备的阴影分辨率。
最后,Unity 的性能分析工具对于查找瓶颈至关重要。针对目标硬件进行性能分析,找出性能瓶颈,并针对性地进行优化,而不是过早地对所有内容都进行优化。
Unity Industry 产业生态系统
Unity Industry 包含创建、管理和扩展多平台应用所需的产品及支持服务。该产品专为行业创作者设计,涵盖从数据集成到部署的各个阶段。
加入制造、汽车、零售等行业的顶尖企业行列,利用实时3D技术获取竞争优势、加快产品上市速度并优化资源配置。从产品可视化到仿真,Unity Industry 助力打造沉浸式体验。
获取“行业基础”模板
如果您是 Unity Industry 的订阅用户:
1.打开 Unity Hub 并升级至 Unity 6.4
2.创建一个新项目,然后搜索“行业基础”,或者转到“学习”类别并选择其中的模板。
如果您没有 Unity Industry 订阅:
1.请访问我们的免费试用页面,并按照提示操作以获取免费试用资格。
2.试用期开始后,请按照“行业版”订阅用户的操作步骤进行。
获取电子书
填写此表单,获取行业专家提供的前沿见解和解决方案



