LOL을 기준으로 애니메이션 평타 캔슬 적용하기
참고 : https://blog.naver.com/roo4803/220827932868
공격버튼 클릭시
1. 플레이어가 공격 애니메이션을 실행중이라면 대기
2. 플레이어가 공격 애니메이션을 실행중이 아니라면 공격 상태로 변환
public void Handle(PlayerController playerController)
{
// StopAttack == true 경우만 공격 애니메이션 실행
if(_playerController.StopAttack){
AnimationAttackPlay(GetComponent<Animator>());
}
}
void AnimationAttackPlay(Animator anim)
{
_playerController.StopAttack = false;
Defines.PlayerJob job = _playerController.Stat.Job;
if (job == Defines.PlayerJob.Warrior)
{
anim.Play("WarriorATTACK");
Managers.Sound.Play("Player/WarriorAttack", Defines.Sound.Effect);
}
else if (job == Defines.PlayerJob.Thief)
{
anim.Play("ThiefATTACK");
Managers.Sound.Play("Player/ThiefAttack", Defines.Sound.Effect);
}
}
공격 상태로 변환 후 공격 애니메이션 진입
1. 공격 애니메이션 준비 동작

2. 공격 애니메이션 타격 동작
타격 동작 애니메이션 지점이 실행되어야지 몬스터에게 대미지가 가해질 수 있다.
투사체 공격의 경우 이 지점에서 투사체가 날아가게 된다.
만약, 타격 동작 애니메이션 실행 이전에 플레이어가 다른 상태(이동, 스킬)로 전환을 하면 타격 동작 애니메이션이 실행되지 않기 때문에 몬스터에게 대미지가 가해지지 않거나 투사체가 날라가지 않는다.

3. 공격 애니메이션 종료 지점
공격 애니메이션이 처음부터 끝까지 정상적으로 실행된 경우에만 마지막 종료 시점에서 플레이어를 wait(멈춤) 상태로 전환시킨다.

공격 애니메이션이 실행중 다른 애니메이션으로 전환되는 경우 문제 발생

A 애니메이션이 종료되었을 때 flag를 변경해서 다시 A 애니메이션을 실행할 수 있도록 구현하였음
여기서 문제상황은 A 애니메이션이 실행되는 동안 다른 애니메이션으로 전환이 일어나면 A 애니메이션 종료 시점의 flag를 실행하지 못하기 때문에 A 애니메이션을 재실행 하지 못하는 문제가 발생한다.
고정적인 프레임에서 해당 애니메이션으로 전환이 무조건 발생한다면 그 프레임에 flag를 넣어주면 되지만, 다른 애니메이션으로 전환되는 시점을 정확하게 파악이 불가능할때 어떻게 flag를 넣어줄 수 있을까?

public class StateMachine : StateMachineBehaviour
{
// 똑같은 애니메이션이 계속 반복적으로 호출되는 경우는 실행되지 않음
// A 애니메이션 실행후 -> B 애니메이션으로 전환되는 경우만 실행됨
public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
if (stateInfo.IsName("WarriorATTACK") || stateInfo.IsName("ThiefATTACK"))
{
animator.gameObject.GetComponent<PlayerController>().StopAttack = true;
}
}
}


유니티에서 제공하는 "상태 머신 동작"의 OnStateExit 함수를 사용해서 공격 애니메이션이 다른 애니메이션으로 전환되는 경우를 캐치하도록 하였다.
참고 : https://unialgames.tistory.com/entry/Unity-State-Machine-Behaviour
'게임개발 > 유니티 엔진' 카테고리의 다른 글
투사체 사정거리 계산 (1) | 2024.04.28 |
---|---|
3D 게임 오브젝트 클릭 or 터치시 UI 띄우기 (0) | 2024.04.24 |
모바일 가상 조이스틱 구현 (0) | 2024.04.20 |
몬스터 반경 내의 플레이어 감지 (0) | 2024.04.03 |
GameObject.AddComponent("스크립트") start 메서드 실행 문제점 (0) | 2024.03.26 |