오늘 한 일
오늘은 자잘한 버그를 수정을 많이 했습니다.
Move Animation이 처음엔 작동되다가 키를 꾹 누르면 animation이 잘 작동 안 되는 현상.
Item과 상호작용 하는 Interact를 만들어 봤지만 안 되는 현상.
트러블 슈팅
다른 문제 해결 방향
->애니메이션을 키고 보니 처음 키값을 누르면 잘 작동이 되지만 그대로 유지하면 애니메이션이 먹지 않는걸 확인함
->걷기(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