From 239c66af5bb299e22218bf74ab782ab945bbf298 Mon Sep 17 00:00:00 2001 From: "DESKTOP-VVOCIJO\\PC" Date: Mon, 18 May 2026 15:24:47 +0900 Subject: [PATCH] =?UTF-8?q?2026-05-18=20=EC=9D=B4=EB=8F=99=20=EC=95=A0?= =?UTF-8?q?=EB=8B=88=EB=A9=94=EC=9D=B4=EC=85=98,=20=EC=A0=90=ED=94=84=20?= =?UTF-8?q?=EC=95=A0=EB=8B=88=EB=A9=94=EC=9D=B4=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/01_Scenes/GameScene.unity | 4 +- Assets/02_Scripts/Combat/ComboNode.cs | 1 + Assets/02_Scripts/Player/PlayerController.cs | 85 ++++++++++++++++--- .../WhiteMan/Animations/JumpRise.anim | 2 +- Assets/05_Data/Combo/Combo_Kick_A.asset | 4 +- Assets/05_Data/Combo/Combo_Kick_B.asset | 4 +- Assets/05_Data/Combo/Combo_Punch_A.asset | 4 +- Assets/05_Data/Combo/Combo_Punch_B.asset | 4 +- Assets/05_Data/Combo/Combo_Punch_C.asset | 4 +- Assets/05_Data/Motion/BackDash.asset | 4 +- 10 files changed, 88 insertions(+), 28 deletions(-) diff --git a/Assets/01_Scenes/GameScene.unity b/Assets/01_Scenes/GameScene.unity index c818816..39ca18f 100644 --- a/Assets/01_Scenes/GameScene.unity +++ b/Assets/01_Scenes/GameScene.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6ab3de3510ee7344cd93232b2d75034babd912117045b9a1eafa81030f312d38 -size 52364 +oid sha256:c4cc99d07b6c5fb4d3458f077f8860975ea99044e1a24f864f0e4d11e3dadde2 +size 52391 diff --git a/Assets/02_Scripts/Combat/ComboNode.cs b/Assets/02_Scripts/Combat/ComboNode.cs index ad3caaa..11cd644 100644 --- a/Assets/02_Scripts/Combat/ComboNode.cs +++ b/Assets/02_Scripts/Combat/ComboNode.cs @@ -6,6 +6,7 @@ public enum ComboInputType { Punch, Kick, + Grab, Motion } diff --git a/Assets/02_Scripts/Player/PlayerController.cs b/Assets/02_Scripts/Player/PlayerController.cs index f534369..2f4f059 100644 --- a/Assets/02_Scripts/Player/PlayerController.cs +++ b/Assets/02_Scripts/Player/PlayerController.cs @@ -6,7 +6,20 @@ public class PlayerController : MonoBehaviour { [Header("Movement")] [SerializeField] private float _moveSpeed = 5f; + [SerializeField] private string _walkAnimationState = "Walk"; private float _moveInputX = 0f; + private string _activeBaseState; + private bool _isInActionAnimation; + + [Header("Jump Animation")] + [SerializeField] private string _jumpRiseAnimationState = "JumpRise"; + [SerializeField] private string _jumpMidAnimationState = "JumpMid"; + [SerializeField] private string _jumpFallAnimationState = "JumpFall"; + [SerializeField] private string _landAnimationState = "Land"; + [SerializeField] private float _jumpMidThreshold = 2f; + [SerializeField] private float _landAnimationDuration = 0.15f; + private bool _wasGroundedLastFrame = true; + private float _landTimer; [Header("Jump")] [SerializeField] private float _jumpForce = 8f; @@ -153,6 +166,8 @@ private void FixedUpdate() // 플레이어와 적 몸체는 물리 충돌하지 않고, 땅/벽만 캐스트로 이동을 막는다. ClampVelocityToGround(); + + UpdateLocomotionAnimation(); } private void ExecuteBufferedInputIfReady() @@ -203,10 +218,11 @@ private void OnJumpInput() private void OnPunchInput() => HandleComboInput(ComboInputType.Punch); private void OnKickInput() => HandleComboInput(ComboInputType.Kick); + private void OnGrabSmashInput() => HandleComboInput(ComboInputType.Grab); private void OnDashInput() => ExecuteMotionNode(_dashRootNode); private void OnRollInput() => ExecuteMotionNode(_rollRootNode); private void OnBackDashInput() => ExecuteMotionNode(_backDashRootNode); - private void OnGrabSmashInput() => ExecuteAttackNode(_grabSmashRootNode); + private void HandleComboInput(ComboInputType input) { @@ -250,6 +266,7 @@ private void ExecuteComboInput(ComboInputType input) { ComboInputType.Punch => _punchRootNode, ComboInputType.Kick => _kickRootNode, + ComboInputType.Grab => _grabSmashRootNode, _ => null }; if (root == null || root.Action == null) return; @@ -269,16 +286,6 @@ private void ExecuteMotionNode(ComboNode root) _comboWindowTimer = root.ComboWindow; } - private void ExecuteAttackNode(ComboNode root) - { - if (root == null || root.Action == null) return; - if (_attackCooldownTimer > 0f) return; - - PerformAttack(root.Action); - _currentNode = root; - _comboWindowTimer = root.ComboWindow; - } - private void UpdateMotionCooldowns() { if (_motionCooldownTimers.Count == 0) return; @@ -638,8 +645,58 @@ private void PlayIdleAnimation() CancelAndDispose(ref _animationSpeedCts); CancelAndDispose(ref _actionVelocityCts); _anim.speed = 1f; - if (!string.IsNullOrEmpty(_idleAnimationState)) - _anim.Play(_idleAnimationState); + _isInActionAnimation = false; + _activeBaseState = null; + PlayLocomotionState(); + } + + private void PlayLocomotionState() + { + if (_anim == null) return; + + string desired = ChooseLocomotionState(); + if (string.IsNullOrEmpty(desired)) return; + if (desired == _activeBaseState) return; + + _anim.Play(desired); + _activeBaseState = desired; + } + + private string ChooseLocomotionState() + { + if (_landTimer > 0f && !string.IsNullOrEmpty(_landAnimationState)) + return _landAnimationState; + + float vy = _rb.linearVelocity.y; + bool inAir = !_isGrounded || vy > _jumpMidThreshold; + if (inAir) + { + if (vy > _jumpMidThreshold && !string.IsNullOrEmpty(_jumpRiseAnimationState)) + return _jumpRiseAnimationState; + if (vy < -_jumpMidThreshold && !string.IsNullOrEmpty(_jumpFallAnimationState)) + return _jumpFallAnimationState; + if (!string.IsNullOrEmpty(_jumpMidAnimationState)) + return _jumpMidAnimationState; + } + + if (_moveInputX != 0f && !string.IsNullOrEmpty(_walkAnimationState)) + return _walkAnimationState; + + return _idleAnimationState; + } + + private void UpdateLocomotionAnimation() + { + if (_isInActionAnimation) return; + + if (_isGrounded && !_wasGroundedLastFrame && !string.IsNullOrEmpty(_landAnimationState)) + _landTimer = _landAnimationDuration; + _wasGroundedLastFrame = _isGrounded; + + if (_landTimer > 0f) + _landTimer -= Time.fixedDeltaTime; + + PlayLocomotionState(); } private void PlayActionAnimation(ActionData data) @@ -654,6 +711,8 @@ private void PlayActionAnimation(ActionData data) { _anim.Play(data.AnimationState); _anim.Update(0f); + _isInActionAnimation = true; + _activeBaseState = null; } ApplyAnimationSpeedCurve(data, _animationSpeedCts.Token); diff --git a/Assets/03_Character/WhiteMan/Animations/JumpRise.anim b/Assets/03_Character/WhiteMan/Animations/JumpRise.anim index cc28347..62854b4 100644 --- a/Assets/03_Character/WhiteMan/Animations/JumpRise.anim +++ b/Assets/03_Character/WhiteMan/Animations/JumpRise.anim @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:71b4de16809faa7c77b2f7c47ea99c44cba21eae576fde6273091a6694fe4a59 +oid sha256:ddab94849cb0983f756d9a4568623d4bc35c24acdb12a7cf6b652ed7749659ae size 1792 diff --git a/Assets/05_Data/Combo/Combo_Kick_A.asset b/Assets/05_Data/Combo/Combo_Kick_A.asset index 8b3a4d5..533be8f 100644 --- a/Assets/05_Data/Combo/Combo_Kick_A.asset +++ b/Assets/05_Data/Combo/Combo_Kick_A.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0696ba9d04427b140caa19122c76b971abcdc62d29fcf5dcdb97506e83d6f194 -size 705 +oid sha256:ddb25b6bfe6859b4802f165dc1cce00903231fd61835e1f77f711d0e19879b58 +size 846 diff --git a/Assets/05_Data/Combo/Combo_Kick_B.asset b/Assets/05_Data/Combo/Combo_Kick_B.asset index 675e185..2d0b560 100644 --- a/Assets/05_Data/Combo/Combo_Kick_B.asset +++ b/Assets/05_Data/Combo/Combo_Kick_B.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d3c19086ed48c7d48c3cb9e2354882ba6ac4677bb57c7785fbe75f3d4977d672 -size 708 +oid sha256:2abfd33512cbad2745f5b8d092b7c0f56b8573ad097c00747de66d8a10abba25 +size 849 diff --git a/Assets/05_Data/Combo/Combo_Punch_A.asset b/Assets/05_Data/Combo/Combo_Punch_A.asset index 7a9ee6a..07211b9 100644 --- a/Assets/05_Data/Combo/Combo_Punch_A.asset +++ b/Assets/05_Data/Combo/Combo_Punch_A.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:61a0ae9dc452434b1327453e7c70d95a5d83fb2df692877e927e3b203b426651 -size 709 +oid sha256:dca1a640af4d81de2449e3d6b49cc5ef0724e21ae0d59f10a02a3e11e17c85b1 +size 850 diff --git a/Assets/05_Data/Combo/Combo_Punch_B.asset b/Assets/05_Data/Combo/Combo_Punch_B.asset index e44f598..d4f7fc1 100644 --- a/Assets/05_Data/Combo/Combo_Punch_B.asset +++ b/Assets/05_Data/Combo/Combo_Punch_B.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:76379b7dcebadbf175dd7c593a86ce196244ad0383bddaee1bf2065a1f65bf32 -size 710 +oid sha256:1bfd5a18f9d4e891ae0904d0f54ee986756133450a14643b4424a3a9372eaf8a +size 851 diff --git a/Assets/05_Data/Combo/Combo_Punch_C.asset b/Assets/05_Data/Combo/Combo_Punch_C.asset index 78bc4ac..fbf3256 100644 --- a/Assets/05_Data/Combo/Combo_Punch_C.asset +++ b/Assets/05_Data/Combo/Combo_Punch_C.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c311ab650560ff057a24babdbf6e0b7cee227b7aa97016189245c4ce1c86108e -size 569 +oid sha256:7b7a7e5aca80ef979aa2f291543e37bd28c3496dc66d4b91560d8b452d3c851a +size 707 diff --git a/Assets/05_Data/Motion/BackDash.asset b/Assets/05_Data/Motion/BackDash.asset index ec4cf46..0a33b3a 100644 --- a/Assets/05_Data/Motion/BackDash.asset +++ b/Assets/05_Data/Motion/BackDash.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:66bcf2f16feac662b8eb5473d74634803ef09a8967eb659544f0c67f5623929a -size 3118 +oid sha256:53d039a8a219233e42a7c473ffcc02d1287286d39e0ef0d97756fb36fa389708 +size 4156