using System.Collections.Generic;
using UnityEngine;
namespace Syntriax.Modules.Movement.Config
{
///
/// The Singleton factory responsible for loading and applying s,
///
///
/// Looks for the path specified in the variable
/// The default path is "Resources/Modules/Syntriax/Movement/Definitions/"
///
public class MovementDefinitionFactory : MonoBehaviour
{
private const string Name = "Movement Definition Factory";
private const int InitialCapacity = 64;
private const string ResourceDirectoryToDefinitions = "Modules/Syntriax/Movement/Definitions/";
private static MovementDefinitionFactory _instance = null;
public static MovementDefinitionFactory Instance
{
get
{
if (_instance == null)
_instance = new GameObject(Name).AddComponent();
return _instance;
}
}
private Dictionary _definitions = null;
public Dictionary Definitions
{
get
{
if (_definitions == null)
Initialize();
return _definitions;
}
}
private void Start()
{
if (_instance == this)
return;
Destroy(this);
}
///
/// Initializes the factory, if already initialized reinitializes
///
///
/// Automatically loads the definition files specificed path
/// The default is "Resources/Modules/Syntriax/Movement/Definitions/"
///
public void Initialize()
{
if (_definitions == null)
_definitions = new Dictionary(InitialCapacity);
Reset();
foreach (TextAsset definitionTextAsset in UnityEngine.Resources.LoadAll(ResourceDirectoryToDefinitions))
AddToFactoryWithJSON(definitionTextAsset.text);
}
///
/// Manually registers a to the factory with a JSON
///
/// A of a in JSON
public void AddToFactoryWithJSON(string definitionJSONText)
{
MovementDefinition movementDefinition = JsonUtility.FromJson(definitionJSONText);
AddDefinitionToFactory(movementDefinition);
}
///
/// Clears all the definitions in the factory
///
///
/// Does not reinitialize, please call to initialize it back
///
public void Reset() => _definitions?.Clear();
///
/// Registers a list of s to the factory
///
public void AddDefinitionsToFactory(List movementDefinitions)
{
foreach (MovementDefinition movementDefinition in movementDefinitions)
AddDefinitionToFactory(movementDefinition);
}
///
/// Registers a single to the factory
///
public void AddDefinitionToFactory(MovementDefinition movementDefinition)
{
if (Definitions.ContainsKey(movementDefinition.Name))
throw new System.ArgumentException($"{movementDefinition.Name} is already in the Movement Definition Factory");
Definitions.Add(movementDefinition.Name, movementDefinition);
}
///
/// Searches for the in the factory and applies it to the
///
/// that the will be applied to
/// The registered 's name that will be applied to the provided
/// When the provided name is not registered in the factory
public void ApplyDefinitionToGameObject(GameObject gameObject, string definitionName)
{
if (!Definitions.ContainsKey(definitionName))
throw new System.ArgumentException($"The definition with name \"{definitionName}\" does not exists in the current {Name}");
ApplyDefinitionToGameObject(gameObject, Definitions[definitionName]);
}
///
/// Applies the provided to the
///
/// that the will be applied to
/// The that will be applied to the provided
public void ApplyDefinitionToGameObject(GameObject gameObject, MovementDefinition definition)
{
foreach (MovementConfig movementConfig in definition.MovementConfigs)
{
IMovement movement = (IMovement)MovementFactory.Instance.AddToGameObject(gameObject, movementConfig.TypeName);
movement.BaseSpeed = movementConfig.BaseSpeed;
}
if (definition.MonoBehaviours != null)
foreach (string monoBehaviours in definition.MonoBehaviours)
MovementFactory.Instance.AddToGameObject(gameObject, monoBehaviours);
}
#if UNITY_EDITOR
public void SaveMovementDefinition(MovementDefinition definition)
{
string jsonText = JsonUtility.ToJson(definition, true);
string path = $"Assets/Resources/{ResourceDirectoryToDefinitions}{definition.Name}.json";
System.IO.File.WriteAllText(path, jsonText);
}
#endif
}
}