코딩의 신 33

김동관·2025년 11월 18일

오늘 한 일

오늘은 자잘한 버그를 수정을 많이 했습니다.

  1. Move Animation이 처음엔 작동되다가 키를 꾹 누르면 animation이 잘 작동 안 되는 현상.

  2. Item과 상호작용 하는 Interact를 만들어 봤지만 안 되는 현상.

트러블 슈팅

  1. Move Animation이 어쩔땐 키가 먹고 어쩔때는 안 먹는 현상
    문제 해결 방향
    ->땅과 부딪힐때 지형이 울퉁불퉁해서 트리거 감지가 잘 안되는지, 캡슐 콜라이더로 해서 잘 작동이 안 되는지 판단.
    but같은 지형이라도 어쩔땐 안 되고 어쩔땐 되는 현상 발생.

다른 문제 해결 방향
->애니메이션을 키고 보니 처음 키값을 누르면 잘 작동이 되지만 그대로 유지하면 애니메이션이 먹지 않는걸 확인함

->걷기(walk) 애니메이션이 Loop 가 체크 안 돼 있어서

처음 1회 재생된 뒤

애니메이션이 끝난 프레임에 멈춰버림
→ 그래서 방향키 꾹 누르면 처음 1회만 걷고 그 뒤로 안 움직이는 것처럼 보임.
✔ Animation Clip 직접 열어서

Inspector → Loop Time 체크
이거 하나만 켜면 무한 반복됨.

트러블 슈팅

먼저 수정전 코드 입니다.
using UnityEngine; public class PlayerAttack : MonoBehaviour 
{ public PlayerCondition playerCondition; public float staminaCost = 10f; public float attackDamage = 10f; public float attackRange = 3f; public LayerMask targetLayer; 
// 몬스터 레이어 넣기 
private void Awake() 
{ if (playerCondition == null) 
playerCondition = GetComponent<PlayerCondition>(); } 
public void TryAttack() 
{ if (playerCondition == null) 
{ Debug.LogWarning("PlayerCondition이 연결되어 있지 않습니다!"); return; } 
// 스태미나 체크 
if (!playerCondition.UseStamina(staminaCost)) 
{ Debug.Log("스태미나 부족으로 공격 불가"); return; } 
// 플레이어 앞 방향으로 Ray 발사
Ray ray = new Ray(transform.position + Vector3.up, transform.forward); RaycastHit hit; 
if (Physics.Raycast(ray, out hit, attackRange, targetLayer)) 
{ IDamagable monster = hit.collider.GetComponent<IDamagable>(); 
if (monster != null) { monster.TakePhysicalDamage(attackDamage); Debug.Log("몬스터 타격!"); } } } } 

->TryAttack()에서 스태미나가 부족하면 로그만 찍고 공격 모션 실행 여부는 컨트롤하지 못하는 상태라 판단. Unity InputSystem에서 onAttack() 같은 콜백을 쓴다면, 스태미나 부족 시 애니메이션 트리거 자체를 막는 코드를 만듦

using UnityEngine;

public class PlayerAttack : MonoBehaviour
{
    public PlayerCondition playerCondition;
    public float staminaCost = 10f;
    public float attackDamage = 10f;
    public float attackRange = 3f;
    public LayerMask targetLayer;

    private Animator animator;

    private void Awake()
    {
        if (playerCondition == null)
            playerCondition = GetComponent<PlayerCondition>();

        animator = GetComponent<Animator>();
        if (animator == null)
            Debug.LogWarning("Animator가 없습니다!");
    }

    // InputSystem onAttack()에서 호출
    public void TryAttack()
    {
        if (playerCondition == null)
        {
            Debug.LogWarning("PlayerCondition이 연결되어 있지 않습니다!");
            return;
        }

        // 스태미나 체크
        if (!playerCondition.UseStamina(staminaCost))
        {
            Debug.Log("스태미나 부족으로 공격 불가");
            return; // 여기서 return -> 공격 모션 실행 안됨
        }

        // 스태미나 충분 -> 공격 모션 실행
        animator.SetTrigger("Attack");

        // 플레이어 앞 방향으로 Ray 발사
        Ray ray = new Ray(transform.position + Vector3.up, transform.forward);
        if (Physics.Raycast(ray, out RaycastHit hit, attackRange, targetLayer))
        {
            IDamagable monster = hit.collider.GetComponent<IDamagable>();
            if (monster != null)
            {
                monster.TakePhysicalDamage(attackDamage);
                Debug.Log("몬스터 타격!");
            }
        }
    }
}

->if (!playerCondition.UseStamina(staminaCost)) return;
→ 스태미나 부족하면 바로 리턴. 애니메이터 트리거 호출 X

Animator는 공격 스태미나 체크 후에만 SetTrigger("Attack") 호출

InputSystem에서 onAttack()는 항상 TryAttack()만 호출하도록 연결.
But 해결이 되지 않음.
Animator 트리거가 Reset 안 됨

Animator의 Attack 트리거가 이전 상태에서 남아있어서 스태미나 부족 상태에서도 공격 모션이 발동할 수 있습니다.

-> 다음 해결 방법
해결: Animator.ResetTrigger("Attack")를 스태미나 부족 시 호출

if (!playerCondition.UseStamina(staminaCost))
{
Debug.Log("스태미나 부족으로 공격 불가");
animator.ResetTrigger("Attack"); // 남은 트리거 초기화
return;
}
animator.SetTrigger("Attack") → 트리거를 걸어 공격 애니메이션 실행

스태미나 부족 시 return만 하면 이전 트리거가 남아있으면 애니메이션 실행 가능

animator.ResetTrigger("Attack") → 남은 트리거를 초기화해서 애니메이션 실행 방지

애니메이션 정상 작동o
스테미나가 없을시에 애니메이션 작동 x

profile
아이디어 뱅크

0개의 댓글