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();
|
|
}
|
|
}
|