Unity 3D - 레이(Ray)(Physics.Raycast)

2024. 10. 24. 00:03카테고리 없음

Ray(레이)

Ray는 Unity에서 사용하는 가상의 선으로, 특정한 시작 지점에서 지정한 방향으로 발사되어 충돌할 수 있는 물체가 있는지 확인하는 물리적 검사 도구이다. Ray 시작 위치(origin)와 방향(direction)으로 정의되며, 주로 충돌 감지를 위해 사용된다.

 

Ray의 구성 요소

1. 시작 지점 (Origin):

- 광선이 시작되는 위치이다. 이 위치는 월드 좌표계에서 특정 지점일 수 있고, 보통 게임 오브젝트의 transform.position을 사용하여 현재 오브젝트의 위치에서 광선을 발사하게 된다.

2. 방향 (Direction):

- 광선이 발사되는 방향이다. 이는 Vector3 타입으로 지정하며, 예를 들어 Vector3.forward는 전방, Vector3.down은 아래 방향을 의미한다. 이 방향으로 광선이 무한히 또는 지정된 거리만큼 나아간다.

 

Physics.Raycast와 Ray의 상관 관계

Unity에서는 Ray 자체는 아무런 효과가 없지만, Physics.Raycast와 함께 사용하면 광선이 어떤 물체와 충돌했는지 감지할 수 있습니다. Ray는 광선을 나타내는 역할을 하고, Raycast는 그 광선이 실제로 충돌하는지 검사하는 함수입니다.

코드

bool isGrounded()
{
    Ray[] rays = new Ray[4]
    {
        new Ray(transform.position + (transform.forward * 0.2f) + (transform.up * 0.01f), Vector3.down),
        new Ray(transform.position + (-transform.forward * 0.2f) + (transform.up * 0.01f), Vector3.down),
        new Ray(transform.position + (transform.right * 0.2f) + (transform.up * 0.01f), Vector3.down),
        new Ray(transform.position + (-transform.right * 0.2f) + (transform.up * 0.01f), Vector3.down)
    };   //다리 4개의 레이를 만들어서 쏜다
    
    for (int i = 0; i < rays.Length; ++i)
    {
        if (Physics.Raycast(rays[i], 0.1f, groundLayerMask)) //레이개수만큼 반복, 레이 길이는 0.1로 설정, LayerMask에 해당되는 애들만 검출
        {
            return true;
        }
    }

    return false;
}

코드설명

이 코드는 캐릭터의 위치(transform.position)를 기준으로 4개의 Ray를 만듭니다.

 

 Ray캐릭터의 앞쪽, 뒤쪽, 오른쪽, 왼쪽에 각각 약간의 오프셋을 준 위치에서 시작해, 아래 방향(Vector3.down)으로 발사됩니다.

0.2f forward, right 방향으로의 오프셋이며, 0.01f up 방향으로의 작은 오프셋을 주어 광선이 캐릭터의 발 밑에 가까운 곳에서 발사되도록 합니다.

- transform.position : 캐릭터의 현재 위치

- transform.forward * 0.2f : 캐릭터의 앞쪽으로 0.2 유닛 이동

- transform.up * 0.01 f : 캐릭터의 발 부분을 기준으로 0.01 유닛 위로 이동 (바닥과 너무 붙지 않도록 함)

- Vector3.down : 발사 방향은 아래쪽

 

4개의 Ray에 대해 하나씩 검사하는 반복문이다.

- Physics.Raycast(rays[i], 0.1f, groundLayerMask)

0. Physics.Raycast의 반환값은 bool이여서 조건식안에서 사용이 가능하다.

1. Physics.Raycast Ray가 발사되어 특정 거리 내에 어떤 물체와 충돌하는지 확인하는 함수이다.

2. rays[i]로 각 광선을 0.1 유닛 거리만큼 쏘아 충돌을 검사한다.

3. groundLayerMask는 충돌할 때 바닥으로 인식할 레이어를 지정한 값이다. 이 값이 있어야 바닥과의 충돌만 감지된다.

public LayerMask groundLayerMask;

groundLayerMask는 위에서 내가 선언해준 변수이기 때문에 함수라고 오해하면 안된다. 이거를 사용한 이유는 충돌한 레이어가 플레이어면 빼기 위해서 사용 밑에 그림(Everything누른 다음에 Player 부분 제거)

 

return true; :

만약 Ray 중 하나라도 바닥에 닿으면 true를 반환하여 캐릭터가 바닥에 닿아있다고 판단합니다.

return false; :

모든 Ray가 바닥에 닿지 않으면 false를 반환하여 캐릭터가 공중에 떠 있다고 판단합니다.