문제.
유저를 추적해서 공격을 하는 AI가 있습니다.
이 AI는 유저를 공격 할 때 그 공격경로에 오브젝트가 있으면 오브젝트를 피한 뒤 공격을 해야합니다.
하지만 유저와 AI의 위치 값으로만 공격을 설정하다보니 아래 사진과 같은 문제가 발생하였습니다.
이 문제를 해결하기 위한 방법을 모색하다가 Physics의 Cast들을 보다는 LineCast를 사용하기로 했습니다.
해결방법
if(Phycis.Linecast(TransH, playerTrans, out hitInfo, 1<LayerMask.NameToLayer("Wall")))
{
_manager.isWall= true;
_manager.isPlayer = false;
_manager.SetState(FW02State.CHASE);
return;
}
위와 같이 LineCast를 현재 내 위치와 유저의 위치를 계산해서 그 거리 상에 Wall이라는 오브젝트가 있다면
몬스터의 상태를 추적 상태로 보내주어 공격 할 수 있는 위치를 찾게 만들어 줍니다.
if(_manager.isWall)
{
if(Physics.Linecast(TransH, playerAttackTrans, out hitInfo, 1<<LayerMask.NameToLayer("Player")))
_manager.isPlayer = true;
}
LineCast를 쏴서 벽에 안닿았고 유저에게 닿았다면 isPlayer를 True로 돌려주며
if(_manager.isPlayer)
{
if(Vector3.Distance(playerTrans, transform.position) < AttackDistance)
{
_manager.SetState(FW02State.ATTACK);
return;
}
}
isPlayer가 True이면서 유저가 공격 사거리 안에 있다면 공격을 하게 됩니다.
그 결과
스스로 공격할 수 있는지 없는지를 판별한 후 공격하는 AI를 완성시켜 기존의 문제를 해결했습니다..
'Unity' 카테고리의 다른 글
NGUI TweenScale(UITweener.cs)의 Reset과 Play (0) | 2021.01.19 |
---|---|
유니티 메뉴창에 원하는 메뉴 띄우는 법(MenuItem) (0) | 2021.01.15 |
A*를 활용한 문제 해결 사례 (0) | 2019.11.25 |
Unity 물체 이동 방법 (1) | 2019.11.04 |
Unity Preview Camera 만들기. (0) | 2019.10.28 |