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

news2026/5/3 11:18:11
【万人同屏插件】已经重构、重磅升级新版使用手册最新版万人同屏插件使用手册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技术栈(JobsBurst)实现高性能计算海量单位移动/锁敌/碰撞检测。独立开发高度封装了渲染器接口通过合批十倍或百倍大幅提升游戏帧数。并且支持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 11UnityUnity 2022.3.45f1CPU: i7-13700KFGPU: RTX 3070 8GUnity万人同屏 新功能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动画MeshMesh中寄存了某些信息以便GPU动画Shader读取使用5. 自定义GPU动画Shader插件使用Shader Graph和Amplify 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 GetComponentGPUAnimation.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 nameclipIndex动画index/param /// param nameframe触发帧/param /// param nameeventName事件名/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 NativeQueueGPUAnimTriggerInfo 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/GPUBonesAnimMergeLitClipId该参数用于切换动画对于不支持动画融合的Shader x是动画index y是开始播放的时间(Time.time)对于支持动画融合的Shaderz是上个动画的indexw是上个动画的播放时间x是要切换到的动画indexy是动画第一帧开始的时间也就是不算融合时间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-demoECSGraphics功能0. 2025.10.9重磅更新新增对Web平台支持率先支持微信小游戏等web平台。(解决Unity官方DOTS不支持Web平台的痛点), 网页版demo体验https://efunstudio.cn/#web-demo1. 支持子物体比如给角色添加血条为子物体就能跟随角色自动移动。解决之前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方法 移除Removevar 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.AddComponentDataECSTargetingData(entity, new ECSTargetingData(ECSTargetingLayer.L1, ECSTargetingLayer.L1, ECSTargetingLayer.NONE, 0.5f, 5f, 100, 360));1. Raycast / SphereCast射线检测支持以实体查找、以点查找NativeArrayUnity.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.GetComponentDataECSTargetingData(player).MaxAttackCount; var playerColor ECSGraphicsComponent.Instance.GetComponentDataMaterialBaseColor(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人物带动画,不使用ECS1. 添加RVO单位AddAgent()会返回一个RVOAgent对象可通过此对象设置各种rvo参数m_RVO RVOComponent.Instance.AddAgent(position);2. 移除RVO单位RVOComponent.Instance.RemoveAgent(m_RVO);3. RVO属性功能Draw Debug: 在Editor下Scene窗口绘制RVO单位调试线框, 以图形展示单位位置、方向、大小PlaneRVO移动平面空间3D通常设为XZ, 2D通常设为XY (RVO之所以性能高于多线程寻路数十倍到百倍原因是计算量小、为平面空间计算. 如需支持三个维度可根据需求刷新pos第三维度数值实现)AutoUpdateEntityTrans: RVO单位创建时支持绑定GameObject勾选即表示自动同步RVO与绑定GameObject的位置、方向。RVO单位移动避让参数每个RVO单位可独立设置以下属性Height默认值即可无需修改RadiusRVO单位的碰撞体半径, 可理解为Circle Collider(圆形碰撞体)的半径RVO单位之间的碰撞以此半径计算Radius Obst: RVO单位与Obstacle障碍物的碰撞半径MaxSpeed: RVO单位的移动速度(最大)接近目标点后会自动减速MaxNeighbors: RVO避让计算参与影响的临近RVO单位数量默认即可Neighbor DistRVO避让计算参与影响的临近RVO单位距离默认即可TimeHorizon可理解为RVO单位之间的避让减速距离TimeHorizonObst: 可理解为RVO单位与Obstacle障碍物之间的避让减速距离。AvoidWeight避让权重比如高级兵不给小兵让路小兵需要给高级兵让路以避免高级兵被小兵挡住的情况。只需设置avoidWeight取值0-1值越小越不让路。layerOccupationRVO单位分层与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用于精准控制筛选寻敌collisionEnabledrvo单位之间是否碰撞为false时rvo之间将会重叠穿模navigationEnabledrvo单位是否自动移动设为false后即可通过rvo的position来随意设置位置例如击飞效果单位受到攻击后被击飞就可以通过设置navigationEnabled为false然后自行设置position实现击飞效果落地后再设置navigationEnabled为true即可从击飞落地位置重新移动。4. 障碍物①添加圆形障碍物把CircleObstacle脚本挂到障碍物GameObject上即可②添加举行障碍物把BoxObstacle脚本挂到障碍物GameObject上即可③添加边界障碍物把EdgeObstacle脚本挂到障碍物GameObject上即可通过面板参数添加边界顶点位置④扩展自定义障碍物自定义类继承ShapeObstacleBase重写方法即可海量单位多线程寻敌/碰撞检测Unity弹幕游戏, RVO红蓝对抗 割草游戏 海量单位高性能索敌攻击方案压测方案是通过Jobs多线程批量查询单位支持查询最近单位、范围内单位等通过RVOComponent提供的接口查询具体使用方法可参考插件提供的demo, EnemiesSearchDemo.cs1. 查询最近单位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 11Windows using DirectX 12Windows using VulkanUniversal Windows PlatformLinux using VulkanmacOS using MetaliOSAndroid (Vulkan and OpenGL ES 3.x)PlayStation 4PlayStation 5Xbox OneXbox Series X and Xbox Series SNintendo SwitchGoogle StadiaWebGL (WebGL 2.0)二、打包设置1. URP Rendering Path选择Forward (Forward才能发挥BRG最大性能)2. BatchRendererGroup Shader变体选择 Keep All3. 打包WebGL常见问题1编辑器或其它平台正常打包WebGL渲染异常解决方法如果PlayerSettings设置的为WebGL 1Shader Model需设置为2.0WebGL2可设置Shader Model为3.0或3.5使用Amplify Shader Editor打开GPU动画Shader设置Shader Model

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2574347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…