World

世界

一个世界组织实体为孤立的群体。一个世界同时拥有一个EntityManager和一组Systems在一个世界中创建的实体仅在该世界中有意义,但可以转移到其他世界(使用EntityManager.MoveEntitiesFrom)。系统只能访问同一世界中的实体。您可以创建任意数量的世界。

默认情况下,Unity 会在您的应用程序启动(或您进入Play Mode创建一个默认WorldUnity 实例化所有系统(扩展ComponentSystemBase 的)并将它们添加到这个默认世界。Unity 还在编辑器中创建了专门的世界。例如,它为仅在编辑器中而不是在游戏模式中运行的实体和系统创建了一个编辑器世界,并且还创建了用于管理游戏对象到实体的转换的转换世界。有关可以创建的不同类型世界的示例,请参阅WorldFlags

使用World.DefaultGameObjectInjectionWorld访问默认世界。

管理系统

世界对象提供创建,访问和来自世界消除系统的方法。

在大多数情况下,您可以使用GetOrCreateSystem来获取系统的实例(如果实例不存在,则创建一个实例)。

时间

系统时间属性的值由系统所在的世界控制。默认情况下,Unity为每个世界创建一个TimeData实体,该实体由UpdateWorldTimeSystem实例更新以反映自前一帧以来经过的时间。系统的时间属性是当前世界时间的别名。

FixedStepSimulationSystemGroup治疗时间不同于其他系统组。固定步长模拟组中的系统不是在当前增量时间更新一次,而是以固定间隔更新,如果固定间隔是帧时间的足够小部分,则可能每帧更新一次以上。

如果您需要更好地控制World 中的时间,您可以直接使用World.SetTime指定时间值您还可以使用PushTime临时更改世界时间,然后使用PopTime返回上一时间(在时间堆栈中)。

自定义初始化

要在启动时手动初始化游戏,您可以实现ICustomBootstrap接口。UnityICustomBootstrap使用默认世界运行您的实现,以便您可以修改或完全替换系统创建和初始化序列。

您还可以通过定义以下全局符号来完全禁用默认的世界创建:

  • #UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP_RUNTIME_WORLD 禁用默认运行时世界的生成。
  • #UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP_EDITOR_WORLD 禁用默认编辑器世界的生成。
  • #UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP 禁用两个默认世界的生成。

然后,您的代码负责创建任何需要的世界,以及实例化和更新系统。您可以使用 Unity 可编写脚本的PlayerLoop来修改正常的 Unity 播放器循环,以便在需要时更新您的系统。

原文地址:https://www.cnblogs.com/alps/p/15328154.html