무민은귀여워

[유니티] 충돌 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