using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; namespace Pink.Mechanics { public class HeroController : Pink.Mechanics.Kinematic { /// /// Max horizontal speed of the player. /// public float maxSpeed = 7; /// /// Initial jump velocity at the start of a jump. /// public float jumpTakeOffSpeed = 7; public JumpState jumpState = JumpState.Grounded; private bool stopJump; /*internal new*/ public Collider2D collider2d; public Health health; public bool controlEnabled = true; bool jump; Vector2 move; SpriteRenderer spriteRenderer; internal Animator animator; public Bounds Bounds => collider2d.bounds; // Start is called before the first frame update void Awake() { health = GetComponent(); collider2d = GetComponent(); spriteRenderer = GetComponent(); animator = GetComponent(); } // Update is called once per frame protected override void Update() { if (controlEnabled) { move.x = Input.GetAxis("Horizontal"); if (jumpState == JumpState.Grounded && Input.GetButtonDown("Jump")) jumpState = JumpState.PrepareToJump; else if (Input.GetButtonUp("Jump")) { stopJump = true; } } else { move.x = 0; } UpdateJumpState(); base.Update(); } void UpdateJumpState() { jump = false; switch (jumpState) { case JumpState.PrepareToJump: jumpState = JumpState.Jumping; jump = true; stopJump = false; break; case JumpState.Jumping: if (!IsGrounded) { jumpState = JumpState.InFlight; } break; case JumpState.InFlight: if (IsGrounded) { jumpState = JumpState.Landed; } break; case JumpState.Landed: jumpState = JumpState.Grounded; break; } } protected override void ComputeVelocity() { if (jump && IsGrounded) { velocity.y = jumpTakeOffSpeed; jump = false; } else if (stopJump) { stopJump = false; if (velocity.y > 0) { //velocity.y = velocity.y; } } if (move.x > 0.01f) spriteRenderer.flipX = false; else if (move.x < -0.01f) spriteRenderer.flipX = true; animator.SetBool("grounded", IsGrounded); animator.SetFloat("velocityX", Mathf.Abs(velocity.x) / maxSpeed); animator.SetFloat("velocityY", velocity.y); targetVelocity = move * maxSpeed; } public enum JumpState { Grounded, PrepareToJump, Jumping, InFlight, Landed } } }