44 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using Engine.Core.Exceptions;
 | 
						|
 | 
						|
namespace 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);
 | 
						|
 | 
						|
        if (behaviourController is not null)
 | 
						|
        {
 | 
						|
            if (!behaviourController.Assign(universeObject))
 | 
						|
                throw AssignFailedException.From(behaviourController, universeObject);
 | 
						|
            if (!universeObject.Assign(behaviourController))
 | 
						|
                throw AssignFailedException.From(universeObject, behaviourController);
 | 
						|
        }
 | 
						|
        else
 | 
						|
            BehaviourControllerFactory.Instantiate(universeObject);
 | 
						|
 | 
						|
        if (stateEnable is not null)
 | 
						|
        {
 | 
						|
            if (!stateEnable.Assign(universeObject))
 | 
						|
                throw AssignFailedException.From(stateEnable, universeObject);
 | 
						|
            if (!universeObject.Assign(stateEnable))
 | 
						|
                throw AssignFailedException.From(universeObject, stateEnable);
 | 
						|
        }
 | 
						|
        else
 | 
						|
            StateEnableFactory.Instantiate(universeObject);
 | 
						|
 | 
						|
        return universeObject;
 | 
						|
    }
 | 
						|
}
 |