diff --git a/Engine.Core/Abstract/IUniverseObject.cs b/Engine.Core/Abstract/IUniverseObject.cs index 29ad5dd..b2b1afd 100644 --- a/Engine.Core/Abstract/IUniverseObject.cs +++ b/Engine.Core/Abstract/IUniverseObject.cs @@ -47,7 +47,7 @@ public interface IUniverseObject : IEntity, IActive, INameable, IHasBehaviourCon /// /// The parent of the . /// - IUniverseObject? Parent { get; } + IUniverseObject? Parent { get; set; } /// /// The s that have this as their . @@ -75,12 +75,6 @@ public interface IUniverseObject : IEntity, IActive, INameable, IHasBehaviourCon /// internal bool ExitUniverse(); - /// - /// Sets the parent of this . - /// - /// The parent to set. - void SetParent(IUniverseObject? universeObject); - /// /// Adds a child to this . /// diff --git a/Engine.Core/Extensions/UniverseObjectExtensions.cs b/Engine.Core/Extensions/UniverseObjectExtensions.cs index ae9dcd1..96d5ec3 100644 --- a/Engine.Core/Extensions/UniverseObjectExtensions.cs +++ b/Engine.Core/Extensions/UniverseObjectExtensions.cs @@ -12,7 +12,7 @@ public static class UniverseObjectExtensions if (!string.IsNullOrWhiteSpace(name)) universeObject.Name = name; if (parent is not null) - universeObject.SetParent(parent); + universeObject.Parent = parent; return universeObject; } diff --git a/Engine.Core/Universe.cs b/Engine.Core/Universe.cs index f60c7ae..ae5a1b3 100644 --- a/Engine.Core/Universe.cs +++ b/Engine.Core/Universe.cs @@ -83,7 +83,7 @@ public class Universe : BaseEntity, IUniverse public void Remove(IUniverseObject universeObject) { - universeObject.SetParent(null); + universeObject.Parent = null; RemoveIncursive(universeObject); } diff --git a/Engine.Core/UniverseObject.cs b/Engine.Core/UniverseObject.cs index f6b96ce..ff1c57f 100644 --- a/Engine.Core/UniverseObject.cs +++ b/Engine.Core/UniverseObject.cs @@ -1,4 +1,3 @@ -using System.Collections; using System.Collections.Generic; namespace Syntriax.Engine.Core; @@ -21,8 +20,8 @@ public class UniverseObject : BaseEntity, IUniverseObject private IBehaviourController _behaviourController = null!; private bool _isActive = false; private readonly List _children = []; + private IUniverseObject? _parent = null; - public IUniverseObject? Parent { get; private set; } = null; public IReadOnlyList Children => _children; public IBehaviourController BehaviourController => _behaviourController; public IUniverse Universe => _universe; @@ -42,6 +41,40 @@ public class UniverseObject : BaseEntity, IUniverseObject } } + public IUniverseObject? Parent + { + get => _parent; + set + { + if (value == this) + throw new Exceptions.AssignFailedException($"{Name} can not parent itself"); + + if (_parent == value) + return; + + IUniverseObject? previousParent = Parent; + if (previousParent is not null) + { + previousParent.RemoveChild(this); + previousParent.OnActiveChanged.RemoveListener(OnParentActiveChanged); + } + + _parent = value; + + if (value is not null) + { + if (value.IsInUniverse && !IsInUniverse) + value.Universe.Register(this); + + value.AddChild(this); + value.OnActiveChanged.AddListener(OnParentActiveChanged); + } + + UpdateActive(); + OnParentChanged?.Invoke(this, new(previousParent, value)); + } + } + protected virtual void OnEnteringUniverse(IUniverse universe) { } bool IUniverseObject.EnterUniverse(IUniverse universe) { @@ -67,43 +100,13 @@ public class UniverseObject : BaseEntity, IUniverseObject return true; } - public void SetParent(IUniverseObject? parent) - { - if (parent == this) - throw new Exceptions.AssignFailedException($"{Name} can not parent itself"); - - if (Parent == parent) - return; - - IUniverseObject? previousParent = Parent; - if (previousParent is not null) - { - previousParent.RemoveChild(this); - previousParent.OnActiveChanged.RemoveListener(OnParentActiveChanged); - } - - Parent = parent; - - if (parent is not null) - { - if (parent.IsInUniverse && !IsInUniverse) - parent.Universe.Register(this); - - parent.AddChild(this); - parent.OnActiveChanged.AddListener(OnParentActiveChanged); - } - - UpdateActive(); - OnParentChanged?.Invoke(this, new(previousParent, parent)); - } - public void AddChild(IUniverseObject parent) { if (_children.Contains(parent)) return; _children.Add(parent); - parent.SetParent(this); + parent.Parent = this; OnChildrenAdded?.Invoke(this, new(parent)); } @@ -112,7 +115,7 @@ public class UniverseObject : BaseEntity, IUniverseObject if (!_children.Remove(child)) return; - child.SetParent(null); + child.Parent = null; OnChildrenRemoved?.Invoke(this, new(child)); }