게임 개발에서 오브젝트들의 충돌과 상호작용을 감지하는 방법에 대해 궁금해 한 적이 있으신가요? 답은 레이캐스트(Raycast)입니다! 이번 글에서는 유니티 레이캐스트의 개념과 사용법에 대해 알아보겠습니다.

레이케스트란 무엇인가?

먼저 레이캐스트란 무엇일까요? 레이캐스트는 게임 개발에서 오브젝트들의 충돌과 상호작용을 감지하기 위한 수단입니다. 레이캐스트는 특정 방향으로 뻗어나가는 라인으로, 다른 오브젝트와의 충돌을 감지하거나 물체들 간의 거리를 계산하며, 라인의 경로 상에 있는 오브젝트를 감지하는 등 다양한 용도로 사용됩니다. 레이캐스트는 2D와 3D 게임 모두에서 사용되며, 게임 개발에서 핵심적인 개념입니다.

Unity에서는 Physics.Raycast() 메서드를 사용하여 레이캐스트를 만들 수 있습니다. 이 메서드는 시작 위치와 방향을 받아 해당 방향으로 뻗어나가는 라인과 충돌한 오브젝트에 대한 정보를 반환합니다. 또한, Debug.DrawLine() 메서드를 사용하여 레이캐스트의 경로를 시각화할 수 있습니다. 다음은 코드 예입니다.

// 플레이어의 위치에서 정면 방향으로 레이캐스트를 생성합니다.
// 생성한 레이캐스트가 충돌한 오브젝트에 대한 정보를 hit 변수에 저장합니다.
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit))
{
    // 충돌한 오브젝트의 이름을 디버그 로그에 출력합니다.
    Debug.Log("충돌한 오브젝트: " + hit.collider.name);
    
    // 레이캐스트의 시작점부터 충돌 지점까지 빨간색으로 선을 그려 시각화합니다.
    Debug.DrawLine(transform.position, hit.point, Color.red);
}

레이캐스트 성능 최적화 방법

레이캐스트의 성능을 최적화하는 방법으로는 레이캐스트의 수를 제한하고, 레이어 마스크를 사용하여 원하지 않는 충돌을 필터링하며, Physics.RaycastAll() 메서드를 사용하여 한 번에 여러 충돌을 감지하는 등의 방법이 있습니다.

// 레이어 마스크를 사용하여 원하는 충돌 대상만 필터링합니다.
int layerMask = LayerMask.GetMask("Enemy", "Obstacle");
if (Physics.Raycast(transform.position, transform.forward, out hit, Mathf.Infinity, layerMask))
{
    // 충돌한 오브젝트의 이름을 디버그 로그에 출력합니다.
    Debug.Log("충돌한 오브젝트: " + hit.collider.name);
    
    // 레이캐스트의 시작점부터 충돌 지점까지 빨간색으로 선을 그려 시각화합니다.
    Debug.DrawLine(transform.position, hit.point, Color.red);
}

// 한 번에 여러 충돌을 감지하기 위해 Physics.RaycastAll() 메서드를 사용합니다.
RaycastHit[] hits = Physics.RaycastAll(transform.position, transform.forward, Mathf.Infinity, layerMask);
foreach (RaycastHit hit in hits)
{
    // 각 충돌한 오브젝트의 이름을 디버그 로그에 출력합니다.
    Debug.Log("충돌한 오브젝트: " + hit.collider.name);
    
    // 레이캐스트의 시작점부터 충돌 지점까지 파란색으로 선을 그려 시각화합니다.
    Debug.DrawLine(transform.position, hit.point, Color.blue);
}

레이캐스트는 게임 개발에서 다양한 상황에서 사용될 수 있습니다. 예를 들어, 레이캐스트는 플레이어의 무기가 적군에 맞았을 때, 플레이어가 오브젝트를 바라보고 있는지 여부, 무기를 조준하고 있는지 여부 등 다양한 상황에서 사용됩니다. 위의 예시 코드를 참고해서 다양한 게임 플레이 상황에 응용해 보시기 바랍니다.

더 공부할 자료

스크립터블 오브젝트를 능숙하게 사용하는 능력은 이제 유니티 게임 개발에 필수적으로 요구되고 있습니다.

특히 AI 코딩 시대가 되면서 데이터와 코드를 분리해서 작업하는 방식의 중요성이 더 커졌습니다. 코드를 더 작게, 기능별로 쪼개어 작성해야 관리가 편하기 때문입니다.

"유니티 6 스크립터블 오브젝트: 기초에서 활용까지"는 유니티 입문 단계를 끝내고 좀 더 심화된 지식을 익히고자 하는 프로그래머를 대상으로 쓰여진 책입니다. 책 내용은 다음 링크를 참고하시기 바랍니다.

책 내용 살펴 보기