diff --git a/Movement.asmdef b/Movement.asmdef index 2cc9602..6a543f9 100644 --- a/Movement.asmdef +++ b/Movement.asmdef @@ -1,3 +1,16 @@ { - "name": "Movement" -} + "name": "Movement", + "rootNamespace": "", + "references": [ + "GUID:75469ad4d38634e559750d17036d5f7c" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/VariableMovement.meta b/VariableMovement.meta new file mode 100644 index 0000000..a3e663c --- /dev/null +++ b/VariableMovement.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 726dbb7aaeb452e42b1faf1318513cdb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VariableMovement/IVariableMovement.cs b/VariableMovement/IVariableMovement.cs new file mode 100644 index 0000000..30bd31c --- /dev/null +++ b/VariableMovement/IVariableMovement.cs @@ -0,0 +1,7 @@ +namespace Syntriax.Modules.Movement.VariableMovement +{ + public interface IVariableMovement + { + VMAsset Asset { get; set; } + } +} diff --git a/VariableMovement/IVariableMovement.cs.meta b/VariableMovement/IVariableMovement.cs.meta new file mode 100644 index 0000000..e67271f --- /dev/null +++ b/VariableMovement/IVariableMovement.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6cdf8a548c241e0419fcf7e95c760cae +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VariableMovement/IVariableMovementController.cs b/VariableMovement/IVariableMovementController.cs new file mode 100644 index 0000000..3e290bb --- /dev/null +++ b/VariableMovement/IVariableMovementController.cs @@ -0,0 +1,14 @@ +using UnityEngine.Events; +using UnityEngine.InputSystem; + +namespace Syntriax.Modules.Movement.VariableMovement +{ + public interface IVariableMovementController + { + IVariableMovement ActiveVariableMovement { get; } + UnityEvent OnVariableMovementChanged { get; } + IInputActionCollection InputActionCollection { get; set; } + + void LoadVariableMovementCollection(VMCollection collection); + } +} diff --git a/VariableMovement/IVariableMovementController.cs.meta b/VariableMovement/IVariableMovementController.cs.meta new file mode 100644 index 0000000..1517b91 --- /dev/null +++ b/VariableMovement/IVariableMovementController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8626f2dd751462548adce79ccb84d6d3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VariableMovement/IVariableMovementWithState.cs b/VariableMovement/IVariableMovementWithState.cs new file mode 100644 index 0000000..0015c45 --- /dev/null +++ b/VariableMovement/IVariableMovementWithState.cs @@ -0,0 +1,10 @@ +using UnityEngine.Events; + +namespace Syntriax.Modules.Movement.VariableMovement +{ + public interface IVariableMovementWithState : IVariableMovement + { + bool Enabled { get; set; } + UnityEvent OnToggleStateChanged { get; } + } +} diff --git a/VariableMovement/IVariableMovementWithState.cs.meta b/VariableMovement/IVariableMovementWithState.cs.meta new file mode 100644 index 0000000..1d335fc --- /dev/null +++ b/VariableMovement/IVariableMovementWithState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c4e5bc603a4ef1342abf1e987cfced7f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VariableMovement/ScriptableObjects.meta b/VariableMovement/ScriptableObjects.meta new file mode 100644 index 0000000..c215cb7 --- /dev/null +++ b/VariableMovement/ScriptableObjects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63a9b9d234afa1d4d81a6f018393c057 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VariableMovement/ScriptableObjects/VMAssetSO.cs b/VariableMovement/ScriptableObjects/VMAssetSO.cs new file mode 100644 index 0000000..a69b618 --- /dev/null +++ b/VariableMovement/ScriptableObjects/VMAssetSO.cs @@ -0,0 +1,10 @@ +using UnityEngine; + +namespace Syntriax.Modules.Movement.VariableMovement +{ + [CreateAssetMenu(fileName = "VMAsset", menuName = "Syntriax/Modules/Movement/Variable Movement/Asset", order = 0)] + public class VMAssetSO : ScriptableObject + { + public VMAsset asset; + } +} diff --git a/VariableMovement/ScriptableObjects/VMAssetSO.cs.meta b/VariableMovement/ScriptableObjects/VMAssetSO.cs.meta new file mode 100644 index 0000000..00ca2ca --- /dev/null +++ b/VariableMovement/ScriptableObjects/VMAssetSO.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 675d01134857a5b4aa8278985b7d2c09 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VariableMovement/ScriptableObjects/VMCollectionSO.cs b/VariableMovement/ScriptableObjects/VMCollectionSO.cs new file mode 100644 index 0000000..18eadf2 --- /dev/null +++ b/VariableMovement/ScriptableObjects/VMCollectionSO.cs @@ -0,0 +1,10 @@ +using UnityEngine; + +namespace Syntriax.Modules.Movement.VariableMovement +{ + [CreateAssetMenu(fileName = "VMCollection", menuName = "Syntriax/Modules/Movement/Variable Movement/Collection", order = 0)] + public class VMCollectionSO : ScriptableObject + { + public VMCollection collection; + } +} diff --git a/VariableMovement/ScriptableObjects/VMCollectionSO.cs.meta b/VariableMovement/ScriptableObjects/VMCollectionSO.cs.meta new file mode 100644 index 0000000..5e72105 --- /dev/null +++ b/VariableMovement/ScriptableObjects/VMCollectionSO.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b6d52a12481917c4b877c026fa81dfef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VariableMovement/VMAsset.cs b/VariableMovement/VMAsset.cs new file mode 100644 index 0000000..59aa652 --- /dev/null +++ b/VariableMovement/VMAsset.cs @@ -0,0 +1,19 @@ +using System; + +namespace Syntriax.Modules.Movement.VariableMovement +{ + [Serializable] + public struct VMAsset + { + public string Name; + public float Multiplier; + public string ActionReference; + + public VMAsset(string name, float multiplier, string actionReference) + { + Name = name; + Multiplier = multiplier; + ActionReference = actionReference; + } + } +} diff --git a/VariableMovement/VMAsset.cs.meta b/VariableMovement/VMAsset.cs.meta new file mode 100644 index 0000000..190d51c --- /dev/null +++ b/VariableMovement/VMAsset.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 35f90754856e0cf43a33a1a6bc5e0423 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VariableMovement/VMCollection.cs b/VariableMovement/VMCollection.cs new file mode 100644 index 0000000..0423db2 --- /dev/null +++ b/VariableMovement/VMCollection.cs @@ -0,0 +1,17 @@ +using System; + +namespace Syntriax.Modules.Movement.VariableMovement +{ + [Serializable] + public struct VMCollection + { + public VMAsset DefaultAsset; + public VMAsset[] VMAssets; + + public VMCollection(VMAsset defaultAsset, VMAsset[] vMAssets) + { + DefaultAsset = defaultAsset; + VMAssets = vMAssets; + } + } +} diff --git a/VariableMovement/VMCollection.cs.meta b/VariableMovement/VMCollection.cs.meta new file mode 100644 index 0000000..8ae96ef --- /dev/null +++ b/VariableMovement/VMCollection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6c9addcc3980a2948b5c2e493f8f1642 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VariableMovement/VariableMovement.cs b/VariableMovement/VariableMovement.cs new file mode 100644 index 0000000..49b3cc3 --- /dev/null +++ b/VariableMovement/VariableMovement.cs @@ -0,0 +1,11 @@ +namespace Syntriax.Modules.Movement.VariableMovement +{ + public class VariableMovement : IVariableMovement + { + public VMAsset Asset { get; set; } + + public VariableMovement() { } + public VariableMovement(VMAsset asset) + => Asset = asset; + } +} diff --git a/VariableMovement/VariableMovement.cs.meta b/VariableMovement/VariableMovement.cs.meta new file mode 100644 index 0000000..02f0e85 --- /dev/null +++ b/VariableMovement/VariableMovement.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9fa3a5e4edf40ce42a96a32da76de626 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VariableMovement/VariableMovementController.cs b/VariableMovement/VariableMovementController.cs new file mode 100644 index 0000000..91d0a46 --- /dev/null +++ b/VariableMovement/VariableMovementController.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.InputSystem; + +namespace Syntriax.Modules.Movement.VariableMovement +{ + public class VariableMovementController : MonoBehaviour, IVariableMovementController + { + public UnityEvent OnVariableMovementChanged { get; protected set; } = null; + public IInputActionCollection InputActionCollection { get; set; } = null; + private IVariableMovement _activeVariableMovement = null; + public IVariableMovement ActiveVariableMovement + { + get => _activeVariableMovement; + protected set + { + _activeVariableMovement = value; + OnVariableMovementChanged.Invoke(value); + + if (movementController != null) + SetMultiplierToActiveMovement(movementController.ActiveMovement); + } + } + + protected IMovementController movementController = null; + protected IVariableMovement defaultVariableMovement = null; + protected List variableMovementsWithState = null; + protected VMCollection collection; + + protected virtual void Awake() + { + OnVariableMovementChanged = new UnityEvent(); + defaultVariableMovement = new VariableMovement(); + variableMovementsWithState = new List(16); + } + + protected virtual void Start() + { + movementController = GetComponent(); + movementController.OnMovementChanged.AddListener(SetMultiplierToActiveMovement); + } + + protected void SetMultiplierToActiveMovement(IMovement currentMovement) + => currentMovement.MovementMultiplier = ActiveVariableMovement.Asset.Multiplier; + + public void LoadVariableMovementCollection(VMCollection collection) + { + if (InputActionCollection == null) + throw new System.NullReferenceException("InputActionCollection must be set on the VariableMovementController to load a collection!"); + + this.collection = collection; + + UnsubscribeFromMovements(); + + variableMovementsWithState.Clear(); + foreach (VMAsset asset in collection.VMAssets) + variableMovementsWithState.Add(new VariableMovementWithState(asset, InputActionCollection)); + defaultVariableMovement.Asset = collection.DefaultAsset; + + SubscribeToMovements(); + UpdateActiveVariableMovement(); + } + + protected virtual void SubscribeToMovements() + { + foreach (IVariableMovementWithState variableMovementWithState in variableMovementsWithState) + variableMovementWithState.OnToggleStateChanged.AddListener(VariableMovementStateListener); + } + + protected virtual void UnsubscribeFromMovements() + { + foreach (IVariableMovementWithState variableMovementWithState in variableMovementsWithState) + variableMovementWithState.OnToggleStateChanged.RemoveListener(VariableMovementStateListener); + } + + private void VariableMovementStateListener(bool arg0) => UpdateActiveVariableMovement(); + protected virtual void UpdateActiveVariableMovement() + { + foreach (IVariableMovementWithState variableMovementWithState in variableMovementsWithState) + if (variableMovementWithState.Enabled) + { + ActiveVariableMovement = variableMovementWithState; + return; + } + + ActiveVariableMovement = defaultVariableMovement; + } + } +} diff --git a/VariableMovement/VariableMovementController.cs.meta b/VariableMovement/VariableMovementController.cs.meta new file mode 100644 index 0000000..7334b1e --- /dev/null +++ b/VariableMovement/VariableMovementController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9c54e2868362dbe4eab92c16ee11fc42 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VariableMovement/VariableMovementWithState.cs b/VariableMovement/VariableMovementWithState.cs new file mode 100644 index 0000000..19fbad7 --- /dev/null +++ b/VariableMovement/VariableMovementWithState.cs @@ -0,0 +1,63 @@ +using UnityEngine.Events; +using UnityEngine.InputSystem; + +namespace Syntriax.Modules.Movement.VariableMovement +{ + public class VariableMovementWithState : IVariableMovementWithState + { + public UnityEvent OnToggleStateChanged { get; protected set; } = null; + private bool _enabled = false; + public bool Enabled + { + get => _enabled; + set + { + bool isNewValue = _enabled != value; + + _enabled = value; + + if (isNewValue) + OnToggleStateChanged.Invoke(value); + } + } + private VMAsset _asset; + public VMAsset Asset + { + get => _asset; + set + { + if (actionReference != null) + { + actionReference.performed -= Performed; + actionReference.canceled -= Cancelled; + } + + foreach (InputAction action in inputClass) + if (action.name == value.Name) + { + actionReference = action; + actionReference.performed += Performed; + actionReference.canceled += Cancelled; + break; + } + + _asset = value; + + Enabled = false; + } + } + + protected readonly IInputActionCollection inputClass; + protected InputAction actionReference = null; + + public VariableMovementWithState(VMAsset asset, IInputActionCollection inputClass) + { + this.inputClass = inputClass; + OnToggleStateChanged = new UnityEvent(); + Asset = asset; + } + + protected void Cancelled(InputAction.CallbackContext obj) => Enabled = false; + protected void Performed(InputAction.CallbackContext obj) => Enabled = true; + } +} diff --git a/VariableMovement/VariableMovementWithState.cs.meta b/VariableMovement/VariableMovementWithState.cs.meta new file mode 100644 index 0000000..3624c65 --- /dev/null +++ b/VariableMovement/VariableMovementWithState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95216561eb395f54596b439538c1c691 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: