Unity ECS System在什么时候更新?如何自定义这个更新的时机?
1.Windows下git配合Unity要设置autocrlf=false2.国内版Unity 2023编辑器无法切换到DX12模式的解决方法3.国内版Unity 6 Preview编辑器无法切换到DX12的解决方案(6000.0.5f1c1已解决)4.Unity无法安装Entities 1.2.0 Package的解决方法5.Unity 2023/Unity 6编辑器文字模糊的解决方案6.Unity的Package库在IDE里不显示API注释的解决方法7.Netcode for Entities里如何对Ghost进行可见性筛选(1.2.3版本)8.Netcode for Entities如何添加自定义序列化,让GhostField支持任意类型?以int3为例(1.2.3版本)
9.Unity ECS System在什么时候更新?如何自定义这个更新的时机?
在什么时候更新?
在其他用户代码都执行完之后。
去Netcode的ClientServerBootstrap
里可以找到CreateLocalWorld
函数,里面有类似这样的代码:
public static World CreateLocalWorld(string defaultWorldName = "Default World") { var world = new World(defaultWorldName, WorldFlags.Game); var systems = DefaultWorldInitialization.GetAllSystems(WorldSystemFilterFlags.Default); DefaultWorldInitialization.AddSystemsToRootLevelSystemGroups(world, systems); ScriptBehaviourUpdateOrder.AppendWorldToCurrentPlayerLoop(world); return world; }
其中ScriptBehaviourUpdateOrder.AppendWorldToCurrentPlayerLoop
就是将World更新附加到UnityEngine.LowLevel.PlayerLoop
后面的函数。这个函数内容也很简单,本质上是通过world.GetExistingSystemManaged
分别获得InitializationSystemGroup
,SimulationSystemGroup
和PresentationSystemGroup
;然后作为PlayerLoopSystem
的SubSystem,构造出新的PlayerLoop之后,通过PlayerLoop.SetPlayerLoop
应用到当前环境里。
没有Netcode的情况下也是类似的,只不过是通过DefaultWorldInitialization
这个类来完成了。
如何自定义?
知道在哪里创建的,自然就知道该怎么自定义了。只要把ScriptBehaviourUpdateOrder.AppendWorldToCurrentPlayerLoop
换成自己的东西就行了。比如:
var initGroup = world.GetExistingSystemManaged<InitializationSystemGroup>(); var simGroup = world.GetExistingSystemManaged<SimulationSystemGroup>(); var presGroup = world.GetExistingSystemManaged<PresentationSystemGroup>(); //找个地方调用initGroup.Update() //找个地方调用simGroup.Update() //找个地方调用presGroup.Update() //顺序不要搞错了
以FishNet为例,就可以在TimeManager.OnPostTick
里运行所有WorldSystemFilterFlags.ServerSimulation
的System,于是这些基于GameObject的网络库也就可以用ECS设计模式了。
不过自定义了更新之后,在Editor的Systems界面里就看不到了,也算是一个小缺点吧。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签