当前位置: 首页 > news >正文

【Unity万人同屏插件】使用手册 保姆级教程 GPU动画 Jobs多线程渲染

【万人同屏插件】已经重构、重磅升级!新版使用手册:

最新版万人同屏插件使用手册https://blog.csdn.net/final5788/article/details/160112516

【跨代升级:万人寻路导航、3D地形Terrain,全新GPUSpine,自动合并网格图集,自动简化生成LOD网格,重写小游戏平台渲染系统,性能/功能全面提升、2D/3D全面兼容】

万人同屏插件重磅升级, 功能介绍https://efunstudio.cn/unitymasskit

在线体验网页版demohttps://efunstudio.cn/web-demo/


⚠注意:我司拥有⌈Unity万人同屏插件⌋合法著作权,盗版必究!

著作权登记号:2025SR1686440

插件有防盗机制,谨防受骗。对于盗版商用项目,我司将以法维护知识产权。盗版传播、出售将永久停更、禁用,并通过知识产权保护平台封禁、处罚盗版者。

⚠使用订单号登录http://assets.efunstudio.cn/随时更新插件、免费获取更多文档和视频教程

插件自2023年发布,频繁更新至今。倾听客户需求和反馈,不断优化完善,发布了多项突破性重磅功能,有效解决行业痛点、技术难题。完美解决中小企业和独立开发者的技术劣势,打破技术壁垒,提升项目竞争力! 已为客户创造多个爆款产品!

一次付费,永久免费更新,不以任何理由二次收费。插件运行时百分百源码,永远不会给客户任何潜在风险。

合法授权使用、不破解/盗版即可永久获取更新。


更新流程:

发布功能计划 -> B站优先展示测试版功能 -> 内部测试打磨验证稳定性 -> 更新发布到assets.efunstudio.cn (请勿催更, 验证通过后会第一时间发布正式版)


万人同屏插件获取&体验Demo下载

万人同屏插件是一款通用的Unity性能优化插件,是实现千人同屏、万人同屏的必备插件,直击性能消耗痛点功能,将2D Spine和3D动画渲染性能十倍至百倍提升,Jobs多线程移动避让索敌算法,以及兼容全平台的高性能渲染器。新手友好简单易用无ECS技术门槛传统开发方式,同样适用于旧项目低成本性能优化。

万人同屏插件兼容Unity全平台,包括WebGL(2.0),微信/抖音小游戏等平台同样大幅性能翻倍

Unity万人同屏插件功能性能演示

Unity万人同屏集成方案Pro 支持微信小游戏https://efunstudio.cn/

性能/功能/红蓝对抗测试Demo Web在线体验https://assets.efunstudio.cn/

插件核心功能图

十万单位红蓝对抗 多兵种战斗 弹幕游戏项目模板

网页版在线测试性能

▷幸存者Demo

▷性能测试Demo


【万人同屏插件】

无ECS技术门槛,无需写ECS代码,通过传统开发方式获得极致性能,UI程序员也能直接上手写出万人同屏项目。

以GPU动画为基础,实现3D动画、2D Spine高性能渲染,同时支持GPU Instancing或DOTS Instancing。基于Dots技术栈(Jobs&Burst)实现高性能计算,海量单位移动/锁敌/碰撞检测。独立开发高度封装了渲染器接口,通过合批十倍或百倍大幅提升游戏帧数。并且支持Unity全平台(PC、Android、iOS以及WebGL和微信小游戏、抖音小游戏等平台)

可以大幅提升PC、移动平台、小游戏平台的游戏帧数,同时,转换为GPU动画后可以抵消AnimationClip文件大小,某些情景下可用作包体大小优化。

适用于海量单位游戏项目突破技术门槛,同时也适用于任何需要做性能优化的项目。例如:割草、类吸血鬼、RTS、SLG、弹幕游戏,以及海量树木、植被、建筑渲染等。

Dots正式版发布于Unity2022.3 LTS版,因此强烈建议使用Unity 2022.3.x及以上版本,插件同样支持最新版Unity 6。 若仅使用GPU动画,无上述限制。

万人红蓝对抗项目​​​

Unity万人同屏 新版ECSGraphics pc 手机 性能测试 安卓也能万人同屏战斗了

测试环境

系统:Windows 11

Unity:Unity 2022.3.45f1

CPU: i7-13700KF

GPU: RTX 3070 8G

Unity万人同屏 新功能ECSGraphics接口用法 详解 性能 功能 大幅提升 简单易用保姆级使用教程

GPU动画插件(支持3D\2D Spine):

兼容性

纯Shader实现的GPU动画,超高性能。插件支持Unity全平台,兼容WebGL,可用于H5/小游戏开发。支持动画事件、保留骨骼信息(动态获得骨骼节点位置/旋转/缩放)、2D Spine半透物体渲染顺序、动画平滑融合过渡(Pro)、LOD生成(Pro)。

实现原理

由于Animator或Spine动画都是CPU计算,因此存在性能瓶颈、并且蒙皮动画无法合批渲染,DrawCall大幅降低帧数(以性能测试demo为例,1w个Animator仅有8 fps)。

GPU动画是把Animator转换为GPU计算, Shader中播放动画。使用MeshRenderer或BRG渲染,自动合批渲染,大幅降低DrawCall。以性能测试demo为例, 1w个GPU动画117 fps; 而使用BRG渲染GPU动画,帧数高达800 fps

一、3D动画转GPU动画

1. GPU动画批量转换(新增)

2025.6.1更新:新增GPUAnimationBuilder优化GPU动画转换工作流,支持批量转换,便于维护。同时保留旧版GPU动画转换窗口。

①创建GPUAnimationBuilder资源

②设置要转换的动画Prefab和转换参数

拖入动画Prefab后点击ResetConfigs按钮一键填充默认参数

③添加要记录的骨骼(可选)

打开动画Prefab邮件节点GPUAnimation->Copy Transform path复制节点路径,粘贴到骨骼记录列表(RecordBones)

④点击Build按钮生成GPU动画

2. GPU动画转换工具界面(不推荐)

通过Unity顶部菜单Game Framework->GPU Animation->GPU Animation Converter打开工具界面

GPU动画转换工具面板:

①拖入需要转换的Animator/Animation预制体;

②动画模式:支持GPU骨骼动画和顶点动画;推荐骨骼动画,功能更强大;

③合并网格:合并Mesh降低DC, 对于Spine动画将进行排序,确保半透物体渲染排序正确;仅支持共用相同材质的网格合并,对于不同材质、多张贴图的物体,可通过三方插件Mesh Baker先合并材质/贴图,再转换GPU动画。

④Animator相关设置,默认值即可。 如是否冻结根骨骼位置/旋转等;

⑤选择GPU动画shader, Spine动画要选择2D shader;也可生成GPU动画后再切换材质shader;

⑥需要烘焙到GPU动画贴图的Animation Clips 工具默认添加Animator中引用的所有Animation Clip;通过列表的索引值切换动画状态;

⑦把需要运行时获取transform值的骨骼节点拖到此处 转换为GPU动画后仍能实时获取到骨骼transform值; 此功能可使转换为GPU动画后骨骼信息不丢失,比如可以实时获取头部、手部位置;

3. GPU动画工具用法

①把Animator或Animation动画角色预制体拖入场景;

②把拖入场景的预制体拖入GPU动画转换工具的Input栏;

③拖动Animation Clips列表元素,组织好自己的动画索引对应的动画(可选);

④把需要保留骨骼transform信息的节点拖到Record Bones列表;

⑤点击Convert按钮,转换为GPU动画;

4. GPU动画资源

转换后会生成以下GPU动画文件:

①动画贴图。记录着动画数据;

②GPU动画Prefab。将原动画Prefab中的SkinnedMeshRenderer转换为了MeshRenderer,同时拥有动画播放功能和自动合批渲染;

③GPU动画帧事件,用于GPU动画播放时触发动画事件。工具默认会把Animation Clip文件中添加Event事件转换为GPU动画帧事件;

④GPU动画材质,由于是纯shader实现,因此可以不依赖任何脚本,仅修改材质属性切换动画;

⑤GPU动画Mesh,Mesh中寄存了某些信息,以便GPU动画Shader读取使用;

5. 自定义GPU动画Shader

插件使用Shader GraphAmplify Shader Editor封装好了函数节点,只需添加GPU动画节点连接顶点位置、顶点法线即可轻松实现自定义Shader

使用Amplify Shader Editor
使用Shader Graph

二、2D Spine转GPU动画

十代i5 + 1050显卡下依然性能强悍

实际上,只需要把Spine转换为Animator,就可以通过标题一的步骤把Animator转换为GPU动画

2d spine动画帧数提升数十倍?spine转gpu动画 2d spine动画 10w单位

1. Spine转Animator工具

①通过Unity顶部菜单栏 GameFramework->GPU Animation->Spine to Animator打开工具

②把Spine文件拖到工具,点击Bake按钮开始转换

Spine转Animator注意事项:

