五万条鱼同场游泳:Unity ECS下的Boids群体模拟完整指南
发布时间:2026/9/20 2:43:23 作者:尧图编辑部 阅读量:1,286

五万条鱼同场游泳Unity ECS下的Boids群体模拟完整指南【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples这是Unity官方DOTS示例包EntityComponentSystemSamples里的Boids群体行为算法示例5万条鱼在水中结群游动、躲避鲨鱼、追逐红色目标全部基于Unity ECS架构实现。如果你想在游戏里模拟NPC群体、人群或鸟群鱼群这套数据进数组、逻辑并行算的写法可以直接抄作业。当5万条鱼同时追鲨鱼时 想象一个游戏开场海底里成千上万条小鱼聚成鱼群一条红色目标鱼在游一条鲨鱼从侧面杀出鱼群要躲开它还要整体保持队形。如果每条鱼都是一个挂着脚本的GameObject每帧都要遍历全场找邻居5万条鱼就是上亿次两两比较第一帧还没画完机器就先过热了。这就是群体模拟的性能墙也是这个示例要解决的问题。鱼群是怎么躲开鲨鱼的三条游泳规则Boids算法由Craig Reynolds在1986年提出思路朴素得惊人每条鱼只盯着身边的近邻守三条纪律——别离邻居太近分离Separation、朝邻居的平均方向游对齐Alignment、往群体中心靠拢凝聚Cohesion。个体只做局部小决策群体自己会长出大规模协调全程没有一个领队。本示例的实现在此基础上更实战除了对齐和分离还加了追逐红色目标和躲避鲨鱼两项行为。让它快的核心技巧是不让每条鱼扫遍整片海而是把海域切成格子只统计同格里的邻居——类似快递分拣按区域分格不用翻遍整个仓库。这样邻居查询从O(n²)降到接近O(n)这是整个示例性能的地基。原理讲完了代码里怎么落地数据存在哪鱼的性格被定义成共享组件在BoidAuthoring.cs里public struct Boid : ISharedComponentData { public float CellRadius; public float SeparationWeight; public float AlignmentWeight; ... }参数完全相同的鱼共享同一份组件数据内存排布紧凑CPU缓存命中率自然高。默认值是CellRadius8、MoveSpeed25、TargetWeight2。逻辑在哪跑核心系统BoidSystem.cs是一条三级Job可并行执行的多核任务流水线第一级空间哈希——把每条鱼按位置塞进格子里var hash (int)math.hash(new int3(math.floor(localToWorld.Position * InverseBoidCellRadius))); ParallelHashMap.Add(hash, entityIndexInQuery);第二级合并格子——对每个格子累加鱼的朝向与位置得出群体平均值顺便为每格找最近的目標与障碍物。第三级个体转向——每条鱼用自己的格子数据算新方向三条规则各带权重var alignmentResult CurrentBoidVariant.AlignmentWeight * math.normalizesafe((alignment / neighborCount) - forward); var separationResult CurrentBoidVariant.SeparationWeight * math.normalizesafe((currentPosition * neighborCount) - separation); var targetHeading CurrentBoidVariant.TargetWeight * math.normalizesafe(nearestTargetPosition - currentPosition);离鲨鱼太近时一行select就切换到逃逸方向var targetForward math.select(normalHeading, avoidObstacleHeading, nearestObstacleDistanceFromRadius 0);⚡性能靠什么保每个Job都标了[BurstCompile]Unity的Burst编译器会把这段C#转成向量化、充分优化的机器码Job System再把各Job调度到多个CPU核心并行跑。5万实体跑得动直接原因就在这两个特性上。3步跑通Boids示例代码在EntitiesSamples工程里跟着走克隆仓库git clone https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples在Unity Hub安装工程声明的版本6000.2.10f1见ProjectVersion.txt用Unity打开EntitiesSamples目录等包与资源导入完成打开场景Assets/Boids/Boids.unity按Play鱼群模拟即开始Boids参数调优速查表️ 所有可调参数都在Boid组件上默认值与参考范围参数作用建议范围CellRadius空间格子大小决定谁算邻居5~15默认8AlignmentWeight与邻居同向游泳的权重0.5~2.5默认1SeparationWeight远离过近邻居的权重0.5~1.5默认1TargetWeight追逐红色目标的权重0.5~2.5默认2ObstacleAversionDistance触发鲨鱼逃逸的距离10~40默认30MoveSpeed每条鱼的游动速度10~40默认25调优小技巧先单独拉大CellRadius观察抱团程度——格子越大每条鱼看到的邻居越多整群越像一条鱼龙想要松散鱼群就调小。数量则改场景里BoidSchoolAuthoring的Count当前每群25000、共两群可以直接加到十几万观察帧率变化。这套算法还能搬到哪足球/ MOBA队友跑位球员不沿固定路线走而是依据邻居自组织卡位策略游戏单位集群集结、溃退、拉扯同样是这三条规则的变形疏散模拟把目标换成出口就得到人群逃生演练的原型这个示例是整个仓库里ECS并行模拟的参考答案数据用共享组件摊平逻辑拆成Job流水线复杂度靠空间哈希压住性能由Burst兜底。感兴趣的话直接去仓库打开Boids.unity跑一遍再对照EntitiesSamples/Docs里Systems、组件与Job的官方文档深读项目总览见EntitiesSamples/README.md。【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考