using Syntriax.Modules.ToggleState; using Syntriax.Modules.Trigger; using UnityEngine; namespace Syntriax.Modules.Action { [RequireComponent(typeof(Rigidbody2D))] public class PlatformerJump : MonoBehaviour, IActionActivate, IActionDeactivate { private float jumpSpeed = 10f; public float JumpSpeed { get => jumpSpeed; set => jumpSpeed = value; } public IToggleState ToggleState { get; protected set; } = null; public float FallThreshold { get; set; } = 0f; [SerializeField] private float fallMultiplier = 1.5f; public float FallMultiplier { get => fallMultiplier; set => fallMultiplier = value * Time.fixedDeltaTime; } [SerializeField] private float suspensionMultiplier = 1f; public float SuspensionMultiplier { get => suspensionMultiplier; set => suspensionMultiplier = value * Time.fixedDeltaTime; } protected bool airSuspension = false; protected IGroundTrigger groundCheck = null; protected IToggleState gameObjectToggleState = null; protected Rigidbody2D rigid = null; protected virtual void Start() { rigid = GetComponent(); groundCheck = GetComponentInChildren(); ToggleState = new ToggleStateMember(true); gameObjectToggleState = GetComponent(); } protected virtual void FixedUpdate() { if (!ToggleState.IsToggledNullChecked() || !gameObjectToggleState.IsToggledNullChecked()) return; if (rigid.velocity.y < FallThreshold) ApplySuspension(SuspensionMultiplier); else if (!airSuspension) ApplySuspension(FallMultiplier); } protected virtual void ApplySuspension(float multiplier) => rigid.velocity += Physics2D.gravity * multiplier; protected virtual void Jump() { Vector2 velocity = rigid.velocity; velocity.y = JumpSpeed; rigid.velocity = velocity; } public virtual void Activate() { if (!ToggleState.IsToggledNullChecked() || !gameObjectToggleState.IsToggledNullChecked()) return; if (groundCheck.IsTrigerred) Jump(); airSuspension = true; } public virtual void Deactivate() => airSuspension = false; } }