2014. 10. 5.

유니티 Raycast() 란 무엇인가?

Raycast는 직역하면, 광선을 쏜다라는 뜻입니다. Raycast가 필요한 상황을 3D 탱크 게임을 예로 들어 설명하겠습니다. 

3D 탱크 게임을 만들기 위해 맵을 만들고, 중간 중간 벽들을 세워 놓았습니다. 그리고, 플레이어 탱크와 적 탱크를 생성하였습니다. 이제 적 탱크의 인공지능을 만들어야 합니다. 우리가 원하는건 적 탱크가 플레이어 탱크가 일정 범위 이내로 들어왔을때 포탄을 쏘는 것입니다. 그런데, 플레이어 탱크와 적 탱크 사이에 벽이 가로막고 있어 포탄이 막혀버리는 상황이라면, 적 탱크는 플레이어 탱크가 벽에서 빠져나올 때까지 조준만 한 채 포탄을 쏘지 않고 기다려야 합니다.

이런 상황에서 필요한 것이 Raycast입니다. 미리 광선을 쏴 지정된 방향과 거리 이내에 부딪히는 오브젝트가 있는지를 판단해 boolean 값으로 알려줍니다.
위의 그림을 보면, 플레이어가 총을 쏘는데 Raycast를 통해 미리 총을 쏘면, 어디에 맞는지를 알 수 가 있습니다. Raycast를 쓸 때, RaycastHit 매개변수를 넣으면 Raycast에 맞은 오브젝트의 정보도 가져오는데, 이것을 활용하여 맞는 물체가 적일때만 포탄이나 총을 쏘게 하는 식으로 구현을 합니다.
void Update ()
{
  if (detectPlayerTank) {
    turret.LookAt (targetTank);
    if (Physics.Raycast (firePoint.transform.position, firePoint.transform.forward, out hit, 30.0F)) {      
      if (hit.collider.tag == "Player Tank") {
        fireBullet ();
      }
    }
  }
}
위의 코드는 적군 탱크 입장에서 플레이어 탱크가 일정 범위 내에 들어왔을 때, detectPlayerTank 값을 true로 바꾼 후, 진행되는 Update() 구현부입니다.

Update에서는 적 탱크의 포탑이 플레이어 탱크를 바라보게 한 후, Raycast를 쏴 받아온 RaycastHit 오브젝트의 태그를 비교해 그 값이 "Player Tank"일 때만 포탄을 쏘도록 구현된 내용입니다.

댓글 3개:

  1. 개념잡는데 도움이 많이 됐어요! 제 블로그에 링크담아가겠습니다 ><

    답글삭제
  2. 감사합니다 블로그에좀 담아가겠습니다.

    답글삭제