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 } }