Spine独立实现了一些Animator不支持的特性,必须绕过这些特性才能完整转换为Animator后还原完整动画效果(不支持转换的关键帧是骨骼动画中非必要特性,可以轻松绕过)

烘焙骨骼不支持以下特性:
① 禁用旋转/缩放继承
② 局部错切变换
③ 所有约束类型
④ 绑定骨骼超过4根的权重顶点

烘焙动画不支持以下特性:
① 网格变形关键帧
② 颜色关键帧
③ 绘制顺序关键帧

2. Spine转GPU动画

使用GPU Animation Converter把步骤1 Spine转换出的Animator预制体转换为GPU动画。

注意:Spine通常是2D半透明物体,因此需要把GPU动画Shader切换为2D的Shader(如:GPUAnimation/2D/GPUBonesAnim2D)

三、GPU Animation LOD工具 [PRO版功能]

多线程渲染器支持LOD, 根据距离显示不同精度模型,大幅提升性能

1. 自动生成减面LODs

根据LOD 0 Mesh生成LOD 1~4简化Mesh;

①此工具依赖三方插件MantisLOD,用于自动简化Mesh面数,同时尽量保留Mesh轮廓。安装MantisLOD后,解除代码GPUAnimationLODCreator.cs第一行注释即可使用功能:

#define ENABLE_MANTISLOD //安装MantisLOD插件后解除此行注释 ... #if ENABLE_MANTISLOD using MantisLOD; using MantisLODEditor; #endif

②GameFramework->GPU Animation->GPU Animation LOD打开工具

2. 使用已有LOD Mesh生成(可选)

除了使用工具自动生成减面LOD Mesh, 当然也可以根据已有的Mesh直接生成LODs Mesh。

注意:仅使用BRG渲染器需要步骤②合并LOD Mesh, 使用ECSGraphics无需合并。

四、武器挂载、动画事件、骨骼获取

武器挂载 帧事件 骨骼获取 视频教程

1. 武器挂载

①把武器作为GPU动画角色的子节点,修改材质shader为GPUAnimation/GPUAttachBoneLit,并将主角的动画贴图赋值到材质;

②通过修改武器材质的AttachBoneIndex来设置武器绑定到哪个骨骼

说明: 这里AttachBoneIndex对应的就是GPU动画工具界面RecordBones记录的骨骼节点索引

2. 动画事件

GPU动画事件触发时实时获取拳头骨骼位置

转换GPU动画时会自动生成动画事件文件,如下图:

默认情况下,工具是从Animation Clip文件读取动画事件,以key, value形式保存。key是触发帧,value是事件名。用户可直接修改此文件增删事件。

①. GPU动画帧事件用法:

使用GPUAnimation脚本,设置好Event Data:

GPU动画事件实例代码:

