2026-05-21 이동사격 구현

This commit is contained in:
2026-05-21 10:11:15 +09:00
parent 6c9f31f654
commit 7d87b6e007
15 changed files with 77 additions and 12 deletions

View File

@@ -20,6 +20,8 @@ public class PlayerController : MonoBehaviour,IDamageable
[Header("Movement")]
[SerializeField] private float _moveSpeed = 5f; // 이동 속도 (units/sec)
[SerializeField] private string _walkAnimationState = "Run"; // 걷기/달리기 애니메이션 State 이름
[SerializeField] private float _backpedalSpeed = 3f; // 백페달(Down+좌우) 이동 속도 — 보통 _moveSpeed보다 느리게
[SerializeField] private string _backpedalAnimationState = "BackWalk"; // 백페달 시 재생할 애니메이션 (뒤로 걷기)
private float _moveInputX = 0f; // 현재 X 입력값 (-1/0/1)
private float _moveInputY = 0f; // 현재 Y 입력값 (-1/0/1) — 위/아래 방향 공격 판정용
private string _activeBaseState; // 현재 재생 중인 locomotion State (중복 Play 방지용)
@@ -252,7 +254,11 @@ private void FixedUpdate()
// 입력 잠금이 없고, (액션 중이 아니거나 액션이 이동을 허용할 때) 좌우 입력으로 velocity 갱신.
if (!IsMovementLocked() && (!IsActionActive() || _actionAllowsMovement))
_rb.linearVelocity = new Vector2(_moveInputX * _moveSpeed, _rb.linearVelocity.y);
{
// 백페달이면 느린 속도. 액션 중에도 동일하게 적용 (이동사격 = Down 변형 + CanMoveDuringAction).
float moveSpeed = IsBackpedaling() ? _backpedalSpeed : _moveSpeed;
_rb.linearVelocity = new Vector2(_moveInputX * moveSpeed, _rb.linearVelocity.y);
}
if (!IsFacingLocked() && (!IsActionActive() || _actionAllowsTurn))
UpdateFacingFromMoveInput();
@@ -306,12 +312,23 @@ private void OnMoveInput(Vector2 value)
}
// SpriteRenderer.flipX로 좌우 반전 (transform.localScale이 아닌 이유: 자식 콜라이더 위치가 따라 뒤집히면 곤란).
// Down(아래) 키를 누르고 있으면 페이싱을 고정 — 백페달에서 뒤로 가면서 정면을 유지하는 핵심 규칙.
// 이 함수가 페이싱 전환의 단일 통로라, 여기만 막으면 locomotion·콤보 입력 전부에 적용된다.
private void UpdateFacingFromMoveInput()
{
if (_moveInputY < 0f) return;
if (_moveInputX != 0f && _spriteRenderer != null)
_spriteRenderer.flipX = _moveInputX < 0f;
}
// Down + 좌우를 함께 누른 상태 = 백페달.
// 페이싱 고정(UpdateFacingFromMoveInput) + 느린 이동(_backpedalSpeed) + 전용 애니메이션.
private bool IsBackpedaling()
{
return _moveInputY < 0f && _moveInputX != 0f;
}
// 점프 우선순위: 지상 점프 > 공중(2단) 점프
private void OnJumpInput()
{
@@ -1067,6 +1084,13 @@ private string ChooseLocomotionState()
string idle = equipped != null && !string.IsNullOrEmpty(equipped.IdleAnimationState)
? equipped.IdleAnimationState
: _idleAnimationState;
string backpedal = equipped != null && !string.IsNullOrEmpty(equipped.BackpedalAnimationState)
? equipped.BackpedalAnimationState
: _backpedalAnimationState;
// 백페달(Down+좌우)이면 전용 애니메이션 — 뒤로 걷는 모션 (공격 중이 아닐 때만 표시).
if (IsBackpedaling() && !string.IsNullOrEmpty(backpedal))
return backpedal;
if (_moveInputX != 0f && !string.IsNullOrEmpty(walk))
return walk;