Syntriax.Engine/Engine.Core/GameObject.cs

126 lines
3.6 KiB
C#
Raw Normal View History

2023-11-23 22:07:49 +03:00
using Syntriax.Engine.Core.Abstract;
using Syntriax.Engine.Core.Exceptions;
namespace Syntriax.Engine.Core;
[System.Diagnostics.DebuggerDisplay("Name: {Name}, Initialized: {Initialized}")]
2024-02-02 12:11:51 +03:00
public class GameObject : BaseEntity, IGameObject
2023-11-23 22:07:49 +03:00
{
public event IHierarchyObject.OnEnteredHierarchyDelegate? OnEnteredHierarchy = null;
public event IHierarchyObject.OnExitedHierarchyDelegate? OnExitedHierarchy = null;
2024-07-15 01:13:39 +03:00
public event IAssignableTransform.OnTransformAssignedDelegate? OnTransformAssigned = null;
public event IAssignableBehaviourController.OnBehaviourControllerAssignedDelegate? OnBehaviourControllerAssigned = null;
2023-11-23 22:07:49 +03:00
2024-07-15 01:13:39 +03:00
public event INameable.OnNameChangedDelegate? OnNameChanged = null;
2023-11-23 22:07:49 +03:00
2024-07-15 01:13:39 +03:00
public event IGameObject.OnUpdatedDelegate? OnUpdated = null;
2023-11-23 22:07:49 +03:00
private ITransform _transform = null!;
private IBehaviourController _behaviourController = null!;
private IGameManager? _gameManager = null;
2023-11-23 22:07:49 +03:00
private string _name = nameof(GameObject);
public ITransform Transform => _transform;
public IBehaviourController BehaviourController => _behaviourController;
public IGameManager? GameManager => _gameManager;
public bool IsInHierarchy => GameManager is not null;
2023-11-23 22:07:49 +03:00
public string Name
{
get => _name;
set
{
if (value == _name) return;
2024-07-15 01:13:39 +03:00
string previousName = _name;
2023-11-23 22:07:49 +03:00
_name = value;
2024-07-15 01:13:39 +03:00
OnNameChanged?.Invoke(this, previousName);
2023-11-23 22:07:49 +03:00
}
}
2024-02-02 12:11:51 +03:00
protected override void InitializeInternal()
2023-11-23 22:07:49 +03:00
{
2024-02-02 12:11:51 +03:00
base.InitializeInternal();
2023-11-23 22:07:49 +03:00
NotAssignedException.Check(this, _transform);
NotAssignedException.Check(this, _behaviourController);
}
public void Update()
2023-11-23 22:07:49 +03:00
{
if (!StateEnable.Enabled)
2023-11-23 22:07:49 +03:00
return;
OnUpdated?.Invoke(this);
2023-11-23 22:07:49 +03:00
}
2024-02-02 12:11:51 +03:00
protected override void FinalizeInternal()
2023-11-23 22:07:49 +03:00
{
2024-02-02 12:11:51 +03:00
base.FinalizeInternal();
2023-11-23 22:07:49 +03:00
2024-02-02 12:11:51 +03:00
foreach (IBehaviour behaviour in _behaviourController.GetBehaviours<IBehaviour>())
behaviour.Finalize();
2023-11-23 22:07:49 +03:00
}
public bool Assign(ITransform transform)
{
if (IsInitialized)
2023-11-23 22:07:49 +03:00
return false;
_transform = transform;
OnTransformAssigned?.Invoke(this);
return true;
}
public bool Assign(IBehaviourController behaviourController)
{
if (IsInitialized)
2023-11-23 22:07:49 +03:00
return false;
_behaviourController = behaviourController;
OnBehaviourControllerAssigned?.Invoke(this);
return true;
}
2024-02-02 12:11:51 +03:00
protected override void UnassignInternal()
2023-11-24 17:03:21 +03:00
{
2024-02-02 12:11:51 +03:00
base.UnassignInternal();
2023-11-24 17:03:21 +03:00
_transform = null!;
_behaviourController = null!;
_gameManager = null!;
2023-11-24 17:03:21 +03:00
}
2023-11-23 22:07:49 +03:00
public GameObject() { OnBehaviourControllerAssigned += ConnectBehaviourController; }
2024-07-15 01:13:39 +03:00
2023-11-23 22:07:49 +03:00
private void ConnectBehaviourController(IAssignableBehaviourController controller)
{
controller.BehaviourController.OnBehaviourAdded += OnBehaviourAdded;
controller.BehaviourController.OnBehaviourRemoved += OnBehaviourRemoved;
}
private void OnBehaviourRemoved(IBehaviourController _, IBehaviour behaviour) { if (IsInitialized) behaviour.Finalize(); }
private void OnBehaviourAdded(IBehaviourController _, IBehaviour behaviour) { if (!IsInitialized) behaviour.Initialize(); }
bool IHierarchyObject.EnterHierarchy(IGameManager gameManager)
{
if (IsInHierarchy)
return false;
_gameManager = gameManager;
OnEnteredHierarchy?.Invoke(this);
return true;
}
bool IHierarchyObject.ExitHierarchy()
{
if (!IsInHierarchy)
return false;
_gameManager = null;
OnExitedHierarchy?.Invoke(this);
return true;
}
2023-11-23 22:07:49 +03:00
}