using Syntriax.Modules.State; using UnityEngine; namespace Syntriax.Modules.Action.Samples { [RequireComponent(typeof(Rigidbody2D))] public class PlatformerJump : ActionWithDeactivation { [SerializeField] private float jumpSpeed = 10f; public float JumpSpeed { get => jumpSpeed; set => jumpSpeed = value; } [SerializeField] private float fallThreshold = 0f; public float FallThreshold { get => fallThreshold; set => fallThreshold = value; } [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 IStateEnable gameObjectStateEnable = null; protected bool airSuspension = false; protected Rigidbody2D rigid = null; protected virtual void Start() { rigid = GetComponent(); gameObjectStateEnable = GetComponent(); FallMultiplier = fallMultiplier; SuspensionMultiplier = suspensionMultiplier; OnActivated += _ => OnActionDeactivated(); OnDeactivated += _ => OnActionActivated(); } protected virtual void FixedUpdate() { if (!StateEnable.IsEnabledNullChecked() || !gameObjectStateEnable.IsEnabledNullChecked()) 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; } protected void OnActionDeactivated() { if (!gameObjectStateEnable.IsEnabledNullChecked()) return; airSuspension = false; } protected void OnActionActivated() { if (!gameObjectStateEnable.IsEnabledNullChecked()) return; Jump(); airSuspension = true; } } }