GameForFun

블로그 이미지
by PforPepsi

TAG CLOUD

  • Total hit
  • Today hit
  • Yesterday hit

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
AND

ARTICLE CATEGORY

목록들 (118)
[Unity3D] (39)
그래픽관련 (13)
잉여잉여 (25)
프로그래밍 (27)
노래♬ (3)
Game_Design(기획) (3)

RECENT ARTICLE

RECENT COMMENT

RECENT TRACKBACK

CALENDAR

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

ARCHIVE