166 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| 
 | |
| using Syntriax.Engine.Core.Abstract;
 | |
| using Syntriax.Engine.Core.Exceptions;
 | |
| 
 | |
| namespace Syntriax.Engine.Core;
 | |
| 
 | |
| [System.Diagnostics.DebuggerDisplay("Name: {Name}, Initialized: {Initialized}")]
 | |
| public class GameObject : IGameObject
 | |
| {
 | |
|     public Action<IAssignableStateEnable>? OnStateEnableAssigned { get; set; } = null;
 | |
|     public Action<IAssignableTransform>? OnTransformAssigned { get; set; } = null;
 | |
|     public Action<IAssignable>? OnUnassigned { get; set; } = null;
 | |
|     public Action<IAssignableBehaviourController>? OnBehaviourControllerAssigned { get; set; } = null;
 | |
|     public Action<IAssignableGameManager>? OnGameManagerAssigned { get; set; } = null;
 | |
| 
 | |
|     public Action<IEntity>? OnNameChanged { get; set; } = null;
 | |
| 
 | |
|     public Action<IInitialize>? OnInitialized { get; set; } = null;
 | |
|     public Action<IInitialize>? OnFinalized { get; set; } = null;
 | |
| 
 | |
|     public Action<IGameObject>? OnUpdated { get; set; } = null;
 | |
| 
 | |
| 
 | |
|     private ITransform _transform = null!;
 | |
|     private IBehaviourController _behaviourController = null!;
 | |
|     private IStateEnable _stateEnable = null!;
 | |
|     private IGameManager _gameManager = null!;
 | |
| 
 | |
|     private string _name = nameof(GameObject);
 | |
|     private bool _initialized = false;
 | |
| 
 | |
|     public ITransform Transform => _transform;
 | |
|     public IBehaviourController BehaviourController => _behaviourController;
 | |
|     public IStateEnable StateEnable => _stateEnable;
 | |
|     public IGameManager GameManager => _gameManager;
 | |
| 
 | |
|     public bool Initialized
 | |
|     {
 | |
|         get => _initialized;
 | |
|         private set
 | |
|         {
 | |
|             if (value == _initialized)
 | |
|                 return;
 | |
| 
 | |
|             _initialized = value;
 | |
|             if (value)
 | |
|                 OnInitialized?.Invoke(this);
 | |
|             else
 | |
|                 OnFinalized?.Invoke(this);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public string Name
 | |
|     {
 | |
|         get => _name;
 | |
|         set
 | |
|         {
 | |
|             if (value == _name) return;
 | |
| 
 | |
|             _name = value;
 | |
|             OnNameChanged?.Invoke(this);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public bool Initialize()
 | |
|     {
 | |
|         if (Initialized)
 | |
|             return false;
 | |
| 
 | |
|         NotAssignedException.Check(this, _transform);
 | |
|         NotAssignedException.Check(this, _behaviourController);
 | |
|         NotAssignedException.Check(this, _stateEnable);
 | |
|         NotAssignedException.Check(this, _gameManager);
 | |
| 
 | |
|         Initialized = true;
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     public void Update()
 | |
|     {
 | |
|         if (!_stateEnable.Enabled)
 | |
|             return;
 | |
| 
 | |
|         OnUpdated?.Invoke(this);
 | |
|     }
 | |
| 
 | |
|     public bool Finalize()
 | |
|     {
 | |
|         if (!Initialized)
 | |
|             return false;
 | |
| 
 | |
| 
 | |
|         System.Threading.Tasks.Parallel.ForEach(
 | |
|             _behaviourController.GetBehaviours<IBehaviour>(),
 | |
|             behaviour => behaviour.Finalize()
 | |
|         );
 | |
| 
 | |
|         Initialized = false;
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     public bool Assign(IStateEnable stateEnable)
 | |
|     {
 | |
|         if (Initialized)
 | |
|             return false;
 | |
| 
 | |
|         _stateEnable = stateEnable;
 | |
|         OnStateEnableAssigned?.Invoke(this);
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     public bool Assign(ITransform transform)
 | |
|     {
 | |
|         if (Initialized)
 | |
|             return false;
 | |
| 
 | |
|         _transform = transform;
 | |
|         OnTransformAssigned?.Invoke(this);
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     public bool Assign(IBehaviourController behaviourController)
 | |
|     {
 | |
|         if (Initialized)
 | |
|             return false;
 | |
| 
 | |
|         _behaviourController = behaviourController;
 | |
|         OnBehaviourControllerAssigned?.Invoke(this);
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     public bool Assign(IGameManager gameManager)
 | |
|     {
 | |
|         if (Initialized)
 | |
|             return false;
 | |
| 
 | |
|         _gameManager = gameManager;
 | |
|         OnGameManagerAssigned?.Invoke(this);
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     public bool Unassign()
 | |
|     {
 | |
|         if (Initialized)
 | |
|             return false;
 | |
| 
 | |
|         _stateEnable = null!;
 | |
|         _transform = null!;
 | |
|         _behaviourController = null!;
 | |
|         _gameManager = null!;
 | |
| 
 | |
|         OnUnassigned?.Invoke(this);
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     public GameObject() { OnBehaviourControllerAssigned += ConnectBehaviourController; }
 | |
|     private void ConnectBehaviourController(IAssignableBehaviourController controller)
 | |
|     {
 | |
|         controller.BehaviourController.OnBehaviourAdded += OnBehaviourAdded;
 | |
|         controller.BehaviourController.OnBehaviourRemoved += OnBehaviourRemoved;
 | |
|     }
 | |
|     private void OnBehaviourRemoved(IBehaviourController _, IBehaviour behaviour) { if (Initialized) behaviour.Initialize(); }
 | |
|     private void OnBehaviourAdded(IBehaviourController _, IBehaviour behaviour) { if (Initialized) behaviour.Finalize(); }
 | |
| }
 |