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));
}