EntityComponentSystemSamples HDRP 项目解析Entities Graphics 特性示例场景全景指南【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples本项目EntityComponentSystemSamples 仓库中的GraphicsSamples/HDRPSamples子工程以 Unity DOTS 生态的com.unity.entities.graphics包1.4.16 版与 HDRP 渲染管线17.2.0 版为核心通过 20 余个特性示例场景系统演示了 Entities 在 HDRP 下的渲染能力从光照烘焙、材质逐实例覆盖、运行时实体创建到网格形变、LOD、运动模糊与透明排序。读完本文你将掌握每个示例场景的玩法、操作步骤以及其背后的 ECS 渲染机制与关键源码实现路径可直接在本仓库中逐一打开场景进行验证与二次开发。项目概览与核心渲染机制Entities Graphics 与 SubScene 的渲染模型HDRPSamples 是面向HDRP Entities Graphics的特性示例工程。其核心机制在于当存在对应实体Entity时Unity 用 Entities Graphics 渲染该 GameObject当实体不存在时则不使用 Entities Graphics 渲染。对于放在 SubScene 中的 GameObject这一行为意味着 Unity在编辑模式Edit Mode、播放模式Play Mode以及打包后的 Player 中始终以 Entities Graphics 渲染它们——这正是 DOTS 烘焙Baking带来的运行路径统一。特性示例场景全部位于 GraphicsSamples/HDRPSamples/Assets/SampleScenes 目录按主题划分为0. Base至6. Misc七个分类目录绝大多数场景都把演示用的 GameObject 放入 SubScene 中烘焙为实体。工程运行环境可从仓库确认Unity 编辑器版本为6000.2.10f1见 ProjectVersion.txt依赖com.unity.entities.graphics: 1.4.16与com.unity.render-pipelines.high-definition: 17.2.0见 Packages/manifest.json。场景总览表主 READMEGraphicsSamples/HDRPSamples/README.md以表格形式给出了全部特性场景的一览以下完整继承该场景清单场景说明AmbientAndBlendProbes演示如何使用光照探针light probesLightmaps演示 Entities 的光照贴图支持Lightprobes演示 Entities 的光照探针支持BuiltInMaterialSHProperties演示覆盖内置材质的 SH 属性值HDRPLitProperties演示不同 HDRP Lit 材质属性在实体上的覆盖HDRPShaders演示 HDRP Lit、LitTessellation、Unlit、LayeredLit、LayeredLitTessellation 着色器的材质属性覆盖MaterialOverridesSample演示无需写代码即可覆盖材质属性ShaderGraphProperties演示 Shader Graph 着色器的材质属性覆盖HybridEntitiesConversion演示可放入 SubScene 的图形相关伴随组件companion componentsTriggerParticles演示如何从 ECS System 播放 VFXEntityCreation演示如何在运行时高效创建由 Entities Graphics 渲染的实体MaterialMeshChange演示在运行时更换实体上的材质与网格RenderMeshUtilityExample演示RenderMeshUtility.AddComponentsAPIMeshDeformations演示 BlendShape 与 SkinWeight 实体SkinnedCharacter演示 SkinnedMeshRenderer 实体DisabledEntities演示被禁用的实体LODs演示 Entities Graphics 中的 LODMatrixPrevious演示移动实体与 HDRP 运动矢量Motion Vectors支持Submesh演示带多个子网格sub-mesh的 Mesh 配合 Entities Graphics 使用TransparencyOrdering演示透明实体的排序运行方式Base 场景切换器0. Base目录下的 Base.unity 是导航入口场景运行后可在播放模式下切换到工程内任意场景见 0. Base/README.md。切换逻辑由 SimpleSceneSwitch.cs 实现界面右下角提供 Prev / Next 按钮或按 Fire1 / Fire2 键在 Build Settings 中的场景间轮转切换时它会通过EntityManager.GetAllEntities()清理运行时生成的实体但会跳过 SubScene、SceneSection 与场景流式单例等系统实体避免误删引发报错。单独体验某个示例时也可直接在 Project 窗口中打开对应分类目录下的场景文件并进入 Play 模式。光照与烘焙示例1. LightingAmbientAndBlendProbesSubScene 中的环境光与混合探针该场景AmbientAndBlendProbes.unity演示 SubScene 中环境光与混合探针blend probes的工作方式场景中有 2 个 SphereAmbient 与 2 个 SphereBlend 对象其中 2 个在 SubScene 外、2 个在 SubScene 内且两侧使用完全相同的MeshRenderer.Probes.LightProbes配置。操作要点见 AmbientAndBlendProbes/README.md在 Hierarchy 中选中任一球体在 Inspector 的Mesh Renderer - Probes - Light Probes下观察其设置是 Off 还是 Blend Probes。该场景用于验证烘焙进 Entities 后光照探针的混合策略依然按原 MeshRenderer 配置生效。需要特别注意的是SubScene 内的光照探针数据依赖探针锚点与包围体的放置若自行修改场景需保持探针覆盖到实体区域。LightmapsEntities 的光照贴图支持Lightmaps.unity 场景Lightmaps/README.md由使用不同光照着色器lit shaders的球体组成并启用烘焙全局光照baked GI。使用步骤在 Hierarchy 选中 Subscene在 Inspector 点击Open打开进入Window Rendering Lighting在 Scene 选项卡配置光照贴图设置点击Generate Lighting烘焙保存场景与 SubScene然后关闭 SubScene。烘焙结果以光照贴图lightmap形式供 Entities Graphics 读取实体的 UV 需与烘焙贴图对应否则会出现漏光或错位。Lightprobes实体上的光照探针Lightprobes.unity 场景Lightprobes/README.md用光照探针为不同光照着色器的球体打光。操作上需要注意的关键差异SubScene 内的灯光标记为 Static而球体不标记 Static。步骤打开 SubScene确认灯为 Static、球体非 Static进入Window Rendering Lighting在 Scene 选项卡确保开启Baked Global Illumination配置好光照贴图设置后点击Generate Lighting保存并关闭 SubScene。这种 Static 组合让探针烘焙为静态数据、实体本身保持动态变换是光照探针 ECS 实体的标准配合方式。材质属性覆盖示例2. MaterialProperties材质属性覆盖material property override是 Entities Graphics 实现逐实例per-instance材质差异的核心能力不必复制材质而是通过带[MaterialProperty]特性的 ECS 组件把数值写入渲染批量。仓库中的生成代码可直接印证这一点例如 HDRPMyColorVector4OverrideOverrideGenerated.csnamespace Unity.Rendering { [MaterialProperty(_HDRPMyColor)] struct HDRPMyColorVector4Override : IComponentData { public float4 Value; } }即一个带[MaterialProperty(着色器属性名)]的IComponentData结构体其字段值会被注入到对应着色器属性中实现同材质不同实例显示不同颜色/金属度/光滑度。HDRPLitProperties覆盖 HDRP Lit 核心属性HDRPLitProperties.unityHDRPLitProperties/README.md中的球体使用 HDRP Lit 着色器并位于 SubScene 内挂载在球体 MeshRenderer 上的材质覆盖 Authoring 组件会覆盖其颜色Color、光滑度Smoothness与金属度Metallic。若需覆盖其他 HDRP 材质属性可以在 Inspector 中继续添加其他 HDRP Material Property Authoring 组件如 Base Color、Emissive Color、Normal、Ambient Occlusion 等每个组件烘焙后都会生成对应的[MaterialProperty]ECS 组件。HDRPShaders多着色器全家桶覆盖HDRPShaders.unityHDRPShaders/README.md覆盖了 HDRP 的Lit、LitTessellation、Unlit、LayeredLit、LayeredLitTessellation以及Shader Graph PBR输出演示对球体颜色与自发光emissive值的覆盖。操作要点选中LitRedEmissive或UnlitRedEmissive球体观察其上的 HDRP Material Property Base Color Authoring 与 Emissive Color Authoring 组件选中LayeredLit或LayeredLitTessellationMagenta观察其 Layered Lit Base Color 0 Authoring 组件——这是 LayeredLitBaseColor0Authoring.cs 脚本利用 HDRP LayeredLit 的_BaseColor0关键字逐层覆盖颜色选中PBRBlue球体其上的 Material Color 组件展示了如何为自定义 Shader Graph 属性编写覆盖组件点击Edit编辑 Shader Graph注意 Color 属性的 Node Settings 中开启了Hybrid Per Instanced选项——这是属性可被逐实例覆盖的前提。ShaderGraphPropertiesShader Graph 属性覆盖ShaderGraphProperties.unityShadergraphProperties/README.md用使用 Shader Graph PBR 输出的立方体演示覆盖。选中CubeRed观察 Material Color 组件编辑 Shader Graph 时注意其 Color 属性启用了Override Property Declaration且Shader Declaration设为Hybrid Per Instance。自定义 Shader Graph 属性只有声明为 Hybrid Per Instance实体上的覆盖组件才能生效。MaterialOverridesSample零代码配置覆盖MaterialOverridesSample.unityMaterialOverridesSample/README.md演示完全不用写代码的覆盖方式球体使用 HDRP Lit、HDRP Unlit 与 Shader Graph 材质挂在 MeshRenderer 上的MaterialOverride 组件引用一个MaterialOverride 资产该资产即配置覆盖哪些属性及其值。操作选中名称含PerInstance的球体观察 MaterialOverride 组件并点击其引用的资产查看已配置的属性。生成产物即上文展示的HDRPMyColorVector4OverrideOverrideGenerated.cs这类代码并配套 HDRPMyMetallicFloatOverrideOverrideGenerated.cs浮点型 metallic与 HDRPMySmoothnessFloatOverrideOverrideGenerated.cs 等生成文件可见同一机制同时支撑向量与标量属性。BuiltInMaterialSHProperties覆盖内置 SH 属性BuiltInMaterialSHProperties.unityBuiltInMaterialSHProperties/README.md演示覆盖内置材质球谐SH属性即Unity_SH系列的值。球体由挂在 MeshRenderer 上的 Authoring 组件提供的 LightProbe SH 属性值照明。操作步骤在 Hierarchy 中选中某个 SubScene工程内有SubsceneSHAr / SubsceneSHAg / SubsceneSHAb / SubsceneSHBr / SubsceneSHBg / SubsceneSHBb / SubsceneSHC / SubsceneEmpty等多个子场景见 BuiltInMaterialSHProperties 目录点击Open打开选中球体对象确认MeshRenderer Probes Light Probes为Custom Provided修改Unity_SH内置材质属性 Authoring 组件上的值观察球体光照变化保存并关闭 SubScene。这使开发者可以绕过探针系统直接用自定义 SH 系数控制实体光照。混合组件示例3. Hybrid ComponentsHybridEntitiesConversionSubScene 中的图形伴随组件HybridEntitiesConversion.unityHybridEntitiesConversion/README.md演示可放入 SubScene 的图形相关伴随组件companion components。SubScene 中包含灯光Lights、体积Volumes与其他对象Entities Graphics 对这些图形组件全部提供支持。需要注意Particle System 在 SubScene 中不预览但在运行时能正确模拟。操作上只需打开 SubScene 观察其中的对象与组件布局。TriggerParticles从 ECS System 播放 VFXTriggerParticles.unityTriggerParticles/README.md演示如何从 ECS System 播放 VFX GraphSubScene 内有一个球体与一个 VFX GraphJumpingSpherePSSystem脚本驱动球体跳跃并在球体触地瞬间播放 VFX。VFX Graph 烘焙为伴随组件后可从 ECS 脚本访问。核心实现见 JumpingSpherePSSystem.cs// 让球体上下跳动根据时间修改 LocalTransform foreach (var translation in SystemAPI.QueryRefRWLocalTransform().WithAllJumpingSphereTag()) { translation.ValueRW.Position new float3(0, y, 0); } // 触地时播放粒子系统y 0.05f foreach (var particleSystem in SystemAPI.QuerySystemAPI.ManagedAPI.UnityEngineComponentVisualEffect().WithAllJumpingSpherePSTag()) { if (y 0.05f) particleSystem.Value.Play(); }要点通过SystemAPI.ManagedAPI.UnityEngineComponentVisualEffect查询伴随组件引用配合JumpingSphereTag/JumpingSpherePSTag两个标签其 Authoring 见 JumpingSpherePSTagAuthoring.cs 与 JumpingSphereTagAuthoring.cs实现解耦触发。API 示例4. API ExamplesEntityCreationBurst 作业中高效创建渲染实体EntityCreation.unityEntityCreation/README.md演示如何用RenderMeshDescription与RenderMeshUtility.AddComponentsAPI 配合Instantiate高效创建由 Entities Graphics 渲染的实体并通过 ECS 组件设置颜色。其脚本 TestEntityCreationAPI.cs 是完整可复用的运行时实体创建模板核心流程如下var filterSettings RenderFilterSettings.Default; filterSettings.ShadowCastingMode ShadowCastingMode.Off; filterSettings.ReceiveShadows false; var renderMeshArray new RenderMeshArray(new[] { Material }, Meshes.ToArray()); var renderMeshDescription new RenderMeshDescription { FilterSettings filterSettings, LightProbeUsage LightProbeUsage.Off, }; // 创建一个原型实体一次性添加全部渲染组件 var prototype entityManager.CreateEntity(); RenderMeshUtility.AddComponents( prototype, entityManager, renderMeshDescription, renderMeshArray, MaterialMeshInfo.FromRenderMeshArrayIndices(0, 0)); entityManager.AddComponentData(prototype, new MaterialColor()); // 在 Burst 并行作业中批量克隆原型实体 var spawnJob new SpawnJob { Prototype prototype, Ecb ecbJob.AsParallelWriter(), // ...配置数量、网格数组、包围盒等 }; var spawnHandle spawnJob.Schedule(EntityCount, 128);SpawnJobIJobParallelFor在Execute内用Ecb.Instantiate克隆原型再用SetComponent写入每实例不同的LocalToWorld、MaterialColor、MaterialMeshInfo与RenderBounds——其中RenderBounds必须按真实网格设置以保证剔除正确见MeshBounds数组的构建与Meshes[i].bounds.ToAABB()。场景中默认参数为EntityCount 10000、ObjectScale 0.1f、Radius 10、Twists 16选中 Hierarchy 中的Spawner对象即可在 Inspector 中调整这些参数然后点击 Play 观察生成的彩色球体螺旋。这正是克隆原型 Burst 作业 ECB的官方推荐高效路径。RenderMeshUtilityExampleAddComponents 最小示例RenderMeshUtilityExample.unityRenderMeshUtilityExample/README.md是RenderMeshUtility.AddComponents的精简演示由 AddComponentsExample.cs 实现。与上一示例相比它展示了用带命名参数的便捷构造器创建描述new RenderMeshDescription(shadowCastingMode: ShadowCastingMode.Off, receiveShadows: false)勾选m_differentMaterial时为每个实例运行时克隆材质并按 HSV 生成不同颜色同时设置_Color与_BaseColor兼容 Built-in 与 HD 管线构造RenderMeshArray后调用ResetHash128()刷新哈希以m_w × m_h默认 30×30网格布局克隆实体用MaterialMeshInfo.FromRenderMeshArrayIndices(matIndex, 0)为每实例指定材质索引。选中Spawner配置Mesh、m_material、m_differentMaterial、m_w、m_h后点 Play 即可看到成片立方体是理解渲染数组RenderMeshArray与实体克隆的最小可运行范例。MaterialMeshChange运行时切换材质与网格MaterialMeshChange.unityMaterialMeshChange/README.md含两个实体一个按帧切换网格、一个切换材质。实现上 MeshChangerAuthoring.cs 与 MaterialChangerAuthoring.cs 是Authoring Baker System三件套的典范Authoring 组件用[RegisterBinding(typeof(MeshChanger), frequency)]等特性把 Inspector 字段绑定到运行时组件Baker 通过AddComponentObject加入实体TransformUsageFlags.Dynamic系统在OnStartRunning中通过World.GetOrCreateSystemManagedEntitiesGraphicsSystem()拿到渲染系统调用RegisterMaterial(material)/RegisterMesh(mesh)得到BatchMaterialID/BatchMeshID在OnUpdate中每frequency帧翻转active标志并直接改写MaterialMeshInfo的MaterialID或MeshID实现切换无需重建实体或材质实例。操作步骤打开 SubScene → 选中MeshChange或MaterialChangeGameObject 观察 Authoring 组件 → 关闭 SubScene 进入 Play 模式两个对象烘焙为实体后由 ECS System 驱动周期性的网格/材质互换。形变示例5. Deformation前置条件ENABLE_COMPUTE_DEFORMATIONS 脚本宏MeshDeformations 与 SkinnedCharacter 两个形变场景都要求在Edit ProjectSettings Player Other Settings的Scripting Define Symbols中添加ENABLE_COMPUTE_DEFORMATIONS定义符号否则计算着色器形变路径不会编译。这是运行形变示例前必须完成的配置步骤。MeshDeformationsBlendShape 与蒙皮权重实体MeshDeformations.unityMeshDeformations/README.md用三色网格区分三种形变组合红色网格用 BlendShape混合形状形变蓝色网格仅用蒙皮skinning紫色网格两种方法叠加于同一网格。所有数值与变换都由一套简单动画系统写入 ECS 变换组件再由 Mesh Deformation 系统据此计算蒙皮矩阵。操作打开某个 SubSceneBlendShapeSubScene/SkinningSubScene/CombinedSubScene选中cube_test_mesh对象确认其材质使用的 Shader Graph 包含 Compute Deformation 节点。SkinnedCharacter计算着色器 vs 顶点着色器蒙皮SkinnedCharacter.unitySkinnedCharacter/README.md展示四个使用网格形变的动画角色同时演示两条蒙皮路径顶点着色器形变蓝色角色Shader Graph 必须使用Linear Blend Skinning 节点计算着色器形变粉色角色Shader Graph 必须使用Compute Deformation 节点。两个 SubSceneComputeSubScene/VertexSubScene分别对应两条路径。选中Geom_Body_LOD0可检查其材质对应的节点设置。底层蒙皮矩阵计算逻辑可参考 CalculateSkinMatrixSystem.cs它先并行收集BoneTag骨骼的LocalToWorld与RootTag根的逆矩阵NativeParallelHashMap然后在CalculateSkinMatricesJob中逐个骨骼执行skinMatrix rootWorldToLocal * boneLocalToWorld * bindPose把结果写入DynamicBufferSkinMatrix并在PresentationSystemGroup中排在DeformationsInPresentation之前执行供形变系统拾取。配套的简单动画系统写入LocalTransform与 Authoring 组件见 CommonAssets/Scripts/SimpleAnimationSystem 目录。杂项示例6. MiscDisabledEntities禁用实体与 DisableRenderingDisabledEntities.unityDisabledEntities/README.md场景含 3 个立方体其中 1 个被禁用因此屏幕只渲染 2 个。要点禁用实体与在编辑器中禁用 GameObject 无异禁用会关闭实体的一切若只想停止渲染而保留其他逻辑应在 ECS 脚本中给实体添加DisableRendering标签组件。操作打开 SubScene 选中被禁用的 Cube在 Inspector 确认其处于 disabled 状态。LODs实体的多级细节LODs.unityLODs/README.md用一片立方体网格演示 Entities Graphics 的 LOD每个 LOD 级用不同颜色区分。操作打开 SubScene 选中Root对象其下包含 100 个 LodGroup 子节点每个子节点都挂有 LOD Group 组件烘焙后这些 LOD 组会映射为实体的 LOD 组件由 Entities Graphics 按距离自动切换配套的 CameraMovement.cs 方便玩家飞行观察切换效果。MatrixPrevious运动矢量与运动模糊MatrixPrevious.unityMatrixPrevious/README.md演示多个实体的移动如何配合 HDRP 运动矢量Motion Vectors正确响应运动模糊。场景中球体父级为BallsGameObject每个球体带 Sphere ID Authoring 组件由 MoveBallsSystem.cs 逐帧平移系统先为缺失BallOriginalTranslation的球体记录初始位置随后调度MoveBallIJobChunkBurst 编译基于ElapsedTime在圆周上平移每个球体见 SphereIdAuthoring.cs 提供的标识组件。进入 Play 模式后球体烘焙为实体并以运动模糊拖尾运动——这验证了 Entities Graphics 会自动维护上一帧矩阵以生成正确的运动矢量。Submesh一个实体对应一个材质Submesh.unitySubmesh/README.md演示带 3 个子网格的单个 GameObject其 Mesh 含 3 个 sub-mesh并配 3 个独立材质。由于 Entities 每个实体只支持一个材质这类 GameObject 会被烘焙成多个实体每个材质一个。操作步骤确认 SubScene 处于关闭状态打开Window Entities Hierarchy导航到 SubScene展开带层级结构的实体观察由同一 Authoring GameObject 烘焙出的 3 个实体。TransparencyOrdering透明实体深度排序TransparencyOrdering.unityTransparencyOrdering/README.md场景含大量半透明立方体正确的渲染需要从后到前back-to-front排序。Entities Graphics 通过DepthSorted_Tag标签组件实现实体使用透明材质烘焙时该标签会被自动添加。操作步骤确认 SubScene 关闭打开Window Entities Hierarchy选中层级底部的某个实体观察该实体带有DepthSorted_Tag标签组件。该标签提示渲染器按深度排序该批实体从而获得正确的透明混合结果。总结从示例场景到生产实践的映射结合全部 20 个特性场景HDRPSamples 主 README与仓库源码可以归纳出 Entities Graphics HDRP 生产环境下的几条关键实践路径光照一体化SubScene 中的灯光、探针、光照贴图均可烘焙为 ECS 数据1. LightingStatic/非 Static 的组合决定烘焙方式逐实例渲染差异化[MaterialProperty]组件、MaterialOverride 资产、Hybrid Per Instance 声明三位一体2. MaterialProperties是替代复制材质的高效方案运行时动态内容RenderMeshUtility.AddComponents 原型克隆 Burst 作业是官方推荐的高效实体创建路径4. API ExamplesRegisterMaterial/RegisterMesh支持运行时无重建地切换材质网格高级渲染特性形变BlendShape/蒙皮、LOD、运动矢量、透明排序、子网格拆分等均有专门场景验证5. Deformation、6. Misc。每个场景目录下都配有独立 README 与可直接运行的 Authoring/System 源码是学习 Entities Graphics 1.4.x HDRP 17.x 组合特性的最佳教材先在 Base.unity 中播放切换全部场景再针对感兴趣的类别打开 SubScene 查看组件配置最后对照本文给出的源码路径深入阅读实现即可快速掌握这套渲染栈的核心用法。【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考