블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2797)
Unity3D (853)
Script (91)
Extensions (16)
Effect (3)
NGUI (81)
UGUI (9)
Physics (2)
Shader (37)
Math (1)
Design Pattern (2)
Xml (1)
Tips (201)
Link (23)
World (1)
AssetBundle (25)
Mecanim (2)
Plugins (79)
Trouble Shooting (70)
Encrypt (7)
LightMap (4)
Shadow (4)
Editor (12)
Crash Report (3)
Utility (9)
UnityVS (2)
Facebook SDK (2)
iTween (3)
Font (13)
Ad (14)
Photon (2)
IAP (1)
Google (8)
Android (51)
iOS (44)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

'Unity3D/Physics'에 해당되는 글 2건

  1. 2013.02.28 Raycast 6
  2. 2012.11.05 오브젝트 간 충돌을 막고 싶을 때..

Raycast

Unity3D/Physics / 2013. 2. 28. 18:50

static function Raycast (ray : Ray, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : boolean


Parameters

rayThe starting point and direction of the ray.
distanceThe length of the ray
hitInfoIf true is returned, hitInfo will contain more information about where the collider was hit (See Also:RaycastHit).
layerMaskLayer mask that is used to selectively ignore colliders when casting a ray.

Returns

boolean - True when the ray intersects any collider, otherwise false.

Description

Same as above using ray.origin and ray.direction instead of origin and direction.

참조1 : http://docs.unity3d.com/Documentation/ScriptReference/Physics.Raycast.html


위는 많이 사용되는 RayCast() 함수이다.

여기서 이야기 할 것은 4번째 매개변수인 Layer mask이다.

처음엔 레퍼런스를 대충 봐서 충돌을 무시할 Layer mask 인 줄 알았지만 그 반대였다.

충돌을 체크하고 싶은 Layer mask를 넣어야 한다.

Layer mask 사용방법에 대해서는 아래 참조2에 나온다.

참조2 : http://docs.unity3d.com/Documentation/Components/Layers.html


기본적으로 아래와 같이 사용하면 된다.

ex1)

1 int layerMask = (-1) - (1 << LayerMask.NameToLayer("Player")); // Everything에서 Player 레이어만 제외하고 충돌 체크함 2 Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask);


ex2)

1 int layerMask = (-1) - (1 << LayerMask.NameToLayer("Player")); 2 RaycastHit hit; 3 Ray ray = Camera.mainCamera.ScreenPointToRay( screenPos ); // screenPos는 화면상 클릭 좌표 4 bool result = Physics.Raycast( ray, out hit, Mathf.Infinity, layerMask );


ex3) 

1 int layerMask = 1 << LayerMask.NameToLayer("Player"); // ignore LayerMask 2 layerMask = ~layerMask ; // Invert LayerMask 3 RaycastHit hit; 4 Ray ray = Camera.mainCamera.ScreenPointToRay( screenPos ); // screenPos는 화면상 클릭 좌표 5 bool result = Physics.Raycast( ray, out hit, Mathf.Infinity, layerMask );


ex4)  // 추가

1 int layerMask = (1 << LayerMask.NameToLayer("Player")) + (1 << LayerMask.NameToLayer("Mob")); // ignore LayerMask(Player와 Mob 레이어 체크 무시하기 위해..)

2 layerMask = ~layerMask ; // Invert LayerMask 3 RaycastHit hit; 4 Ray ray = Camera.mainCamera.ScreenPointToRay( screenPos ); // screenPos는 화면상 클릭 좌표 5 bool result = Physics.Raycast( ray, out hit, Mathf.Infinity, layerMask );


참조2의 맨아래 보면 보면 ex3)과 같은 방식으로 사용된 걸 볼 수 있다.

충돌 제외할 Layer Mask를 설정 한 후 ~ 연산자로 Invert 시키고 있다.

처음엔 위쪽만 대충 읽어서 그냥 무시할 Layer Mask를 넣는 줄 알고 했다가 안돼서 레퍼런스가 틀린 줄 알았는데..

제대로 써있다..;;

레퍼런스도 끝까지 정독해야 된다는 걸 느끼게 해줬다..;;

가능하면 ex3) 방식으로 사용을 하자.


[추가]

여러 레이어를 제어하는 부분이 빠진 것 같아서 ex4)를 추가..


P.s. Everything Layer = -1

P.s.2. LayerName을 int로 변환할 때는 LayerMask.NameToLayer 를 사용하면 된다.

반응형

'Unity3D > Physics' 카테고리의 다른 글

오브젝트 간 충돌을 막고 싶을 때..  (0) 2012.11.05
Posted by blueasa
, |

1) Layer 단위로 충돌을 막을 때..


 Layer를 생성 & 셋팅 하고, 충돌을 안하고 싶은 레이어들을 셋팅해 준다.


Physics.IgnoreLayerCollision(LayerMask.NameToLayer("MonsterBody"), LayerMask.NameToLayer("MonsterBody"), true); 


위 소스는 MonsterBody끼리 충돌을 방지한다.

예를들어 플레이어가 박스등에 부딪히고 싶지 않다면..


Physics.IgnoreLayerCollision(LayerMask.NameToLayer("Character"), LayerMask.NameToLayer("Box"), true); 


이런 식으로 하면 된다.


[추가]

충돌을 안하게 했던 부분을 다시 충돌하게 하려면 3번째 매개변수 값을 false로 넣으면 된다.

Physics.IgnoreLayerCollision(LayerMask.NameToLayer("MonsterBody"), LayerMask.NameToLayer("MonsterBody"), false); 



참조1 : http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=20010&sca=UNITY&sfl=wr_subject%7C%7Cwr_content&stx=%EC%B6%A9%EB%8F%8C&sop=and&page=2&currentId=44


참조2 : http://www.devkorea.co.kr/reference/Documentation/ScriptReference/Physics.IgnoreLayerCollision.html




2) 각 개체(오브젝트)별로 충돌을 (실시간으로)막고 싶을 때..

  플레이어가 몬스터와 충돌되다가 몬스터를 죽이면 충돌이 안되게 하고 싶어서 이걸 사용했다.

  처음에 Collider 자체를 껐더니 바닥과도 충돌이 안돼서 빠지는 문제 때문에 이걸로 바꿨다.


Physice.IgnoreCollision() 함수를 쓴다.


static function IgnoreCollision (collider1 : Collider, collider2 : Collider, ignore : bool = true) : void


collider1과 collider2를 충돌하지 않게 해준다.


자세한 사항은 아래 참조로..


참조 : http://www.devkorea.co.kr/reference/Documentation/ScriptReference/Physics.IgnoreCollision.html

반응형

'Unity3D > Physics' 카테고리의 다른 글

Raycast  (6) 2013.02.28
Posted by blueasa
, |