public static void Initialize(string worldName, bool editorWorld) { var world = new World(worldName); World.Active = world; // Register hybrid injection hooks InjectionHookSupport.RegisterHook(new GameObjectArrayInjectionHook()); InjectionHookSupport.RegisterHook(new TransformAccessArrayInjectionHook()); InjectionHookSupport.RegisterHook(new ComponentArrayInjectionHook()); PlayerLoopManager.RegisterDomainUnload(DomainUnloadShutdown, 10000); IEnumerable <Type> allTypes; foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { try { allTypes = assembly.GetTypes(); } catch (ReflectionTypeLoadException e) { allTypes = e.Types.Where(t => t != null); Debug.LogWarning($"DefaultWorldInitialization failed loading assembly: {(assembly.IsDynamic ? assembly.ToString() : assembly.Location)}"); } // Create all ComponentSystem CreateBehaviourManagersForMatchingTypes(editorWorld, allTypes, world); } ScriptBehaviourUpdateOrder.UpdatePlayerLoop(world); }
public static void SetupInjectionHooks() { // Reflection to get internal hook classes. Doesn't seem to be a proper way to do this. var gameObjectArrayInjectionHookType = typeof(Unity.Entities.GameObjectEntity).Assembly.GetType("Unity.Entities.GameObjectArrayInjectionHook"); var transformAccessArrayInjectionHookType = typeof(Unity.Entities.GameObjectEntity).Assembly.GetType( "Unity.Entities.TransformAccessArrayInjectionHook"); var componentArrayInjectionHookType = typeof(Unity.Entities.GameObjectEntity).Assembly.GetType("Unity.Entities.ComponentArrayInjectionHook"); InjectionHookSupport.RegisterHook( (InjectionHook)Activator.CreateInstance(gameObjectArrayInjectionHookType)); InjectionHookSupport.RegisterHook( (InjectionHook)Activator.CreateInstance(transformAccessArrayInjectionHookType)); InjectionHookSupport.RegisterHook( (InjectionHook)Activator.CreateInstance(componentArrayInjectionHookType)); }
public static void Initialize(string worldName, bool editorWorld) { var world = new World(worldName); World.Active = world; // Register hybrid injection hooks InjectionHookSupport.RegisterHook(new GameObjectArrayInjectionHook()); InjectionHookSupport.RegisterHook(new TransformAccessArrayInjectionHook()); InjectionHookSupport.RegisterHook(new ComponentArrayInjectionHook()); PlayerLoopManager.RegisterDomainUnload(DomainUnloadShutdown, 10000); foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { if (!TypeManager.IsAssemblyReferencingEntities(assembly)) { continue; } try { var allTypes = assembly.GetTypes(); // Create all ComponentSystem CreateBehaviourManagersForMatchingTypes(editorWorld, allTypes, world); } catch { Debug.LogWarning($"DefaultWorldInitialization failed loading assembly: {(assembly.IsDynamic ? assembly.ToString() : assembly.Location)}"); } } ScriptBehaviourUpdateOrder.UpdatePlayerLoop(world); }
public static void Initialize() { var world = new World(k_DefaultWorldName); World.Active = world; s_CreatedWorld = world; // Register hybrid injection hooks InjectionHookSupport.RegisterHook(new GameObjectArrayInjectionHook()); InjectionHookSupport.RegisterHook(new TransformAccessArrayInjectionHook()); InjectionHookSupport.RegisterHook(new ComponentArrayInjectionHook()); PlayerLoopManager.RegisterDomainUnload(DomainUnloadShutdown, 10000); foreach (var ass in AppDomain.CurrentDomain.GetAssemblies()) { var allTypes = ass.GetTypes(); // Create all ComponentSystem var systemTypes = allTypes.Where(t => t.IsSubclassOf(typeof(ComponentSystemBase)) && !t.IsAbstract && !t.ContainsGenericParameters && t.GetCustomAttributes(typeof(DisableAutoCreationAttribute), true).Length == 0); foreach (var type in systemTypes) { GetBehaviourManagerAndLogException(world, type); } } ScriptBehaviourUpdateOrder.UpdatePlayerLoop(world); }
public static void Initialize(string worldName, bool editorWorld) { // Register hybrid injection hooks #pragma warning disable 0618 InjectionHookSupport.RegisterHook(new GameObjectArrayInjectionHook()); InjectionHookSupport.RegisterHook(new TransformAccessArrayInjectionHook()); InjectionHookSupport.RegisterHook(new ComponentArrayInjectionHook()); #pragma warning restore 0618 PlayerLoopManager.RegisterDomainUnload(DomainUnloadShutdown, 10000); var world = new World(worldName); World.Active = world; var systems = GetAllSystems(WorldSystemFilterFlags.Default); if (systems == null) { world.Dispose(); if (World.Active == world) { World.Active = null; } return; } // create presentation system and simulation system InitializationSystemGroup initializationSystemGroup = world.GetOrCreateManager <InitializationSystemGroup>(); SimulationSystemGroup simulationSystemGroup = world.GetOrCreateManager <SimulationSystemGroup>(); PresentationSystemGroup presentationSystemGroup = world.GetOrCreateManager <PresentationSystemGroup>(); // Add systems to their groups, based on the [UpdateInGroup] attribute. foreach (var type in systems) { // Skip the built-in root-level systems if (type == typeof(InitializationSystemGroup) || type == typeof(SimulationSystemGroup) || type == typeof(PresentationSystemGroup)) { continue; } if (editorWorld) { if (Attribute.IsDefined(type, typeof(ExecuteInEditMode))) { Debug.LogError( $"{type} is decorated with {typeof(ExecuteInEditMode)}. Support for this attribute will be deprecated. Please use {typeof(ExecuteAlways)} instead."); } if (!Attribute.IsDefined(type, typeof(ExecuteAlways))) { continue; } } var groups = type.GetCustomAttributes(typeof(UpdateInGroupAttribute), true); if (groups.Length == 0) { simulationSystemGroup.AddSystemToUpdateList(GetOrCreateManagerAndLogException(world, type) as ComponentSystemBase); } foreach (var g in groups) { var group = g as UpdateInGroupAttribute; if (group == null) { continue; } if (!(typeof(ComponentSystemGroup)).IsAssignableFrom(group.GroupType)) { Debug.LogError($"Invalid [UpdateInGroup] attribute for {type}: {group.GroupType} must be derived from ComponentSystemGroup."); continue; } var groupMgr = GetOrCreateManagerAndLogException(world, group.GroupType); if (groupMgr == null) { Debug.LogWarning( $"Skipping creation of {type} due to errors creating the group {group.GroupType}. Fix these errors before continuing."); continue; } var groupSys = groupMgr as ComponentSystemGroup; if (groupSys != null) { groupSys.AddSystemToUpdateList(GetOrCreateManagerAndLogException(world, type) as ComponentSystemBase); } } } // Update player loop initializationSystemGroup.SortSystemUpdateList(); simulationSystemGroup.SortSystemUpdateList(); presentationSystemGroup.SortSystemUpdateList(); ScriptBehaviourUpdateOrder.UpdatePlayerLoop(world); }