diff --git a/Assets/Scripts/Player/PlayerMove.cs b/Assets/Scripts/Player/PlayerMove.cs index 2a9bbb11..d6682791 100644 --- a/Assets/Scripts/Player/PlayerMove.cs +++ b/Assets/Scripts/Player/PlayerMove.cs @@ -31,6 +31,15 @@ public class PlayerMove : MonoBehaviour RigidBody = GetComponent(); SpriteRenderer = GetComponent(); Animator = GetComponent(); + + // Null 체크 추가 + if (RigidBody == null || SpriteRenderer == null || Animator == null) + { + Debug.LogError("PlayerMove script requires Rigidbody2D, SpriteRenderer, and Animator components on the same GameObject."); + // 게임 오브젝트 비활성화 또는 스크립트 비활성화 + enabled = false; + return; + } // 2. Animator가 초기화된 후에 해시 값 할당 _isJumping = Animator.StringToHash("isJumping"); @@ -68,4 +77,4 @@ public class PlayerMove : MonoBehaviour { // OffDamaged 로직은 DamagedState의 Exit()로 이동 } -} \ No newline at end of file +} diff --git a/Assets/Scripts/Player/StateMachine.cs b/Assets/Scripts/Player/StateMachine.cs index 3792256d..a82f4f76 100644 --- a/Assets/Scripts/Player/StateMachine.cs +++ b/Assets/Scripts/Player/StateMachine.cs @@ -59,8 +59,6 @@ public class IdleState : IState public IdleState(PlayerMove player) { _player = player; - _moveState = new MoveState(_player); - _jumpState = new JumpState(_player); } public void Enter() @@ -85,14 +83,13 @@ public class IdleState : IState public IState CheckTransition() { - // 우선 순위: Jump -> Move if (Input.GetButtonDown("Jump")) { - return _jumpState; + return new JumpState(_player); // Create new JumpState object } - if (Input.GetAxisRaw("Horizontal") != 0) + if (Mathf.Abs(Input.GetAxisRaw("Horizontal")) > 0) { - return _moveState; + return new MoveState(_player); // Create new MoveState object } return this; } @@ -107,8 +104,6 @@ public class MoveState : IState public MoveState(PlayerMove player) { _player = player; - _idleState = new IdleState(_player); - _jumpState = new JumpState(_player); } public void Enter() @@ -119,7 +114,7 @@ public class MoveState : IState public void Update() { // 상태별 로직 - _player.SpriteRenderer.flipX = Input.GetAxisRaw("Horizontal") < 0; + _player.SpriteRenderer.flipX = Input.GetAxisRaw("Horizontal") > 0; } public void FixedUpdate() @@ -147,11 +142,11 @@ public class MoveState : IState { if (Input.GetButtonDown("Jump")) { - return _jumpState; + return new JumpState(_player); // Create new JumpState object } - if (Mathf.Abs(Input.GetAxisRaw("Horizontal")) < 0.1f) // 키 입력이 없을 때 + if (Mathf.Abs(Input.GetAxisRaw("Horizontal")) < 0.1f) { - return _idleState; + return new IdleState(_player); // Create new IdleState object } return this; } @@ -165,7 +160,6 @@ public class JumpState : IState public JumpState(PlayerMove player) { _player = player; - _idleState = new IdleState(_player); } public void Enter() @@ -179,7 +173,7 @@ public class JumpState : IState // 점프 중 스프라이트 방향 변경 if (Input.GetButton("Horizontal")) { - _player.SpriteRenderer.flipX = Input.GetAxisRaw("Horizontal") < 0; + _player.SpriteRenderer.flipX = Input.GetAxisRaw("Horizontal") > 0; } } @@ -195,15 +189,13 @@ public class JumpState : IState public IState CheckTransition() { - // 바닥에 닿았는지 확인 -> IdleState로 전환 if (_player.RigidBody.linearVelocity.y < 0) { - Debug.DrawRay(_player.RigidBody.position, Vector3.down, Color.green); RaycastHit2D rayHit = Physics2D.Raycast(_player.RigidBody.position, Vector3.down, 1, LayerMask.GetMask("Platform")); if (rayHit.collider != null && rayHit.distance < 0.7f) { - return _idleState; + return new IdleState(_player); // Create new IdleState object } } return this;