무민은귀여워

[유니티] 충돌 Collision / Trigger / Raycast / LayerMask 본문

IT/Unity

[유니티] 충돌 Collision / Trigger / Raycast / LayerMask

moomini 2022. 5. 17. 20:09
반응형

1. 충돌 OnCollisionEnter

2. 트리거 OnTriggerEnter

3. 투영 ( Local - World - Viewport - Screen )

4. 레이캐스트 Raycast

5. LayerMask

1. 충돌 OnCollisionEnter

// 1) 나 혹은 상대한테 RigidBody 있어야 한다 (IsKinematic : off)
// 2) 나한테 Collider가 있어야 한다 (IsTrigger : off)
// 3) 상대한테 Collider가 있어야 한다 (IsTrigger : off)
private void OnCollisionEnter(Collision collision)
{
Debug.Log($"Collision @ {collision.gameObject.name} !");
}

2. 트리거 OnTriggerEnter

// 1) 둘 다 Collider가 있어야 한다
// 2) 둘 중 하나는 IsTrigger : on
// 3) 둘 중 하나는 RigidBody가 있어야 한다
private void OnTriggerEnter(Collider other)
{
Debug.Log($"trigger @ { other.gameObject.name} !");
}

 

주석외의 상황은 유니티 문서 참고

https://docs.unity3d.com/Manual/CollidersOverview.html

 

Unity - Manual: Introduction to collision

Continuous collision detection (CCD) Introduction to collision Unity handles collision between GameObjects with colliders, which attach to GameObjects and define the shape of a GameObjectThe fundamental object in Unity scenes, which can represent character

docs.unity3d.com

3. 투영 ( Local - World - Viewport - Screen )

Screen - 마우스 포인트에 해당하는 Screen 좌표 출력

* 화면에서 좌측하단이 (0, 0), 우측 상단으로 갈수록 값 증가 

    Debug.Log(Input.mousePosition); // Screen

ViewPort - 마우스 포인트에 해당하는 ViewPort좌표 출력

    Debug.Log(Camera.main.ScreenToViewportPoint(Input.mousePosition)); // Viewport

월드공간은 아래 레이캐스트에서...

4. 레이캐스트 Raycast

카메라에서부터 좌클릭한 지점으로 레이캐스트를 이용해 부딪힌 오브젝트 출력

 

1. 첫번째 방법

Vector3 mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane));
Vector3 dir = mousePos - Camera.main.transform.position;
dir = dir.normalized;
Debug.DrawRay(Camera.main.transform.position, dir * 100.0f, Color.red, 1.0f);
RaycastHit hit;
if (Physics.Raycast(Camera.main.transform.position, dir, out hit, 100.0f))
{
Debug.Log($"Raycast Camera @ {hit.collider.gameObject.name}");
}

2. 두번째 방법

// 2. 두번째 방법
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100.0f))
{
Debug.Log($"Raycast Camera @ {hit.collider.gameObject.name}");
}

5. LayerMask

레이어를 지정해, 원하는 레이어에서만 레이캐스트 동작하게끔 한다

ex) Add Layer로 8번 "Monster" 9번 "Wall" 추가

// 1. 비트연산으로 mask 확인
int mask = (1 << 8) | (1 << 9);
// 2. 이름으로 mask 확인
LayerMask mask = LayerMask.GetMask("Monster") | LayerMask.GetMask("Wall");
// 2. 두번째 방법 (mask 추가)
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f);
LayerMask mask = LayerMask.GetMask("Monster") | LayerMask.GetMask("Wall");
//int mask = (1 << 8) | (1 << 9);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100.0f, mask))
{
Debug.Log($"Raycast Camera @ {hit.collider.gameObject.name}");
}

* Tag 태그도 레이어마스크 비슷하게 지정해서 사용 가능

반응형

'IT > Unity' 카테고리의 다른 글

[유니티] 오브젝트 풀링  (0) 2022.05.24
[유니티] 시야를 가리는 물체 판별 및 카메라 이동  (0) 2022.05.19
[유니티] ResourceManager  (0) 2022.05.17
[유니티] InputManager  (0) 2022.05.17
[유니티] 회전 rotation  (0) 2022.05.16
Comments