Unity

Linecast 를 활용한 문제 해결 사례

ckhyeok 2019. 11. 18. 14:55

문제.

유저를 추적해서 공격을 하는 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를 완성시켜 기존의 문제를 해결했습니다..