diff --git a/2D.meta b/2D.meta new file mode 100644 index 0000000..15f8372 --- /dev/null +++ b/2D.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 247a7892cc48fa54c971733d8e0213db +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/2D/OneDimensional2DAirMovement.cs b/2D/OneDimensional2DAirMovement.cs new file mode 100644 index 0000000..cc3f8c0 --- /dev/null +++ b/2D/OneDimensional2DAirMovement.cs @@ -0,0 +1,54 @@ +using Syntriax.Modules.Movement.ColliderCheck; +using Syntriax.Modules.Movement.ColliderCheck.Ground; +using UnityEngine; + +namespace Syntriax.Modules.Movement +{ + [RequireComponent(typeof(Rigidbody2D))] + public class OneDimensional2DAirMovement : MonoBehaviour, IMovement, IState + { + private IGroundCheck groundCheck = null; + private Rigidbody2D rigid = null; + private float moveValue = 0f; + + + public bool IsActive => StateEnabled && !groundCheck.IsCollided(); + public bool StateEnabled { get; set; } = true; + public float SpeedMultiplier { get; set; } = 1f; + + private void Start() + { + rigid = GetComponent(); + groundCheck = GetComponentInChildren(); + } + + private void FixedUpdate() + { + if (!IsActive) + return; + + ApplyMovement(); + } + + private void ApplyMovement() + { + Vector2 velocity = rigid.velocity; + velocity.x += moveValue * Time.fixedDeltaTime; + + if (moveValue != 0f) + { + if (Mathf.Abs(velocity.x) > Mathf.Abs(moveValue)) + velocity.x = moveValue; + else if (Mathf.Abs(velocity.x - moveValue) > Mathf.Abs(moveValue)) + velocity.x += moveValue * Time.fixedDeltaTime; + } + + rigid.velocity = velocity; + } + + public void Move(float x = 0, float y = 0, float z = 0) + { + moveValue = x * SpeedMultiplier; + } + } +} diff --git a/2D/OneDimensional2DAirMovement.cs.meta b/2D/OneDimensional2DAirMovement.cs.meta new file mode 100644 index 0000000..497661e --- /dev/null +++ b/2D/OneDimensional2DAirMovement.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 12a58daabbf3fa8418a164390a593753 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/2D/OneDimensional2DGroundMovement.cs b/2D/OneDimensional2DGroundMovement.cs new file mode 100644 index 0000000..66fac0c --- /dev/null +++ b/2D/OneDimensional2DGroundMovement.cs @@ -0,0 +1,44 @@ +using Syntriax.Modules.Movement.ColliderCheck; +using Syntriax.Modules.Movement.ColliderCheck.Ground; +using UnityEngine; + +namespace Syntriax.Modules.Movement +{ + [RequireComponent(typeof(Rigidbody2D))] + public class OneDimensional2DGroundMovement : MonoBehaviour, IMovement, IState + { + private IGroundCheck groundCheck = null; + private Rigidbody2D rigid = null; + private float moveValue = 0f; + + public bool IsActive => StateEnabled && groundCheck.IsCollided(); + public bool StateEnabled { get; set; } = true; + public float SpeedMultiplier { get; set; } = 1f; + + private void Start() + { + rigid = GetComponent(); + groundCheck = GetComponentInChildren(); + } + + private void FixedUpdate() + { + if (!IsActive) + return; + + ApplyMovement(); + } + + private void ApplyMovement() + { + Vector2 velocity = rigid.velocity; + velocity.x = moveValue; + rigid.velocity = velocity; + } + + public void Move(float x = 0, float y = 0, float z = 0) + { + moveValue = x * SpeedMultiplier; + } + } +} diff --git a/2D/OneDimensional2DGroundMovement.cs.meta b/2D/OneDimensional2DGroundMovement.cs.meta new file mode 100644 index 0000000..407916c --- /dev/null +++ b/2D/OneDimensional2DGroundMovement.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 849a6316df6662a48ae6cfcd4c2fbc1e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ColliderCheck.meta b/ColliderCheck.meta new file mode 100644 index 0000000..82c8171 --- /dev/null +++ b/ColliderCheck.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 115027fb4693d6247bd07cab06d81091 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ColliderCheck/Ground.meta b/ColliderCheck/Ground.meta new file mode 100644 index 0000000..841050f --- /dev/null +++ b/ColliderCheck/Ground.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2c348589c341f3d4f8db2e34198ec32e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ColliderCheck/Ground/IGroundCheck.cs b/ColliderCheck/Ground/IGroundCheck.cs new file mode 100644 index 0000000..a3e7221 --- /dev/null +++ b/ColliderCheck/Ground/IGroundCheck.cs @@ -0,0 +1,4 @@ +namespace Syntriax.Modules.Movement.ColliderCheck.Ground +{ + public interface IGroundCheck : IColliderCheck { } +} diff --git a/ColliderCheck/Ground/IGroundCheck.cs.meta b/ColliderCheck/Ground/IGroundCheck.cs.meta new file mode 100644 index 0000000..fa60c1b --- /dev/null +++ b/ColliderCheck/Ground/IGroundCheck.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2cbb917bc29d63241aa50c7fe8dc141d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ColliderCheck/Ground/TwoDimensionalBoxChildGroundCheck.cs b/ColliderCheck/Ground/TwoDimensionalBoxChildGroundCheck.cs new file mode 100644 index 0000000..0791d0b --- /dev/null +++ b/ColliderCheck/Ground/TwoDimensionalBoxChildGroundCheck.cs @@ -0,0 +1,4 @@ +namespace Syntriax.Modules.Movement.ColliderCheck.Ground +{ + public class TwoDimensionalBoxChildGroundCheck : TwoDimensionalBoxChildColliderCheck, IGroundCheck { } +} diff --git a/ColliderCheck/Ground/TwoDimensionalBoxChildGroundCheck.cs.meta b/ColliderCheck/Ground/TwoDimensionalBoxChildGroundCheck.cs.meta new file mode 100644 index 0000000..4eb6962 --- /dev/null +++ b/ColliderCheck/Ground/TwoDimensionalBoxChildGroundCheck.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a878fb141e25e954c9b73eff8657605a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ColliderCheck/IColliderCheck.cs b/ColliderCheck/IColliderCheck.cs new file mode 100644 index 0000000..04ca753 --- /dev/null +++ b/ColliderCheck/IColliderCheck.cs @@ -0,0 +1,10 @@ +using UnityEngine; + +namespace Syntriax.Modules.Movement.ColliderCheck +{ + public interface IColliderCheck + { + LayerMask ColliderMask { get; set; } + bool IsColliderDetected { get; } + } +} diff --git a/ColliderCheck/IColliderCheck.cs.meta b/ColliderCheck/IColliderCheck.cs.meta new file mode 100644 index 0000000..d0f4f28 --- /dev/null +++ b/ColliderCheck/IColliderCheck.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 164c4b9411986c14e8012b2e7fdd2a6a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ColliderCheck/IColliderCheckExtensions.cs b/ColliderCheck/IColliderCheckExtensions.cs new file mode 100644 index 0000000..c427d25 --- /dev/null +++ b/ColliderCheck/IColliderCheckExtensions.cs @@ -0,0 +1,8 @@ +namespace Syntriax.Modules.Movement.ColliderCheck +{ + public static class IColliderCheckExtensions + { + public static bool IsCollided(this IColliderCheck colliderCheck) + => colliderCheck == null ? true : colliderCheck.IsColliderDetected; + } +} diff --git a/ColliderCheck/IColliderCheckExtensions.cs.meta b/ColliderCheck/IColliderCheckExtensions.cs.meta new file mode 100644 index 0000000..2ec5c9b --- /dev/null +++ b/ColliderCheck/IColliderCheckExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8a31fdb05e206b44cbe615353e924344 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ColliderCheck/TwoDimensionalBoxChildColliderCheck.cs b/ColliderCheck/TwoDimensionalBoxChildColliderCheck.cs new file mode 100644 index 0000000..800a8ab --- /dev/null +++ b/ColliderCheck/TwoDimensionalBoxChildColliderCheck.cs @@ -0,0 +1,24 @@ +using UnityEngine; + +namespace Syntriax.Modules.Movement.ColliderCheck +{ + public class TwoDimensionalBoxChildColliderCheck : MonoBehaviour, IColliderCheck, IState + { + [SerializeField] private LayerMask colliderMask = 0; + + public LayerMask ColliderMask { get => colliderMask; set => colliderMask = value; } + + public bool IsColliderDetected + => StateEnabled ? Physics2D.OverlapBox(transform.position, transform.localScale, 0, ColliderMask) != null : true; + + public bool StateEnabled { get; set; } = true; + +#if UNITY_EDITOR + private void OnDrawGizmosSelected() + { + Gizmos.color = IsColliderDetected ? Color.green : Color.red; + Gizmos.DrawWireCube(transform.position, transform.lossyScale); + } +#endif + } +} diff --git a/ColliderCheck/TwoDimensionalBoxChildColliderCheck.cs.meta b/ColliderCheck/TwoDimensionalBoxChildColliderCheck.cs.meta new file mode 100644 index 0000000..bead24f --- /dev/null +++ b/ColliderCheck/TwoDimensionalBoxChildColliderCheck.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 090650329160e7b42ba89ccfad00375e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/IMovement.cs b/IMovement.cs new file mode 100644 index 0000000..299e2f3 --- /dev/null +++ b/IMovement.cs @@ -0,0 +1,9 @@ +namespace Syntriax.Modules.Movement +{ + public interface IMovement + { + float SpeedMultiplier { get; set; } + bool IsActive { get; } + void Move(float x = 0f, float y = 0f, float z = 0f); + } +} diff --git a/IMovement.cs.meta b/IMovement.cs.meta new file mode 100644 index 0000000..d6d71fe --- /dev/null +++ b/IMovement.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0c332dd4b3d45ea469fcfb42aa50e3db +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/IMovementExtensions.cs b/IMovementExtensions.cs new file mode 100644 index 0000000..e91c34b --- /dev/null +++ b/IMovementExtensions.cs @@ -0,0 +1,13 @@ +using UnityEngine; + +namespace Syntriax.Modules.Movement +{ + public static class IMovementExtensions + { + public static void Move(this IMovement movement, Vector2 moveVector) + => movement.Move(moveVector.x, moveVector.y); + + public static void Move(this IMovement movement, Vector3 moveVector) + => movement.Move(moveVector.x, moveVector.y, moveVector.z); + } +} diff --git a/IMovementExtensions.cs.meta b/IMovementExtensions.cs.meta new file mode 100644 index 0000000..aa645fa --- /dev/null +++ b/IMovementExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a1d3a4ba263ed1648aa205a8a37a574b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/IStateSwitch.cs b/IStateSwitch.cs new file mode 100644 index 0000000..2c46199 --- /dev/null +++ b/IStateSwitch.cs @@ -0,0 +1,7 @@ +namespace Syntriax.Modules.Movement +{ + public interface IState + { + bool StateEnabled { get; set; } + } +} diff --git a/IStateSwitch.cs.meta b/IStateSwitch.cs.meta new file mode 100644 index 0000000..ba13095 --- /dev/null +++ b/IStateSwitch.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bc4a8610b5876e14ab81beef027850b2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Movement.asmdef b/Movement.asmdef new file mode 100644 index 0000000..2cc9602 --- /dev/null +++ b/Movement.asmdef @@ -0,0 +1,3 @@ +{ + "name": "Movement" +} diff --git a/Movement.asmdef.meta b/Movement.asmdef.meta new file mode 100644 index 0000000..92a9f42 --- /dev/null +++ b/Movement.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c967acc4be781ca44b42a1887eb1ac7a +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/SpecialAction.meta b/SpecialAction.meta new file mode 100644 index 0000000..95dd09f --- /dev/null +++ b/SpecialAction.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6f411b98930309f4a9251106523e357a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/SpecialAction/Actions.meta b/SpecialAction/Actions.meta new file mode 100644 index 0000000..3fbea5e --- /dev/null +++ b/SpecialAction/Actions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a67ce871b9457064096bcbc81804138c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/SpecialAction/Actions/PlatformerJump.cs b/SpecialAction/Actions/PlatformerJump.cs new file mode 100644 index 0000000..b9b490e --- /dev/null +++ b/SpecialAction/Actions/PlatformerJump.cs @@ -0,0 +1,70 @@ +using Syntriax.Modules.Movement.ColliderCheck; +using Syntriax.Modules.Movement.ColliderCheck.Ground; +using UnityEngine; + +namespace Syntriax.Modules.Movement.SpecialAction +{ + [RequireComponent(typeof(Rigidbody2D))] + public class PlatformerJump : MonoBehaviour, ISpecialActionActivate, ISpecialActionDeactivate, IState + { + public float JumpSpeed { get; set; } = 0f; + public bool StateEnabled { get; set; } = true; + + private bool airSuspension = false; + private float fallMultiplier = 0f; + private float suspensionMultiplier = 0f; + + private IGroundCheck groundCheck = null; + private Rigidbody2D rigid = null; + + + private void Awake() + { + JumpSpeed = 10f; + fallMultiplier = 1.5f * Time.fixedDeltaTime; + suspensionMultiplier = 1f * Time.fixedDeltaTime; + } + + private void Start() + { + rigid = GetComponent(); + groundCheck = GetComponentInChildren(); + } + + private void FixedUpdate() + { + if (!StateEnabled) + return; + + if (rigid.velocity.y < 0f) + ApplySuspension(suspensionMultiplier); + else if (!airSuspension) + ApplySuspension(fallMultiplier); + } + + private void ApplySuspension(float multipier) + { + rigid.velocity += Physics2D.gravity * multipier; + } + + private void Jump() + { + Vector2 velocity = rigid.velocity; + velocity.y = JumpSpeed; + rigid.velocity = velocity; + } + + public void OnActivation() + { + if (groundCheck.IsCollided()) + Jump(); + + airSuspension = true; + } + + public void OnDeactivation() + { + airSuspension = false; + } + } +} diff --git a/SpecialAction/Actions/PlatformerJump.cs.meta b/SpecialAction/Actions/PlatformerJump.cs.meta new file mode 100644 index 0000000..21b147d --- /dev/null +++ b/SpecialAction/Actions/PlatformerJump.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e45c80df261a5714e9a22fd73a2cd39a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/SpecialAction/ISpecialActionActivate.cs b/SpecialAction/ISpecialActionActivate.cs new file mode 100644 index 0000000..1ff33dd --- /dev/null +++ b/SpecialAction/ISpecialActionActivate.cs @@ -0,0 +1,7 @@ +namespace Syntriax.Modules.Movement.SpecialAction +{ + public interface ISpecialActionActivate + { + void OnActivation(); + } +} diff --git a/SpecialAction/ISpecialActionActivate.cs.meta b/SpecialAction/ISpecialActionActivate.cs.meta new file mode 100644 index 0000000..65276c3 --- /dev/null +++ b/SpecialAction/ISpecialActionActivate.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a73af08e7cc67da42bdbfebb05a87d20 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/SpecialAction/ISpecialActionDeactivate.cs b/SpecialAction/ISpecialActionDeactivate.cs new file mode 100644 index 0000000..4c0f383 --- /dev/null +++ b/SpecialAction/ISpecialActionDeactivate.cs @@ -0,0 +1,7 @@ +namespace Syntriax.Modules.Movement.SpecialAction +{ + public interface ISpecialActionDeactivate + { + void OnDeactivation(); + } +} diff --git a/SpecialAction/ISpecialActionDeactivate.cs.meta b/SpecialAction/ISpecialActionDeactivate.cs.meta new file mode 100644 index 0000000..b4ebbf8 --- /dev/null +++ b/SpecialAction/ISpecialActionDeactivate.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 81fa878c771128a4d8232969f0c2e460 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: