diff --git a/Assets/02_Scripts/Combat/ComboNode.cs b/Assets/02_Scripts/Combat/ComboNode.cs index 64b346f..7dd1b8d 100644 --- a/Assets/02_Scripts/Combat/ComboNode.cs +++ b/Assets/02_Scripts/Combat/ComboNode.cs @@ -36,8 +36,9 @@ public class ComboTransition } // 공격 방향. 방향키 입력에 따라 같은 노드라도 다른 액션을 낼 수 있다. -// Neutral = 방향키 없음(제자리) / Forward = 바라보는 방향 / Back = 반대 방향 -// Up = 위 입력 / Down = 아래 입력 +// Neutral = 방향키 없음(제자리) / Up = 위 입력 / Down = 아래 입력 +// Forward = 좌우 입력 — 누른 쪽으로 페이싱을 돌린 뒤 공격하므로 항상 Forward. +// Back = 현재 입력 방식(좌우=전환)에서는 발생하지 않음. 직렬화 호환 위해 값 유지. // 대각선 입력은 위/아래를 우선한다 (PlayerController.GetAttackDirection 참고). public enum AttackDirection { diff --git a/Assets/02_Scripts/Player/PlayerController.cs b/Assets/02_Scripts/Player/PlayerController.cs index 8f2d244..adf7cf5 100644 --- a/Assets/02_Scripts/Player/PlayerController.cs +++ b/Assets/02_Scripts/Player/PlayerController.cs @@ -272,9 +272,16 @@ private void ExecuteBufferedInputIfReady() if (_attackCooldownTimer > 0f || !_pendingInput.HasValue) return; ComboInputType buffered = _pendingInput.Value; - bool stillValid = Time.time - _pendingInputTime <= _bufferLifetime; + bool expired = Time.time - _pendingInputTime > _bufferLifetime; + + // 진행 중인 공격을 "콤보 연계 없이" 캔슬하는 입력이면 아직 발화하지 않고, + // 그 공격이 끝날 때까지 버퍼에 남겨둔다 (마지막 공격 등이 캔슬되지 않게). + // 단, 수명이 지난 입력은 폐기. + if (!expired && _isAttackActive && !CanTransitionFromCurrentNode(buffered)) + return; + _pendingInput = null; - if (stillValid) + if (!expired) ExecuteComboInput(buffered); } @@ -350,10 +357,15 @@ private void OnGrabSmashInput() // 3) 그 외에는 즉시 ExecuteComboInput으로 발화 private void HandleComboInput(ComboInputType input) { - if (_isMotionActive && !CanTransitionFromCurrentNode(input)) + // 콤보 연계(현재 노드의 트랜지션) 가능 여부 — 연계는 애니메이션 중에도 즉시 캔슬-체인. + bool canChain = CanTransitionFromCurrentNode(input); + + if (_isMotionActive && !canChain) return; - if (_attackCooldownTimer > 0f) + // 쿨다운 중이거나, 진행 중인 공격을 "콤보 연계 없이" 끊으려는 입력이면 버퍼링. + // (마지막 공격처럼 다음 콤보가 없는 입력이 애니메이션을 캔슬하던 문제 방지) + if (_attackCooldownTimer > 0f || (_isAttackActive && !canChain)) { float elapsed = Time.time - _attackStartTime; // _bufferOpenTime 전엔 너무 일찍 누른 입력으로 간주하고 무시. @@ -370,6 +382,10 @@ private void HandleComboInput(ComboInputType input) private void ExecuteComboInput(ComboInputType input) { + // 좌우 방향키를 누르고 있으면 그쪽으로 페이싱 전환 후 공격. + // (콤보 중 facing이 잠겨 있어도 다음 콤보는 누른 방향으로 나간다.) + UpdateFacingFromMoveInput(); + // 콤보 입력 가능 시간이 열려 있으면 현재 노드에서 다음 연계로 이어간다. if (_comboWindowTimer > 0f && _currentNode != null) { @@ -412,16 +428,14 @@ private void ExecuteComboInput(ComboInputType input) } // 현재 방향키 입력을 공격 방향(AttackDirection)으로 변환. + // 좌우 입력은 ExecuteComboInput에서 누른 쪽으로 페이싱을 돌리므로 항상 Forward. // 대각선 입력은 위/아래를 우선한다 (점프 견제·다운 어택을 우선). - // 좌우는 페이싱 기준으로 Forward(앞)/Back(뒤)로 구분. private AttackDirection GetAttackDirection() { if (_moveInputY > 0f) return AttackDirection.Up; if (_moveInputY < 0f) return AttackDirection.Down; - if (_moveInputX == 0f) return AttackDirection.Neutral; - - float facing = _spriteRenderer != null && _spriteRenderer.flipX ? -1f : 1f; - return Mathf.Sign(_moveInputX) == facing ? AttackDirection.Forward : AttackDirection.Back; + if (_moveInputX != 0f) return AttackDirection.Forward; + return AttackDirection.Neutral; } // 노드의 방향별 변형 중 현재 입력 방향과 일치하는 액션을 선택. diff --git a/Assets/05_Data/Attack/SwordAttackA.asset b/Assets/05_Data/Attack/SwordAttackA.asset new file mode 100644 index 0000000..fc10aef --- /dev/null +++ b/Assets/05_Data/Attack/SwordAttackA.asset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c294e6d51699e4f316cc1e4ece2e22fb37ecd63ffffa4ced9b03849572e21cbc +size 3184 diff --git a/Assets/05_Data/Attack/SwordAttackA.asset.meta b/Assets/05_Data/Attack/SwordAttackA.asset.meta new file mode 100644 index 0000000..1481ffb --- /dev/null +++ b/Assets/05_Data/Attack/SwordAttackA.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9568c042d8afb92489e171221fd3c5f1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/05_Data/Attack/SwordAttackC.asset b/Assets/05_Data/Attack/SwordAttackC.asset new file mode 100644 index 0000000..8ebc0d9 --- /dev/null +++ b/Assets/05_Data/Attack/SwordAttackC.asset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f24cb93a1ce054c32a250b331cf805f6465f990202758da6d64a46c9a60c777 +size 3184 diff --git a/Assets/05_Data/Attack/SwordAttackC.asset.meta b/Assets/05_Data/Attack/SwordAttackC.asset.meta new file mode 100644 index 0000000..0743faa --- /dev/null +++ b/Assets/05_Data/Attack/SwordAttackC.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 75f96bb80e3b29644b18bb27371a566e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/05_Data/Attack/SwordAttackD.asset b/Assets/05_Data/Attack/SwordAttackD.asset new file mode 100644 index 0000000..ecdf13e --- /dev/null +++ b/Assets/05_Data/Attack/SwordAttackD.asset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ac92aee76ec5ba3bd1146da2b1728efa7a6bcc4af029f11a8c0c7beecc30c05 +size 3184 diff --git a/Assets/05_Data/Attack/SwordAttackD.asset.meta b/Assets/05_Data/Attack/SwordAttackD.asset.meta new file mode 100644 index 0000000..60e7778 --- /dev/null +++ b/Assets/05_Data/Attack/SwordAttackD.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 11114a385042cc144bb6e4acbe7a8e4e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/05_Data/Combo/Combo_SwordAttack.asset b/Assets/05_Data/Combo/Combo_SwordAttack.asset index 537831b..358d207 100644 --- a/Assets/05_Data/Combo/Combo_SwordAttack.asset +++ b/Assets/05_Data/Combo/Combo_SwordAttack.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2fbcd18bf41099c170e5020a5a1af9595be3d5e0fd2afe1635ec91fa0a307c98 -size 577 +oid sha256:5c74079799ad8d8018b9bf8b82ba6495b32123e6341d8eafe663b7301e0e6ae4 +size 741 diff --git a/Assets/05_Data/Combo/Combo_SwordAttackA.asset b/Assets/05_Data/Combo/Combo_SwordAttackA.asset new file mode 100644 index 0000000..ba1b6d2 --- /dev/null +++ b/Assets/05_Data/Combo/Combo_SwordAttackA.asset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29a40fabbb6f39bcec31d9a83c9bcd22f590478e51785a3957d9ea9941997d36 +size 743 diff --git a/Assets/05_Data/Combo/Combo_SwordAttackA.asset.meta b/Assets/05_Data/Combo/Combo_SwordAttackA.asset.meta new file mode 100644 index 0000000..0a29c27 --- /dev/null +++ b/Assets/05_Data/Combo/Combo_SwordAttackA.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b12b5c14d1123094dac17bd16ce49870 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/05_Data/Combo/Combo_SwordAttackB.asset b/Assets/05_Data/Combo/Combo_SwordAttackB.asset index b68cb48..0ab6fec 100644 --- a/Assets/05_Data/Combo/Combo_SwordAttackB.asset +++ b/Assets/05_Data/Combo/Combo_SwordAttackB.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ac84d90db692e039b63bfcf538e564590c888214956e531ba79e9e94297a0ed -size 605 +oid sha256:e92bf7da84fd1d01c032946ac8293595df88b45089b53b6ffa96d588d70d7754 +size 743 diff --git a/Assets/05_Data/Combo/Combo_SwordAttackC.asset b/Assets/05_Data/Combo/Combo_SwordAttackC.asset new file mode 100644 index 0000000..6a228a9 --- /dev/null +++ b/Assets/05_Data/Combo/Combo_SwordAttackC.asset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b962a55224ef10b14e3a75f704d81843a4439c58440f83403e55aae1590dc674 +size 747 diff --git a/Assets/05_Data/Combo/Combo_SwordAttackC.asset.meta b/Assets/05_Data/Combo/Combo_SwordAttackC.asset.meta new file mode 100644 index 0000000..bb26da0 --- /dev/null +++ b/Assets/05_Data/Combo/Combo_SwordAttackC.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2c71093410e49d3448ccb17919f8120a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/05_Data/Combo/Combo_SwordAttackD.asset b/Assets/05_Data/Combo/Combo_SwordAttackD.asset new file mode 100644 index 0000000..c6e242e --- /dev/null +++ b/Assets/05_Data/Combo/Combo_SwordAttackD.asset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a16b30ba0b24a6414bd257d971c72c64f38e0ceb721efbf6ece60ed28b3dcdd +size 605 diff --git a/Assets/05_Data/Combo/Combo_SwordAttackD.asset.meta b/Assets/05_Data/Combo/Combo_SwordAttackD.asset.meta new file mode 100644 index 0000000..bee455b --- /dev/null +++ b/Assets/05_Data/Combo/Combo_SwordAttackD.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 92f806cd5d5db3c4cab5f5dd815b2620 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: