Unity에서는 ray라는것을 제공합니다. ray를 사용하면 내가 화면에서 어떤 아이템을 클릭했는가를 쉽게 알 수 있게 해줍니다.
그럼 먼저
Ray 란 무엇인가?
-> Ray를 번역하면 '광선'이죠? ray는 말 그대로 광선을 뜻합니다.
시작점 : Origin
방향 : Direction
이 두가지를 가진 오브젝트로써, 시작점으로부터 방향으로 쭉 선을 그어주는 놈입니다.
Ray의 사용
- ray는 다음과 같은 곳에 쓰일 것입니다.
1. 게임에서 내 캐릭터를, 내가 클릭한 곳으로 이동시키고 싶다
2. 게임 화면에서 어떤 오브젝트를 클릭했는지 알고 싶다.
----------------------------------제가 현재까지 사용한 정도------------------------------------------------------------------
Ray 관련 중요 메쏘드
- 그럼 Ray와 관련된 중요 메쏘드들을 살펴봅시다.
1. Camera.ScreenToRay(pixelwidth, pixelHeight) //(http://unity3d.com/support/documentation/ScriptReference/Camera.ScreenPointToRay.html)
- 이 메쏘드는 카메라를 origin으로 삼고, 인자로 받을 픽셀로부터 자동으로 방향을 결졍해주는 함수입니다.
즉, 이 메쏘드는 위에서 언급한 2가지의 경우를 처리하기 위해 필수인 요소입니다.
2. Plane.Raycast(Ray _r, out float _f) //(http://unity3d.com/support/documentation/ScriptReference/Plane.Raycast.html)
- 이 메쏘드는 특정 평면과 Ray와의 충돌을 체크하여 Ray의 Origin으로부터 충돌지점까지의 거리를 _f에 저장하여 줍니다.
응용.
- 위의 두가지를 응용하면 Ray의 사용 1번을 구현할 수 있습니다.
1
2
3
4
5
6
7
8
9
|
Plane zeroPlane = new Plane(Vector3.up, Vector3.zero); float distance; Vector3 pos; Ray ray = MainCamera.ScreenPointToRay(Input.mousePosition); if (zeroPlane.Raycast(ray, out distance)) { pos = ray.origin + ray.direction * distance; } |
위의 코드를 살펴보면, zeroPlane이라는 y축의 값이 0인 평면과, MainCamera에서 쏜 Ray를
zeroPlane.Raycast(ray,out distance))를 통해 처리하고있습니다.
실제 충돌 좌표를 구하는 작업은 8번째 줄입니다.
Vector3 pos에 ray의 원점, 그리고 ray의 방향(노말 벡터)에 거리를 곱해서 구한 것입니다.
3. Physics.Raycast //http://unity3d.com/support/documentation/ScriptReference/Physics.Raycast.html
- 이 함수는 오버로딩(?)이 되어있습니다. 함수는 기본적으로 충돌하면 참을 반환합니다.
1. (vector3 중심, vector3 방향, float 최대 거리, layermask(?)) (Ray ray, float 거리, layermask)
-> 이 함수는 최대 거리 안에 Collider와 충돌을 하면 true값을 반환해 줍니다.
2. (vector3 중심, vector3 방향, out RaycastHit _r, float 거리, layermask), (Ray ray,out RaycastHit _r, float 거리, layermask)
-> 이 함수를 사용하여 어떤 오브젝트에 가장 먼저 충돌했는지 알 수 있습니다. 그리고 이것을 이해하기 위해서는
RaycastHit이라는 놈을 알아야 합니다.
RaycastHit //http://unity3d.com/support/documentation/ScriptReference/RaycastHit.html
- ray와 충돌한 오브젝트의 정보를 담기 위한 자료입니다.
이를 통해,
충돌한 지점 point,
충돌한 지점의 노말 벡터 ,normal
거리 ,distance
충돌된 오브젝트, collider ->요놈이 필요해요
rigidbody
transform
위의 것 외에도 더 있지만, 제가 모르기에 설명 안합니다.
응용
-> 이제 1번과 3번을 응용하여 내가 어떤 오브젝트를 선택했는지 알 수 있습니다.
1
2
3
4
5
6
7
|
Ray ray = MainCamera.ScreenToRay(Input.mouseposition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { Debug.Log(hit.collider.name); } |
위의 코드를 그대로 해보면 자신이 클릭한 collider의 이름이 출력되는것이 보일것입니다.
---------------------------------------------------------------------------------------------------------------------------------------
저는 카메라에만 사용하였지만, ray는 특정 방향으로 오브젝트가 충돌했을 경우를 체크하기에 유용함으로 쓰기 나름입니다.
'[Unity3D]' 카테고리의 다른 글
[Unity] Network 정리 (2) | 2012.03.25 |
---|---|
[Unity] 정리들 (0) | 2012.03.25 |
[Unity] 최적화 (1) | 2012.03.24 |
[Unity] 인자 전달 방법 (0) | 2012.03.24 |
[Unity] 시작 (0) | 2012.03.24 |