BREAKING CHANGE: replaced universe objects with root universe object
This commit is contained in:
		@@ -78,9 +78,9 @@ public interface IUniverse : IEntity, IEnumerable<IUniverseObject>
 | 
			
		||||
    UniverseTime UnscaledTime { get; }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Gets a read-only list of <see cref="IUniverseObject"/>s managed by the <see cref="IUniverse"/>.
 | 
			
		||||
    /// Gets the root <see cref="IUniverseObject"/> of the <see cref="IUniverse"/>.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    IReadOnlyList<IUniverseObject> UniverseObjects { get; }
 | 
			
		||||
    IUniverseObject Root { get; }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Registers an <see cref="IUniverseObject"/> to the <see cref="IUniverse"/>.
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ public abstract class ActiveBehaviourCollectorBase<T> : IBehaviourCollector<T> w
 | 
			
		||||
        if (Universe is not null)
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        foreach (IUniverseObject universeObject in universe.UniverseObjects)
 | 
			
		||||
        foreach (IUniverseObject universeObject in universe)
 | 
			
		||||
            OnUniverseObjectRegistered(universe, new(universeObject));
 | 
			
		||||
 | 
			
		||||
        universe.OnUniverseObjectRegistered.AddListener(delegateOnUniverseObjectRegistered);
 | 
			
		||||
@@ -46,7 +46,7 @@ public abstract class ActiveBehaviourCollectorBase<T> : IBehaviourCollector<T> w
 | 
			
		||||
        if (Universe is null)
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        foreach (IUniverseObject universeObject in Universe.UniverseObjects)
 | 
			
		||||
        foreach (IUniverseObject universeObject in Universe)
 | 
			
		||||
            OnUniverseObjectUnregistered(Universe, new(universeObject));
 | 
			
		||||
 | 
			
		||||
        Universe.OnUniverseObjectRegistered.RemoveListener(delegateOnUniverseObjectRegistered);
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ public abstract class BehaviourCollectorBase<T> : IBehaviourCollector<T> where T
 | 
			
		||||
        if (Universe is not null)
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        foreach (IUniverseObject universeObject in universe.UniverseObjects)
 | 
			
		||||
        foreach (IUniverseObject universeObject in universe)
 | 
			
		||||
            OnUniverseObjectRegistered(universe, new(universeObject));
 | 
			
		||||
 | 
			
		||||
        universe.OnUniverseObjectRegistered.AddListener(delegateOnUniverseObjectRegistered);
 | 
			
		||||
@@ -43,7 +43,7 @@ public abstract class BehaviourCollectorBase<T> : IBehaviourCollector<T> where T
 | 
			
		||||
        if (Universe is null)
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        foreach (IUniverseObject universeObject in Universe.UniverseObjects)
 | 
			
		||||
        foreach (IUniverseObject universeObject in Universe)
 | 
			
		||||
            OnUniverseObjectUnregistered(Universe, new(universeObject));
 | 
			
		||||
 | 
			
		||||
        Universe.OnUniverseObjectRegistered.RemoveListener(delegateOnUniverseObjectRegistered);
 | 
			
		||||
 
 | 
			
		||||
