[Unity] TPS의 조준점 처리

TPS와 같이 조준 원점과 발사 원점이 다른 게임에서 타격판정과 시각효과를 일치시키기 

탑뷰 시점의 슈팅게임이나 쿼터뷰시점을 이용하는 RPG등의 경우 시점과 조준점을 일치시킬 필요가 없는 게임에서는 상관없는 이야기지만, 
라스트 오브 어스나 기어스 오브 워, 바이오하자드와 같이 게임의 시점이 숄더백시점인 TPS의 경우에는 
플레이어를 비추는 카메라가 바라보는 원점이 적을 타격하기 위한 조준 원점이 되므로 게임상의 효과와 타격판정을 일치시켜줘야 이질감이 없다.
특히 직선으로 날아가는 총알의 괴적을 그려내야 하는 경우, 플레이어가 원하는 위치에 타격하고있다는 점을 시각적으로 보여줄 필요가 있으므로 중요하다.

이러한 처리의 조준 및 타격판정은 카메라시점이 기준이 되어 작동하고 
캐릭터는 단순히 애니메이션과 이팩트로 시각효과만 처리한다.
(물론 한 루프사이클에서 사용자의 시점에서 타깃 정보를 얻어낸 뒤에 캐릭터의 무기에서 
별도로 레이캐스팅을 하거나 총알과같은 오브젝트풀을 발사해서 타격판정을 얻어낼 수도 있다)  

아래의 이미지는 숄더백 시점으로만든 게임의 플레이화면과 신 화면이며, 신 화면에서 녹색의 레이는 카메라의 시점이고 하늘색 레이는 
총알이 발사되는 원점에서 바라보는 레이다. 
두 레이는 화면 중앙에서 조준하고있는 적의 한 지점에서 교차한다. 

이를 구현하기 위해서 다음과 같은 순서를 따른다. 
  1. 카메라가 바라보는 백터가 조준점이 되며, 카메라가 바라보는 방향으로 충돌검출을 위해 physics.raycast를 이용하여 조준점에서 충돌이 발생하는지 확인한다.
  2. 충돌이 발생하면 충돌이 발생한 위치(RaycastHit.collider.point)를 얻어내고 총알이 발사되는 리스폰 포인트가 이 위치를 바라보도록 만든다(Transform.LookAt()을 이용한다)
  3. 총알이 바라보는 방향을 기준으로 총알의 괴적과 같은 이팩트(프로젝타일방식의 경우 instantiate를 이용해서 총알을 발사)를 구현한다.

샘플코드는 아래와 같다 

void Update() {
   ...

 Debug.DrawRay(thirdCamPos.position, thirdCamPos.forward * 200.0f, Color.green);

        RaycastHit temp; 

        if(Physics.Raycast (thirdCamPos.position, thirdCamPos.forward, out temp, 200.0f)) // 카메라의 위치에서 카메라가 바라보는 정면으로 레이를 쏴서 충돌확인
        {
     // 충돌이 검출되면 총알의 리스폰포인트(firePos)가 충돌이 발생한위치를 바라보게 만든다. 
     // 이 상태에서 발사입력이 들어오면 총알은 충돌점으로 날아가게 된다.
            firePos.LookAt(temp.point);  
            Debug.DrawRay(firePos.position, firePos.forward * 200.0f, Color.cyan); // 이 레이는 앞서 선언한 디버그용 레이와 충돌점에서 교차한다
         }
    ...
}


댓글

가장 많이 본 글