코드 및 공부/물리

Physics.Raycast

ekrxjvpvj0110 2024. 10. 29. 20:43

유니티 버전 - 2022.3.48f1

 

 

 

 

 

목차


  • Raycast란
  • Raycast와 RaycastHit
  • 마치며

 

 

 

 

 

Raycast란


Raycast는 가상의 광선(Ray)를 특정 방향으로 쏘아 그 경로에서 충돌하는 물체를 감지하는 기능입니다, 이를 통해 광선에 맞은 오브젝트의 정보를 얻을 수 있습니다

 

 

 

 

 

Raycast와 RaycastHit


 

 

 

Raycast


Raycast를 사용하기 위해서 선행되는 조건은 다음과 같습니다

 

Ray에 맞은 오브젝트의 정보를 가져오기 위해서는 오브젝트에 Collider가 존재해야합니다

Raycast에 레이어 마스크를 사용하는 경우, 오브젝트가 지정된 레이어에 속해야만 Ray에 의하여 감지됩니다

Ray의 최대 길이를 지정하였다면, 오브젝트가 미리 설정한 범위 내에 존재햐야합니다

마지막으로 레이어가 Ignore Raycast에 속한다면 감지할 수 없습니다

 

 

 

다음 코드에서 Ray에 맞은 오브젝트의 이름을 가져와보도록 하겠습니다  

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ray : MonoBehaviour
{
    [SerializeField] float _distance = 10f;
    public LayerMask layerMask;


    private void Update()
    {
        RaycastHit hit;

        if (Physics.Raycast(transform.position, transform.forward, out hit, _distance, layerMask))
        {
            Debug.Log(hit.collider.gameObject.name);
        }
    }

    private void OnDrawGizmos()
    {
        Debug.DrawRay(transform.position, transform.forward * _distance, Color.red);
    }
}

 

 

 

왼쪽의 큐브에서 레이를 발사하여 우측의 EnemyCube에 닿으니 해당 오브젝트의 이름을 확인할 수 있었습니다   

 

 

 

Physics.Raycast(transform.position, transform.forward, out hit, _distance, layerMask)

Physics.Raycast(A, B, C, D, E) // 위와 1:1 대응

A: Ray가 시작되는 위치입니다

B: Ray가 나아가는 방향을 정해줍니다

C: Ray가 충돌했을때, 해당 충돌체의 정보가 담길 RaycastHit 구조체입니다, out 키워드를 이용하여 값을 반환합니다

D: Ray의 최대거리입니다

E: Ray가 감지할 레이어를 지정합니다, 특정 레이어에만 반응하도록 필터링해주어 불필요한 오브젝트를 감지하지 않도록 합니다, 위처럼 변수로 지정하거나, 비트 연산, LayerMask.GetMask("레이어 이름"); 등으로 지정 가능합니다

 

 

 

RaycastHit


Ray가 충돌한 오브젝트의 다양한 정보를 담는 구조체입니다, 이것을 통하여 Ray에 충돌한 대상에 대한 구체적인 정보를 얻고 활용할 수 있습니다, 위의 예시에서는 gameObject의 name을 가져왔습니다

 

RaycastHit가 가지고 있는 정보는 매우 많기에 아래 공식문서를 참고하시면 좋을 것 같습니다

 

 

 

 

 

마치며


지금까지 Ray와 RaycastHit의 사용법과 구조를 알아봤습니다, 이어서 이를 다양한 방법으로 활용해보겠습니다

 

이상입니다

'코드 및 공부 > 물리' 카테고리의 다른 글

RaycastAll과 RaycastNonAlloc  (0) 2024.10.30