
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의 정의가 필요했다.
그리고 이미 동작한 노드에서 Successe를 반환하니 다시 재생되지 않았다. 노드를 체크는 하는데 해당 노드 상태가 Successe가 되니 다시 재생을 하지 않았다.
-> 상단 코드의 _animator.Play(_animationHash, 0, 0); 로 다시 초기화로 해결했다.