using Cysharp.Threading.Tasks; using GPUAnimation.Runtime; using UnityEngine; public class GPUAnimEventDemo : MonoBehaviour { GPUAnimation.Runtime.GPUAnimation m_GPUAnim; private void Start() { m_GPUAnim = GetComponent<GPUAnimation.Runtime.GPUAnimation>(); //添加GPU动画事件监听 m_GPUAnim.Events.AddListener(OnGPUAnimEventCallback); m_GPUAnim.GPUAnimMaterial.SetVector("_ClipId", new Vector4(4, Time.time, 0, 0)); } private void OnDestroy() { m_GPUAnim.Events.RemoveListener(OnGPUAnimEventCallback); } /// <summary> /// GPU动画事件回调 /// </summary> /// <param name="clipIndex">动画index</param> /// <param name="frame">触发帧</param> /// <param name="eventName">事件名</param> private void OnGPUAnimEventCallback(int clipIndex, int frame, string eventName) { if (eventName == "DamageTrigger") //挥拳动画事件触发时在拳头位置发射小球 { var boneData = GPUAnimationUtility.GetAttachBoneTransform(m_GPUAnim.GPUAnimMaterial, 1);//获取右手当前动画帧的位置 GameObject ball = GameObject.CreatePrimitive(PrimitiveType.Sphere); ball.transform.localScale = Vector3.one * 0.2f; ball.transform.position = m_GPUAnim.transform.position + boneData.Position; _ = UniTask.Delay(1000).ContinueWith(() => { Destroy(ball); }); } } }

②. ECSGraphics多线程渲染下GPU动画帧事件用法

为了应对海量单位下动画事件触发依然流畅,ECSGraphicsComponent组件专门提供了jobs多线程实现的事件触发检测函数:

public bool GPUAnimationEventsUpdate(out NativeQueue<GPUAnimTriggerInfo> triggerResults)

代码示例:

在Update中每帧调用,以批量检测动画事件触发

void Update() { if (ECSGraphicsComponent.Instance.GPUAnimationEventsUpdate(out var triggerResults)) { while (triggerResults.TryDequeue(out var result)) { //当前帧触发的GPU动画事件数据result if (m_Players.TryGetValue(result.ECSEntity, out Player unit)) { unit.OnGPUAnimationEvent(result.ECSRenderIndex, result.ClipIndex, result.TriggerAtFrame); } } triggerResults.Dispose(); } }

3. 骨骼获取

用于GPU动画运行时,实时获取某个骨骼节点的Transform信息;例如,角色持枪射击,子弹应从枪口位置创建发射(市面上其它GPU动画插件,转换GPU动画后骨骼信息全部丢失,无法获取枪口位置)。

GPUAnimationUtility类提供了多种获取当前GPU动画帧某个骨骼的transform信息的接口

例如,获取RecordBones记录的索引为1的骨骼transform信息:

GPUAnimationUtility.GetAttachBoneTransform(GPUAnimMaterial, 1);

ECSGraphicsComponent同样提供了封装好的接口:

ECSGraphicsComponent.Instance.GetGPUAnimationBone(entity, boneIndex)

五、动画平滑过渡、融合 [PRO版功能]

3D/2D Spine动画平滑切换,支持控制过渡时长

直接把GPU动画材质的Shader切换为支持平滑过渡的Shader即可,如:GPUAnimation/GPUBonesAnimMergeLit

ClipId:该参数用于切换动画,对于不支持动画融合的Shader, x是动画index, y是开始播放的时间(Time.time);

对于支持动画融合的Shader,z是上个动画的index,w是上个动画的播放时间,x是要切换到的动画index,y是动画第一帧开始的时间,也就是不算融合时间(Time.time + 动画过渡消耗时间)

AnimTransDration:动画平滑过渡(融合)速度

GPU动画使用限制

尽管已经实现大量GPU动画功能,但依然比不上高级动画系统的功能,如IK、Avatar Mask是不支持的。

由于GPU动画贴图储存动画信息有限,目前支持记录Transform信息和GameObject的显示隐藏。对于3D动画完全足够。但对于2D Spine动画,有时会记录特殊的关键帧,如修改颜色、修改贴图等,这些GPU动画是不支持的,但仍可以通过显示隐藏实现, 例如,皮肤A切换到皮肤B,可以通过隐藏皮肤A,显示皮肤B以实现换装功能。

ECSGraphics渲染器(推荐)

随着Unity ECS方案逐步完善,因此我们使用Entities Graphics高度封装了一套高性能渲染器用于平替之前的自定义BRG方案,虽然引入了ECS包,但同样不用写一行ECS代码,传统开发方式即可实现超高的渲染性能。提供更完善的功能,同时带来大幅性能提升。相比官方Entities Graphics, 我们使用GPU Instancing技术实现了无感知对Web平台的支持, 实现了全平台的高性能渲染。
Web平台性能展示demohttps://efunstudio.cn/#web-demo

ECSGraphics功能:

0. 2025.10.9重磅更新,新增对Web平台支持,率先支持微信小游戏等web平台。(解决Unity官方DOTS不支持Web平台的痛点), 网页版demo体验:https://efunstudio.cn/#web-demo

1. 支持子物体

比如给角色添加血条为子物体,就能跟随角色自动移动。解决之前BRG不支持子物体,想要添加武器还需要自行同步武器位置的问题。

2. 支持武器挂载,挂载点切换等。

我们的GPU动画方案支持挂载,但之前只能在Prefab模式使用武器挂载。现在我们直接支持将武器挂载到GPU动画主体,并支持动态切换挂载点,使武器跟随骨骼位置运动。

3. 不再限制最大创建数量

BRG版本固定内存长度,因此有数量限制。ECSGraphics渲染器无限数量、动态扩容。

4. LODs等级数量由BRG版本最大4级,ECSGraphics渲染器最大支持8级LOD。

5. 更好的支持半透明物体,同时性能翻倍。

6. RVO渲染同步、GPU动画事件检测等性能提升。

7.(new) 2025.12.2新增独立的目标查找/索敌/碰撞检测/射线检测系统

ECSGraphics用法:

1. 注册要渲染的物体:

与使用BRG渲染器一样,需要将渲染的Mesh和Material添加到ECS Renders列表,如果有GPU动画事件也需要配置事件文件,如果需要LOD功能,则将不同等级mesh配置到LOD Renders列表。最大支持8个LOD等级。

2. 创建/销毁一个物体

先要渲染一个物体只需要调用Add方法, 移除Remove

var entity = ECSGraphicsComponent.Instance.Add(0, Vector3.zero, Quaternion.identity, 1); ECSGraphicsComponent.Instance.Remove(entity);//移除指定物体 ECSGraphicsComponent.Instance.RemoveAll(); //移除全部

创建物体时也可以指定父节点,使其跟随父节点移动:

public Unity.Entities.Entity Add(int renderId, float3 pos, quaternion rot, float scale = 1, Unity.Entities.Entity parentEntity = default, int customId = 0)

3. 添加/删除GPU动画挂载物体

可以将任意Mesh挂载到GPU动画物体的任意骨骼上,使挂载物跟随GPU动画骨骼运动。挂载物的Material需使用GPU动画提供的GPU动画的AttachBone shader。同时支持动态切换挂载到哪个骨骼。

比如给GPU动画玩家右手挂载一把枪:

player = ECSGraphicsComponent.Instance.Add(0, Vector3.zero, Quaternion.Euler(0, 180, 0), 3); weapon = ECSGraphicsComponent.Instance.AddAttachment(2, player, 0, Vector3.zero, Quaternion.identity); ECSGraphicsComponent.Instance.RemoveAttachment(player, weapon);//移除player身上的weapon挂载物 ECSGraphicsComponent.Instance.RemoveAllAttachments(player); //移除player身上所有挂载物体

切换挂载点, 比如将武器从右手切换到左手:

ECSGraphicsComponent.Instance.SetAttachmentBoneIndex(weapon, boneindex);

4. 播放/平滑切换GPU动画:

ECSGraphicsComponent.Instance.PlayGPUAnimation(player, gpuAnimationClipIndex);

同时也支持切换动画时传入动画平滑过渡时间,若不传入过渡时间,程序将默认读取GPU动画shader材质上的 _AnimTransDuration字段配置的时间

public void PlayGPUAnimation(Unity.Entities.Entity entity, int animClipIndex, float animCrossFadeDuration)

5. GPU动画事件触发检测

全局只需要在一处Update中实时跳用GPU动画事件检测刷新函数ECSGraphicsComponent.Instance.GPUAnimationEventsUpdate(out var events),即可得到事件触发列表,批量对已触发事件做出响应.

void Update() { //GPU动画事件触发检测 if (ECSGraphicsComponent.Instance.GPUAnimationEventsUpdate(out var events)) { while (events.TryDequeue(out var eventInfo)) { Debug.Log($">>>>>>>>>>>>>>动画事件触发: 动画clip:{eventInfo.ClipIndex}, entity:{eventInfo.ECSEntity}, 触发帧:{eventInfo.TriggerAtFrame}"); //实时获取GPU动画骨骼的Transform信息 var bone = ECSGraphicsComponent.Instance.GetGPUAnimationBone(player, 1); //在当前骨骼位置创建一个物体,并0.5秒后删除 var ball = ECSGraphicsComponent.Instance.Add(1, bone.Position, bone.Rotation, 0.5f); UniTask.Delay(500).ContinueWith(() => { ECSGraphicsComponent.Instance.Remove(ball); }).Forget(); } events.Dispose(); } }

此次渲染器升级相比BRG不仅增加了多项功能、更简单易用,同时性能也普遍大幅提升。

尤其是半透明物体渲染性能,BRG版本需要自行对半透明物体进行排序后渲染,对性能影响很大。

比如1万个2D GPU Spine动画, 红米K80P测试机下的表现,具体性能提升请见文章开头提供的demo下载:

ECSGraphics版手机端能达到最大限制帧数120帧:

ECSGraphics版120帧

ECSGraphics目标搜索系统:

也就是说, 即使不使用RVO,仅仅使用ECSGraphics, 从图形层面就可以使用多线程Jobs高性能索敌/目标搜索接口。

创建实体时,添加一个ECSTargetingData(索敌筛选配置)即可参与索敌:

var entity = ECSGraphicsComponent.Instance.Add(0, pos, Quaternion.identity); ECSGraphicsComponent.Instance.AddComponentData<ECSTargetingData>(entity, new ECSTargetingData(ECSTargetingLayer.L1, ECSTargetingLayer.L1, ECSTargetingLayer.NONE, 0.5f, 5f, 100, 360));

1. Raycast / SphereCast射线检测,支持以实体查找、以点查找:

NativeArray<Unity.Entities.Entity> targets; if (Input.GetKey(KeyCode.Q)) { // 射线检测 targets = ECSGraphicsComponent.Instance.Raycast(m_QueryPoints, m_QueryPointsB, m_PointsTargetingData); } else { // SphereCast 球体抛射检测 targets = ECSGraphicsComponent.Instance.SphereRaycast(m_QueryPoints, m_QueryPointsB, m_PointsTargetingData); } // 遍历检测目标 if (targets.IsCreated) { foreach (var tag in targets) { if (tag == Unity.Entities.Entity.Null) { break; } ECSGraphicsComponent.Instance.SetMainColor(tag, new Unity.Mathematics.float4(1, 0, 0, 1)); } targets.Dispose(); }

2. GetNearest查找最近实体, 支持以实体查找、以点查找:

targets = ECSGraphicsComponent.Instance.GetNearest(m_QueryPoints, m_PointsTargetingData);

3. GetWithin查找范围内实体,支持以实体查找、以点查找:

1. 批量查询每个实体 攻击范围内的敌人 var targets = ECSGraphicsComponent.Instance.GetWithin(m_Player, m_Player.Length); if (targets.IsCreated) { int resultIndexOffset = 0; for (int i = 0; i < m_Player.Length; i++) { var player = m_Player[i]; 2. 根据每个实体配置的最大攻击个数遍历被攻击对象 var maxTargetCount = ECSGraphicsComponent.Instance.GetComponentData<ECSTargetingData>(player).MaxAttackCount; var playerColor = ECSGraphicsComponent.Instance.GetComponentData<MaterialBaseColor>(player).Value; for (int j = 0; j < maxTargetCount; j++) { var target = targets[resultIndexOffset + j]; 3. 遇到Null说明后面已经无对象 if (target == Unity.Entities.Entity.Null) { break; } 4. 对目标进行伤害 //TODO Something... player.Attack(target); } resultIndexOffset += maxTargetCount; } 5. 用完结果后释放内存 targets.Dispose(); }

RVO多线程避让

Unity Dots 10万人同屏RVO避障是一种什么体验? 3D人物带动画,不使用ECS

1. 添加RVO单位

AddAgent()会返回一个RVOAgent对象,可通过此对象设置各种rvo参数

m_RVO = RVOComponent.Instance.AddAgent(position);

2. 移除RVO单位

RVOComponent.Instance.RemoveAgent(m_RVO);

3. RVO属性功能

Draw Debug: 在Editor下Scene窗口绘制RVO单位调试线框, 以图形展示单位位置、方向、大小;

Plane:RVO移动平面空间,3D通常设为XZ, 2D通常设为XY (RVO之所以性能高于多线程寻路数十倍到百倍,原因是计算量小、为平面空间计算. 如需支持三个维度,可根据需求刷新pos第三维度数值实现)

AutoUpdateEntityTrans: RVO单位创建时支持绑定GameObject,勾选即表示自动同步RVO与绑定GameObject的位置、方向。

RVO单位移动避让参数,每个RVO单位可独立设置以下属性:

Height:默认值即可,无需修改;

Radius:RVO单位的碰撞体半径, 可理解为Circle Collider(圆形碰撞体)的半径,RVO单位之间的碰撞以此半径计算;

Radius Obst: RVO单位与Obstacle障碍物的碰撞半径;

MaxSpeed: RVO单位的移动速度(最大),接近目标点后会自动减速;

MaxNeighbors: RVO避让计算参与影响的临近RVO单位数量,默认即可;

Neighbor Dist:RVO避让计算参与影响的临近RVO单位距离,默认即可;

TimeHorizon:可理解为RVO单位之间的避让减速距离;

TimeHorizonObst: 可理解为RVO单位与Obstacle障碍物之间的避让减速距离。

AvoidWeight:避让权重,比如高级兵不给小兵让路,小兵需要给高级兵让路,以避免高级兵被小兵挡住的情况。只需设置avoidWeight,取值0-1,值越小越不让路。

layerOccupation:RVO单位分层,与layerIgnore配合用于精准控制不同层之间是否碰撞。

layerIgnore:设置忽略碰撞的单位layer类型。该参数为位枚举,可精准控制忽略一种或多种单位之间的碰撞。如rvoA.layerOccupation = L0, rvoB.layerOccupation = L1; rvoA.layerIgnore = L1表示rvoA不与rvoB碰撞

collisionEnabled:是否碰撞,false表示不碰撞,RVO会相互穿透。

navigationEnabled:是否启用移动避让。false表示原地不动。

stopMoveSelf:停止主动移动,但会被其它RVO单位挤走。

arrived:是否已经到达targetPosition。

RVO单位索敌相关参数:

searchRadius:目标搜索半径, 索敌接口将返回满足半径内的目标id(注意, searchRadius指的是RVO单位边到边的距离,双方RVO的Radius会被减去)

searchCount:寻敌数量,==1,单体攻击;>1, 群体攻击

targetPosition:移动目标点,给定目标点,rvo单位会自动向目标点移动。

camp:单位所属阵营,数据类型是位枚举,所以支持单个单位多个阵营(以满足用户特殊需要)

searchTag:标记自己的标签,数据类型是位枚举,支持标记多个标签;此标签配合ignoreSearchTag使用,用于精准控制寻敌过滤目标;例如:敌方阵营有个飞行单位,我方阵营的近战单位虽然属于敌对阵营,但近战单位不可能攻击到高空飞行目标。

ignoreSearchTag:寻敌时忽略掉ignoreSearchTag位枚举中包含的searchTag,用于精准控制筛选寻敌

collisionEnabled:rvo单位之间是否碰撞,为false时rvo之间将会重叠穿模

navigationEnabled:rvo单位是否自动移动,设为false后,即可通过rvo的position来随意设置位置;例如:击飞效果,单位受到攻击后被击飞,就可以通过设置navigationEnabled为false,然后自行设置position实现击飞效果,落地后再设置navigationEnabled为true即可从击飞落地位置重新移动。

4. 障碍物

①添加圆形障碍物:把CircleObstacle脚本挂到障碍物GameObject上即可

②添加举行障碍物:把BoxObstacle脚本挂到障碍物GameObject上即可

③添加边界障碍物:把EdgeObstacle脚本挂到障碍物GameObject上即可,通过面板参数添加边界顶点位置

④扩展自定义障碍物:自定义类继承ShapeObstacleBase,重写方法即可

海量单位多线程寻敌/碰撞检测:

Unity弹幕游戏, RVO红蓝对抗 割草游戏 海量单位高性能索敌攻击方案压测

方案是通过Jobs多线程批量查询单位,支持查询最近单位、范围内单位等,通过RVOComponent提供的接口查询

具体使用方法可参考插件提供的demo, EnemiesSearchDemo.cs

1. 查询最近单位

var ids = RVOComponent.Instance.GetNearest(pointsA, pointsA.Length, new TargetingData(TargetingLayer.NONE, TargetingLayer.NONE, TargetingLayer.NONE, 0, 0), out int idsLength); RVOComponent.Instance.ForeachSingleTargetingResults(ids, idsLength, (queryIndex, targetAgentId) => { if (RVOComponent.Instance.TryGetAgent(targetAgentId, out var targetAgent)) ECSGraphicsComponent.Instance.SetMainColor(targetAgent.ecsEntity, debugColor); });

2. 查询范围内目标

int maxAttackCount = RVOComponent.CalculateMaxTargetingCountWithin(debugTargetingRadius, 0.5f); var ids = RVOComponent.Instance.GetWithin(pointsA, pointsA.Length, new TargetingData(TargetingLayer.NONE, TargetingLayer.NONE, TargetingLayer.NONE, debugTargetingRadius, maxAttackCount, 360), math.forward(), out int idsLength); RVOComponent.Instance.ForeachMultiTargetingResults(ids, pointsA.Length, maxAttackCount, (queryIndex, targetAgentId, targetIndex) => { if (RVOComponent.Instance.TryGetAgent(targetAgentId, out var targetAgent)) { ECSGraphicsComponent.Instance.SetMainColor(targetAgent.ecsEntity, debugColor); } });

3. 射线检测/球体抛射

//通过点的方式,批量射线检测。A、B两点确定一条射线,适用于技能伤害等场景 1. 提供了最大索敌个数预测接口, 可以快速计算出空间内最多容纳多少单位 int maxAttackCount = RVOComponent.CalculateMaxTargetingCountRaycast(pointsA[0], pointsB[0], 0, 0.5f); 2. Raycast接口重载,以点的方式射线检测。 TargetingData是目标筛选过滤数据,支持根据视野、攻击范围、阵营、Layer、优先级等,精准控制过滤。 var ids = RVOComponent.Instance.Raycast(pointsA, pointsB, pointsA.Length, new TargetingData(TargetingLayer.NONE, TargetingLayer.NONE, TargetingLayer.NONE, attackRadius, maxAttackCount), out int idsLength); 3. 提供了索敌结果遍历接口,更简单易用。接口自动遍历批量索敌结果,返回索敌者和被锁敌者信息。 RVOComponent.Instance.ForeachMultiTargetingResults(ids, pointsA.Length, maxAttackCount, (queryIndex, targetAgentId, targetIndex) => { //遍历每个被索住的目标,处理攻击、伤害等AI逻辑 if (RVOComponent.Instance.TryGetAgent(targetAgentId, out var targetAgent)) ECSGraphicsComponent.Instance.SetMainColor(targetAgent.ecsEntity, debugColor); });

注意事项:

一、ECSGraphics兼容性

渲染管线:支持URP、HDRP、自定义SRP。不支持内置渲染管线。首推URP

兼容平台:Unity全平台,我们额外实现了WebGL支持,解决官方DOTS不支持WebGL的痛点。您可在Web平台、微信小游戏、抖音小游戏等完美使用,大幅提升性能。

  • Windows using DirectX 11
  • Windows using DirectX 12
  • Windows using Vulkan
  • Universal Windows Platform
  • Linux using Vulkan
  • macOS using Metal
  • iOS
  • Android (Vulkan and OpenGL ES 3.x)
  • PlayStation 4
  • PlayStation 5
  • Xbox One
  • Xbox Series X and Xbox Series S
  • Nintendo Switch
  • Google Stadia
  • WebGL (WebGL 2.0)

二、打包设置

1. URP Rendering Path选择Forward+ (Forward+才能发挥BRG最大性能)

2. BatchRendererGroup Shader变体选择 Keep All

3. 打包WebGL

常见问题1:编辑器或其它平台正常,打包WebGL渲染异常;

解决方法:如果PlayerSettings设置的为WebGL 1,Shader Model需设置为2.0;WebGL2可设置Shader Model为3.0或3.5

使用Amplify Shader Editor打开GPU动画Shader,设置Shader Model:

http://www.jsqmd.com/news/736884/

相关文章:

  • OpenClaw自定义技能开发指南:构建专属知识库实现精准检索
  • 2026哪个平台有特价机票?主流平台省钱功能实测 - 品牌排行榜
  • C++性能调优实战:用Google Benchmark对比vector、array和原生数组的访问开销
  • 构建高可用通知系统:从渠道抽象到事件驱动的工程实践
  • 2026年哪个平台买机票安全?主流平台实测对比 - 品牌排行榜
  • 2026哪个平台买机票便宜?主流购票平台实用测评 - 品牌排行榜
  • AO3镜像站完整指南:3步解锁全球同人创作宝藏
  • 2026在哪个平台订机票最省心?实测体验分享 - 品牌排行榜
  • 智慧树自动刷课插件终极指南:三步实现高效学习自动化
  • 终极qmcdump使用指南:快速解密QQ音乐加密文件实现跨平台播放
  • 别再被Python的format()坑了!手把手教你解决‘Invalid format string’报错(附三种实战场景)
  • 2026年在哪些平台订机票有套餐优惠 - 品牌排行榜
  • 从《奥米勒斯城出走的人》到现代科技伦理:当你的幸福建立在别人的‘数据牢笼’上
  • sequelize-typescript高级技巧:处理循环依赖和多Sequelize实例的终极方案
  • CSP/信奥赛C++语法基础刷题训练(18):计算阶乘
  • 2026哪个平台有直飞优惠?主流出行平台省钱攻略 - 品牌排行榜
  • Python二维列表进阶:从‘三国演义’章节解析到‘矩阵峰值’查找,解锁数据处理新姿势
  • ARM CP15协处理器:核心寄存器与系统控制详解
  • 别再只会画折线图了!用Qt Charts搞定柱状图、饼图、散点图(附完整C++源码)
  • 你的Dell G15还在“发烧“吗?这个开源工具3分钟解决散热烦恼
  • 2026年4月专业的滤芯厂家推荐,评价好的滤芯,专用滤芯,量身定制更贴心 - 品牌推荐师
  • PowerShell 第11章:过滤和比较(下)Where-Object、迭代命令行模型、$_作用域与实战练习
  • SAM2VideoX:基于特征蒸馏的结构保持视频生成技术
  • 高二鲜花
  • 金融级代码扫描落地实录:从零部署VSCode 2026内建SAST引擎,72小时通过ISO 27001金融专项认证(附审计日志模板)
  • 开源AI智能体编排平台Mission Control:轻量部署与生产级管理实践
  • Cat-Catch:浏览器资源嗅探与下载的完整解决方案
  • 构建可复现的开发环境:从点文件管理到一键部署
  • 如何解锁NVIDIA显卡隐藏性能:NVIDIA Profile Inspector完整配置指南
  • 别再为多相机标定头疼了!用VisionMaster统一坐标系的保姆级教程