38 lines
1.5 KiB
C#
38 lines
1.5 KiB
C#
using Syntriax.Engine.Core.Abstract;
|
|
using Syntriax.Engine.Core.Exceptions;
|
|
|
|
namespace Syntriax.Engine.Core.Factory;
|
|
|
|
public class UniverseObjectFactory
|
|
{
|
|
public static IUniverseObject Instantiate() => Instantiate<UniverseObject>();
|
|
public static T Instantiate<T>(params object?[]? args) where T : class, IUniverseObject
|
|
=> Instantiate<T>(behaviourController: null, stateEnable: null, args);
|
|
|
|
public static IUniverseObject Instantiate(IBehaviourController? behaviourController = null, IStateEnable? stateEnable = null) => Instantiate<UniverseObject>(behaviourController, stateEnable);
|
|
public static T Instantiate<T>(
|
|
IBehaviourController? behaviourController = null,
|
|
IStateEnable? stateEnable = null,
|
|
params object?[]? args
|
|
)
|
|
where T : class, IUniverseObject
|
|
{
|
|
T universeObject = TypeFactory.Get<T>(args);
|
|
|
|
behaviourController ??= TypeFactory.Get<BehaviourController>();
|
|
stateEnable ??= TypeFactory.Get<StateEnable>();
|
|
|
|
if (!behaviourController.Assign(universeObject))
|
|
throw AssignFailedException.From(behaviourController, universeObject);
|
|
if (!stateEnable.Assign(universeObject))
|
|
throw AssignFailedException.From(stateEnable, universeObject);
|
|
|
|
if (!universeObject.Assign(behaviourController))
|
|
throw AssignFailedException.From(universeObject, behaviourController);
|
|
if (!universeObject.Assign(stateEnable))
|
|
throw AssignFailedException.From(universeObject, stateEnable);
|
|
|
|
return universeObject;
|
|
}
|
|
}
|