75 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using Syntriax.Modules.Factory;
 | |
| using Syntriax.Modules.Movement.Config;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace Syntriax.Modules.Movement
 | |
| {
 | |
|     public class MovementDefinitionApplier : MonoBehaviour
 | |
|     {
 | |
|         [Tooltip("The definition's name as defined in it's \"Name\" field")]
 | |
|         [SerializeField] private string startupDefinitionName = "";
 | |
| 
 | |
|         private string appliedDefinitionName = "";
 | |
|         public Action<GameObject> OnMovementDefinitionApplied = null;
 | |
|         public Action<GameObject> OnMovementDefinitionRemoved = null;
 | |
| 
 | |
|         private void Awake()
 | |
|         {
 | |
|             if (string.IsNullOrWhiteSpace(startupDefinitionName))
 | |
|                 return;
 | |
| 
 | |
|             LoadDefinition(startupDefinitionName);
 | |
|         }
 | |
| 
 | |
|         public void LoadDefinition(string definitionName)
 | |
|         {
 | |
|             RemoveDefinition();
 | |
| 
 | |
|             FactorySingleton<MovementDefinitionFactory>.Instance.ApplyDefinitionToGameObject(gameObject, definitionName);
 | |
|             appliedDefinitionName = definitionName;
 | |
|             OnMovementDefinitionApplied?.Invoke(gameObject);
 | |
|         }
 | |
| 
 | |
|         public void LoadDefinition(MovementDefinition definition)
 | |
|         {
 | |
|             RemoveDefinition();
 | |
| 
 | |
|             FactorySingleton<MovementDefinitionFactory>.Instance.ApplyDefinitionToGameObject(gameObject, definition);
 | |
|             appliedDefinitionName = definition.Name;
 | |
|             OnMovementDefinitionApplied?.Invoke(gameObject);
 | |
|         }
 | |
| 
 | |
|         public void RemoveDefinition()
 | |
|         {
 | |
|             if (string.IsNullOrWhiteSpace(appliedDefinitionName))
 | |
|                 return;
 | |
| 
 | |
|             MovementDefinition appliedDefinition = FactorySingleton<MovementDefinitionFactory>.Instance.Definitions[appliedDefinitionName];
 | |
|             if (appliedDefinition.MovementConfigs == null || appliedDefinition.MonoBehaviours == null)
 | |
|                 return;
 | |
| 
 | |
|             foreach (MovementConfig movementConfig in appliedDefinition.MovementConfigs)
 | |
|             {
 | |
|                 Type type = FactorySingleton<MovementFactory>.Instance.Types[movementConfig.TypeName];
 | |
|                 if (TryGetComponent(type, out Component component))
 | |
|                     Destroy(component);
 | |
|             }
 | |
| 
 | |
|             foreach (string monoBehaviour in appliedDefinition.MonoBehaviours)
 | |
|             {
 | |
|                 Type type = FactorySingleton<MovementFactory>.Instance.Types[monoBehaviour];
 | |
|                 if (TryGetComponent(type, out Component component))
 | |
|                     Destroy(component);
 | |
|             }
 | |
| 
 | |
|             appliedDefinition = default;
 | |
|             OnMovementDefinitionRemoved?.Invoke(gameObject);
 | |
|         }
 | |
| 
 | |
|         [ContextMenu("Load Longer")] private void LoadLonger() => LoadDefinition("Example Movement Definition (Longer)");
 | |
|         [ContextMenu("Load Quick")] private void LoadQuick() => LoadDefinition("Example Movement Definition (Quick)");
 | |
|         [ContextMenu("Remove Definition")] private void UnloadDefinition() => RemoveDefinition();
 | |
|     }
 | |
| }
 |