首页 > 其他分享 >Unity ECS System在什么时候更新?如何自定义这个更新的时机?

Unity ECS System在什么时候更新?如何自定义这个更新的时机?

时间:2024-07-25 19:39:50浏览次数:15  
标签:自定义 System 更新 World var world GetExistingSystemManaged

在什么时候更新?

在其他用户代码都执行完之后。

去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分别获得InitializationSystemGroupSimulationSystemGroupPresentationSystemGroup;然后作为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界面里就看不到了,也算是一个小缺点吧。

标签:自定义,System,更新,World,var,world,GetExistingSystemManaged
From: https://www.cnblogs.com/horeaper/p/18324016

相关文章

  • C++学习笔记-operator关键字:重载与自定义操作符
    在C++编程中,operator关键字扮演着极其重要且独特的角色。它允许开发者为内置类型或自定义类型重载或定义新的操作符行为。这一特性极大地增强了C++的表达能力,使得代码更加直观、易于理解和维护。本文将深入探讨C++中operator关键字的使用,包括操作符重载和自定义操作符的基本......
  • React——useEffect和自定义useUpdateEffect
    useEffect是React的一个内置Hook,用于在组件渲染后执行副作用(例如数据获取、订阅或手动更改DOM)。它将在第一次渲染后和每次更新后都会执行。useEffect(()=>{//这里的代码将在组件挂载和更新时执行。},[dependencies]);//dependencies数组控制effect的重新执行。......
  • element自定义日期范围
              <el-form-itemlabel="验收时间":label-width="formLabelWidths"prop="YS_TIME">            <el-date-pickerv-model="ruleFormEnter.YS_TIME"type="datetime"placeholder=&q......
  • el-select选项自定义日期选择器选项,选中自定义日期,回显具体的日期时间
    需求:指标时点选择具体的时间,即自定义日期选项时,可操作选择具体日期。若选择自定义日期,应回显具体日期,如“2024-07-25”效果图如下:  代码如下:因为此处v-for生成的面板,每个面板都有一个指标时点选项,所以每个指标时点的select对应的ref需要唯一,此处通过遍历的下标i加以区分。......
  • PixPro 全开源图床系统源码,非常强大的压缩率 自定义尺寸,支持多种格式
    PixPro全开源图床系统源码,非常强大的压缩率自定义尺寸,支持多种格式PixPro全开源图床系统源码,非常强大的压缩率自定义尺寸,支持多种格式一款专为个人需求设计的高效图床解决方案,集成了强大的图片压缩功能与优雅的前台后台管理界面。项目结构精简高效,提供自定义图片压缩率......
  • systemd service 配置 ulimit 限制
      在bash中,有个ulimit命令,提供了对shell及该shell启动的进程的可用资源控制。主要包括打开文件描述符数量、用户的最大进程数量、coredump文件的大小等。在CentOS5/6等版本中,资源限制的配置可以在/etc/security/limits.conf设置,针对root/user等各个用户或者......
  • Asp.Net Core Serilog日志自定义Sink
    项目的日志框架使用了Serilog,现在有需求要将异常日志记录一份到数据库中。目前网上可以找到适配各个数据库的Sink。https://github.com/serilog/serilog/wiki/Provided-Sinks但是由于项目需要适配多个不同类型的数据库,故打算自定义一个DatabaseSink,使用SqlSugar进行数据库操作。......
  • Chrome 浏览器更新后,我的 python tagui 代码工作不稳定。问题的解决方法是什么
    我编写了一个pythontagui脚本来在chrome中操作Intranet网页。它运行良好。但是在chrome浏览器更新后,脚本每次都会在某个时刻随机停止,并且也不会抛出错误。请帮忙。我尝试重新启动电脑,但这并没有解决问题。Chrome浏览器更新后,TagUI脚本工作不稳定的问题可能由以......
  • 用于用 NotRequired 替换自定义 TypeAlias 的 Mypy 插件
    我想编写一个mypy插件,以便为NotRequired[Optional[T]]引入类型别名。(正如我在这个问题中发现的,不可能用普通的python编写这个类型别名,因为NotRequired在TypedDict定义之外不允许使用。)我的想法是定义一个通用Possibly类型,如......
  • 微信小程序-自定义导航栏
    参考文章:自定义navigationBar顶部导航栏,兼容适配所有机型(附完整案例)|微信开放社区(qq.com)1.设置导航栏样式自定义"navigationStyle":"custom"可以选择在页面json文件设置,也可选择在app.json文件设置,我选择页面配置2.定义想要的导航栏样式.navCustom{position:......