@@ -32,5 +32,5 @@ public static class UniverseExtensions
 | 
			
		||||
    /// <typeparam name="T">Type to be searched through the <see cref="IUniverse"/>.</typeparam>
 | 
			
		||||
    /// <returns>The specified type if found; otherwise, throws <see cref="NotFoundException"/>.</returns>
 | 
			
		||||
    public static T FindRequired<T>(this IUniverse universe) where T : class
 | 
			
		||||
        => universe.Find<T>() ?? throw new NotFoundException($"{universe.GetType().FullName}({universe.Id}) does not contain any {nameof(IUniverseObject)} or {nameof(IBehaviour)} of type {typeof(T).FullName}");
 | 
			
		||||
        => universe.Root.BehaviourController.GetBehaviourInChildren<T>() ?? throw new NotFoundException($"{universe.GetType().FullName}({universe.Id}) does not contain any {nameof(IUniverseObject)} or {nameof(IBehaviour)} of type {typeof(T).FullName}");
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,21 @@ public static class UniverseObjectExtensions
 | 
			
		||||
        return universeObject;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static IEnumerator<IUniverseObject> TraverseChildren(this IUniverseObject universeObject)
 | 
			
		||||
    {
 | 
			
		||||
        static IEnumerable<IUniverseObject> Traverse(IUniverseObject obj)
 | 
			
		||||
        {
 | 
			
		||||
            foreach (IUniverseObject child in obj.Children)
 | 
			
		||||
            {
 | 
			
		||||
                yield return child;
 | 
			
		||||
                foreach (IUniverseObject descendant in Traverse(child))
 | 
			
		||||
                    yield return descendant;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return Traverse(universeObject).GetEnumerator();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #region Universe Object Search
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Gets a <see cref="IUniverseObject"/> of the specified type.
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ public class UniverseEntranceManager : Internal.BehaviourIndependent
 | 
			
		||||
        enterUniverses.Assign(universe);
 | 
			
		||||
        exitUniverses.Assign(universe);
 | 
			
		||||
 | 
			
		||||
        foreach (IUniverseObject universeObject in universe.UniverseObjects)
 | 
			
		||||
        foreach (IUniverseObject universeObject in universe)
 | 
			
		||||
            OnUniverseObjectRegistered(universe, new(universeObject));
 | 
			
		||||
 | 
			
		||||
        universe.OnUniverseObjectRegistered.AddListener(OnUniverseObjectRegistered);
 | 
			
		||||
@@ -35,7 +35,7 @@ public class UniverseEntranceManager : Internal.BehaviourIndependent
 | 
			
		||||
        enterUniverses.Unassign();
 | 
			
		||||
        exitUniverses.Unassign();
 | 
			
		||||
 | 
			
		||||
        foreach (IUniverseObject universeObject in universe.UniverseObjects)
 | 
			
		||||
        foreach (IUniverseObject universeObject in universe)
 | 
			
		||||
            OnUniverseObjectUnRegistered(universe, new(universeObject));
 | 
			
		||||
 | 
			
		||||
        universe.OnUniverseObjectRegistered.RemoveListener(OnUniverseObjectRegistered);
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ public class Universe : BaseEntity, IUniverse
 | 
			
		||||
        delegateOnUniverseObjectExitedUniverse = OnUniverseObjectExitedUniverse;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public IReadOnlyList<IUniverseObject> UniverseObjects => _universeObjects;
 | 
			
		||||
    public IUniverseObject Root { get; private set; } = Factory.UniverseObjectFactory.Instantiate().SetUniverseObject("Root");
 | 
			
		||||
 | 
			
		||||
    public UniverseTime Time { get; private set; } = new();
 | 
			
		||||
    public UniverseTime UnscaledTime { get; private set; } = new();
 | 
			
		||||
@@ -68,6 +68,9 @@ public class Universe : BaseEntity, IUniverse
 | 
			
		||||
 | 
			
		||||
        _universeObjects.Add(universeObject);
 | 
			
		||||
 | 
			
		||||
        if (universeObject.Parent == null)
 | 
			
		||||
            universeObject.Parent = Root;
 | 
			
		||||
 | 
			
		||||
        if (!universeObject.EnterUniverse(this))
 | 
			
		||||
            throw new Exception($"{universeObject.Name} can't enter the universe");
 | 
			
		||||
 | 
			
		||||
@@ -113,15 +116,15 @@ public class Universe : BaseEntity, IUniverse
 | 
			
		||||
 | 
			
		||||
    protected override void InitializeInternal()
 | 
			
		||||
    {
 | 
			
		||||
        foreach (IUniverseObject universeObject in UniverseObjects)
 | 
			
		||||
        foreach (IUniverseObject universeObject in _universeObjects)
 | 
			
		||||
            universeObject.Initialize();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected override void FinalizeInternal()
 | 
			
		||||
    {
 | 
			
		||||
        base.FinalizeInternal();
 | 
			
		||||
        for (int i = UniverseObjects.Count - 1; i >= 0; i--)
 | 
			
		||||
            Remove(UniverseObjects[i]);
 | 
			
		||||
        for (int i = _universeObjects.Count - 1; i >= 0; i--)
 | 
			
		||||
            Remove(_universeObjects[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void Update(UniverseTime engineTime)
 | 
			
		||||
@@ -158,6 +161,6 @@ public class Universe : BaseEntity, IUniverse
 | 
			
		||||
            Remove(universeObject);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public IEnumerator<IUniverseObject> GetEnumerator() => _universeObjects.GetEnumerator();
 | 
			
		||||
    IEnumerator IEnumerable.GetEnumerator() => _universeObjects.GetEnumerator();
 | 
			
		||||
    public IEnumerator<IUniverseObject> GetEnumerator() => Root.TraverseChildren();
 | 
			
		||||
    IEnumerator IEnumerable.GetEnumerator() => Root.TraverseChildren();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user