[Unity] 몬스터 BT 노드 수정

잘생김·2024년 2월 21일

오늘 까지의 이슈사항

1) 구현을 하다보니 RandomSelector에서 attack 노드가 애니메이션이 끝나기도 전에 변경이돼서 몬스터의 공격구현이 제대로 안 된다.

-> 애니메이션의 끝에서 다음 attack모션이 나오게 해야함.

public class CustomAction : ActionBase
{
    int _animationHash;
    private bool _isEnter;
    Animator _animator;

    public CustomAction(string stateName)
    {
        _animationHash = Animator.StringToHash(stateName);
    }
    protected override void OnInit()
    {
        _animator = Owner.GetComponent<Animator>();
    }


    protected override TaskStatus OnUpdate()
    {
        if (_isEnter == false)
        {
         	_isEnter = true;
          	_animator.Play(_animationHash, 0, 0);
	
         	return TaskStatus.Continue;
       	}
        
        if (_animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1f)
       	{
            return true;
            _isEnter = false;

            return TaskStatus.Success;
        }

        return TaskStatus.Continue;
    }
}

GetCurrentAnimatorStateInfo(0) - 현재 재생되는 애니메이션 state
.normalizedTime - 0부터 1까지 시간 정규화

애니메이션 동작 완료시 1f를 주면 해당 state는 Success를 반환해서 완료 상태가된다. 이것으로 애니메이션이 완료되기 전 다음 동작으로 넘어가는 것을 방지한다.

2) 새로 짠 BT구조에서 RandomSelector는 하위노드의 개수회수로만 렌덤으로 돌고 동작이 안 되었다.

노드는 애니메이션 구현이 주가 되므로 Nodestate의 정의가 필요했다.

  • Continue : 애니메이션 재생 동안
  • Successe : 애니메이션 재생 완료
  • Failure : 조건 불충족

그리고 이미 동작한 노드에서 Successe를 반환하니 다시 재생되지 않았다. 노드를 체크는 하는데 해당 노드 상태가 Successe가 되니 다시 재생을 하지 않았다.

-> 상단 코드의 _animator.Play(_animationHash, 0, 0); 로 다시 초기화로 해결했다.

profile
비전공자가 개발자로 취업하기 위해

0개의 댓글