Home

Awesome

MultiWorldBootstrap

This is a ICustomBootstrap Extension for automatic multiple world creation. In its current version, it needs the DefaultWorldInitialization to be activated. (This means you can not use UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP)

Tested with Unity 2019.3.8f1
Tested with Entities package 0.8.0-preview.8

Usage

To use MultiWorldBootstrap, the created bootstrap class has to be inherited from MultiWorldBootstrap instead of ICustomBootstrap.

public class Bootstrap : MultiWorldBootstrap
{
}

For setting systems up to be created in self-defined worlds, there are two options.

Attributes

[CreateInWorld("MyCustomWorld")]
public class TestSystem : ComponentSystem
{ 
}

As it is possible to have a system in any amount of worlds needed, the attribute is usable multiple times:

[CreateInWorld("MyCustomWorld1"), CreateInWorld("MyCustomWorld2")]
public class TestSystem : ComponentSystem
{ 
}

As the MultiWorldBootstrap will find and create the given worlds on its own, there is nothing else to do.

Interfaces

Adding systems with interfaces needs a bit of code added to the bootstrap class. First the system needs the interface(s) to inherit from

public class TestSystem : ComponentSystem, ITestInterface1, ITestInterface2
{ 
}

interface ITestInterface1 { }
interface ITestInterface2 { }

Next the bootstrap class needs to know specifically which worlds have to add those systems. As the wanted world and its name can not be found through the interface, it has to be manually created and given the interface types:

public Bootstrap()
    {
        CustomWorlds.Add(new CustomWorld("TestWorld1")
                         {
                           SystemInterfaces = new List<Type>() { typeof(ITestInterface1) }
                         });
        CustomWorlds.Add(new CustomWorld("TestWorld2")
                         {
                           SystemInterfaces = new List<Type>() { typeof(ITestInterface2) }
                         });
    }

Note: Both are usable for every system, so it is possible to use attributes for system 1 but interfaces for system 2!


Duplicating

There are two ways to use unitys default systems :

1. Based on namespace

This example adds the hybrid renderer, physics and transforms through their namespace:

public Bootstrap()
    {
        CustomWorlds.Add(new CustomWorld("TestWorld1")
                         {
                            SystemNamespaceToDuplicate = new List<string>() { "Unity.Transform", "Unity.Rendering", "Unity.Physics" }
                         });
    }
2. Based on fullname

This example adds all default commandbuffers:

public Bootstrap()
    {
        CustomWorlds.Add(new CustomWorld("TestWorld1")
                         {
                            SystemSubstringToDuplicate = new List<string>{ "CommandBuffer"} 
                         });
    }

Update order

Setting up in which order the systems will be updated hasn't changed from Unitys default behaviour. For each system UpdateBefore, UpdateAfter and UpdateInGroup can be used.

Example:

[UpdateInGroup(typeof(TestGroup))]
[UpdateBefore(typeof(TestSystem2))]
public class TestSystem : ComponentSystem { }

[UpdateInGroup(typeof(TestGroup))]
public class TestSystem2 : ComponentSystem { }

[UpdateInGroup(typeof(TestGroup))]
[UpdateAfter(typeof(TestSystem2))]
public class TestSystem3 : ComponentSystem { }

public class TestGroup : ComponentSystemGroup { }