十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

上万条鱼 60 帧:Unity DOTS ECS 群体模拟里的 Boids 鱼群示例

上万条鱼 60 帧:Unity DOTS ECS 群体模拟里的 Boids 鱼群示例 上万条鱼 60 帧Unity DOTS ECS 群体模拟里的 Boids 鱼群示例【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamplesEntityComponentSystemSamples 的 EntitiesSamples 里有一个 Boids 示例它用 Unity DOTS 的 ECS 架构ECS——把数据从对象里拆出来单独存放的设计做群体模拟让经典 Boids 规则驱动成群的鱼同屏游动。空间哈希压缩邻居查询、Job 多线程、Burst 向量化三板斧下来参考数据是 i7-12700K 上 10 万实体维持 60fps比单线程 OOP 写法快约 40 倍。核心逻辑集中在一个 350 行左右的文件里下面拆开看它是怎么做到的。几千条鱼同屏为什么卡O(n²) 邻居查询想象一个画面几千条鱼挤在同一屏里。传统写法中每帧每条鱼都要遍历全场、找半径内的邻居——比较次数随鱼数平方增长1 万条鱼就是上亿次比较。单线程吃不完主线程还频繁随机访问缓存帧率直接崩掉。这个项目的解法是一句话空间哈希优化邻居查询。把 3D 空间按 CellRadius 切成网格鱼的位置向下取整后哈希进桶每条鱼只和同桶的鱼比较。邻居查询从 O(n²) 压到约 O(n)再叠加 Job System 的多线程并行DOTS 鱼群 60帧就有了基础。Boids 三步走切格子、攒邻居、算转向BoidSystem.cs 的核心是三个顺序执行的 Job第 1 步切格子。每条鱼按 CellRadius 把坐标量化成格子号塞进哈希桶var hash (int)math.hash(new int3(math.floor(pos * InverseBoidCellRadius))); ParallelHashMap.Add(hash, entityIndexInQuery);快的原因很简单比较范围从全场缩到同一格。第 2 步攒邻居。MergeCells 按桶聚合同一格内所有鱼的朝向、位置累加到一个槽位cellCount[cellIndex] 1; cellAlignment[cellIndex] cellAlignment[cellIndex];这是预聚合——第 3 步每条鱼算转向时不用逐个找邻居读本格子的汇总值即可。参数相同的鱼还会被 SharedComponentData 归进同一批在 Entities 窗口的 archetype同一组件组合的实体数据行里长这样第 3 步算转向。SteerBoidJob 里三条权重向量定下新朝向var alignmentResult AlignmentWeight * math.normalizesafe((alignment / neighborCount) - forward); var separationResult SeparationWeight * math.normalizesafe((currentPosition * neighborCount) - separation);白话就是看邻居平均朝向对齐、躲开格子重心分离、朝目标前进追 target三个方向加权相加。整段代码挂着 [BurstCompile]由 Burst 编译器自动向量化三个 Job 全在多核上并行跑。3 步跑起来按 Play 看 DOTS 鱼群 克隆仓库git clone https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples用 Unity Hub 打开 EntitiesSamples 工程项目使用 Unity 6.2。双击打开Assets/Boids/Boids.unity场景。按 Play。你会看到两群鱼、两条红色目标鱼和一条鲨鱼红鱼群追着目标游鱼群整体躲开鲨鱼每条鱼的尾鳍还在同步摆动。鱼的数量由场景里 BoidSchool 组件的 Count 控制BoidSchoolSpawnSystem.cs 负责开局批量实例化行为参数都在 BoidAuthoring.cs 对应的组件上Inspector 里直接改。调参速查把鱼群调出自然游动效果 参数作用推荐区间AlignmentWeight跟随邻居平均朝向的权重1.0–2.5SeparationWeight与邻居保持距离的权重0.5–1.5TargetWeight追逐目标的权重0.3–2.0CellRadius哈希格子尺寸决定邻居范围5.0–15.0ObstacleAversionDistance触发躲障碍物的距离10.0–30.0MoveSpeed游动速度20.0–30.0最直观的是 SeparationWeight调大鱼群散开、留出空隙调到 0.5 以下鱼挤成一团鱼丸子。改完存盘Play 里立刻生效。一句话总结仓库与延伸阅读这份 Boids 示例把空间哈希压邻居查询 多线程 Job Burst 向量化塞进约 350 行代码是理解 ECS 群体模拟性能上限的最佳样本之一。跑通之后你可以在本地副本里给鱼群加一条领头鱼或把单格聚合换成 3×3×3 邻格查询对比鱼群边缘的行为差异。更多 ECS 用法参考仓库内 EntitiesSamples/Docs/ 目录下的 cheatsheet。【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表