티스토리 뷰
유니티에는 Ray라고 하는 기능이 있다.
직선상의 위치에 대상이 있는지 판별하는 함수로, 간단하게 설명하자면 '빔을 쏴서 물체가 있는지 확인하는 기능'이다.
항시 켜져있는 기능이 아닌 원할 때에 작동시키는 기능으로, 지면에 서 있는지 판단할 때나 현재 바라보고 있는 대상이 무엇인가 판단할 때 등, 다양한 '대상 판정'에 활용되는 기능이다.
특히 3D게임에서 아주 자주 쓰이는 기능으로, 카메라 조작을 통한 주시 기능 이외에도 지형 충돌 시 등반, 계단 오르기 등등 다양한 방면에서 사용되는 기능이다.
그럼, 이제 Raycast에 대해서 알아보자.
Ray
Ray(origin: Vector3, direction: Vector3)
Raycast의 주체가 되는 객체로, Raycast를 시행할 위치(origin), 각도(direction)를 지정할 수 있다.
이외에도 Camara클래스에서 지원되는 관련 기능이 2개 존재한다.
[eye는 어떤 eye 트랜스폼을 사용할 것인지 지정하는 옵션 인수다. 기본값은 Mono.]
[eye 트랜스폼: 시야 모드를 선택하는 요소. VR환경이면 Left와 Right, 모니터 환경이면 Mono를 쓴다.]
1. ScreenPointToRay: 카메라 상의 특정 수치 좌표를 Ray로 지정한다.
Ray Camera.ScreenPointToRay(Vector3 pos);
Ray Camera.ScreenPointToRay(Vector3 pos, Camera.MonoOrSetreoscopicEye eye);
2. ViewportPointToRay: 카메라 상의 지정 비율 좌표를 Ray로 지정한다.
Ray Camera.ViewportPointToRay(Vector3 pos);
Ray Camera.ViewportPointToRay(Vector3 pos, Camera.MonoOrStereoscopicEye eye);
위두 함수는 화면을 기점으로 하는 Ray이기에 각도 = 화면의 각도가 된다.
이제 Ray를 지정했다면, 실제 사용을 해 보자.
Raycast
public static bool Raycast(Ray ray, float distance, LayerMask target)
Raycast를 시행하는 함수. Raycast 결과 감지 대상이 있다면 true를, 없다면 false를 반환한다.이 때, LayerMask target으로 지정된 Layer 만을 판정하기 때문에, 지면 만 판정한다거나, 아이템 만 판정한다거나 하는 것도 가능하다.
public static bool Raycast(Ray ray, out RaycastHit hit, float distance, LayerMask target)
또한, 이 Overload 형태를 통해서 감지 대상에 대한 정보를 hit 변수로 받아올 수도 있다.
또한, Ray가 아닌, origin과 direction의 Vector3값 2개를 이용하는 형식도 있다.
[함수의 전체 Overload 목록은 https://docs.unity3d.com/kr/530/ScriptReference/Physics.Raycast.html 참고.]
RaycastHit
Raycast 결과물을 받아올 수 있는 변수.
다만, Raycast에서 얻어올 수 있는 정보는 거진 다 담고 있기 때문에 정보량이 좀 많다.
그러니 여기에서 주로 쓰일만 한 정보만 정리하겠다.
- collider: collision에서 쓰였던 그것. Raycast 된 대상의 collider 정보.
- distance: 원점으로 부터의 거리. (float값)
- point: Raycast가 충돌한 worldspace 상의 좌표.
- rigidbody: 감지 대상의 rigidbody 컴포넌트.
- transform: 감지 대상의 transform.
[이외의 변수에 대해서는 https://docs.unity3d.com/kr/530/ScriptReference/RaycastHit.html 참고.]
'스파르타 내일배움캠프 > Today I Learned' 카테고리의 다른 글
Today I Learned - Day30 [확장 메서드] (0) | 2024.10.25 |
---|---|
Today I Learned - Day 29 [ObjectPool에 관하여] (0) | 2024.10.24 |
Today I Learned - Day 27 [제너릭 싱글톤] (1) | 2024.10.22 |
Today I Learned - Day 26 [AddComponent] (0) | 2024.10.21 |
Today I Learned - Day 25 [New Input System] (0) | 2024.10.18 |