포스트

섹션4. Collision

위 글은 인프런에 있는 Rookiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진 강의를 듣고 남긴 필기입니다.

Collision & Trigger

기본적인 충돌에 대해 이해하는 섹션.

유니티에서 제공하는 Rigidbody와 Collider가 충돌에 어떤 영향을 미치는지 이해할 필요가 있다.

RigidBody와 Collider 컴포넌트의 설정에 따라 충돌을 다양하게 조절할 수 있다.

상세할 정보는 다음의 공식문서에서 설명한다. Unity Document. 충돌 소개

Raycasting

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
32
33
34
35
36
37
38
39
40
41
public class TestCollision : MonoBehaviour
{
    // ...

    private void Update()
    {
        // Local <-> World <-> Viewport (<-> Screen) 
        // Debug.Log(Input.mousePosition); => Screen Point    e.g.) 0,0,0 ~ 1920, 1080, 0
        // Debug.Log(Camera.main.ScreenToViewportPoint(Input.mousePosition));      // => ViewPort Point    e.g.) 0.0, 0.0, 0.0 ~ 1.0, 1.0, 0.0
        
        // 버전 1
        if (Input.GetMouseButton(0))        // 마우스 좌클릭
        {
            Vector3 mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane));
            Vector3 dir = (mousePos - Camera.main.transform.position).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 (간소화)
        if (Input.GetMouseButton(0))
        {
            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}");
            }
        }
    }
}

LayerMask

  • Raycasting의 성능과 최적화를 위한 Tag와 Layer, LayerMask의 활용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private void Update()
{
    // Local <-> World <-> Viewport (<-> Screen) 
    // Debug.Log(Input.mousePosition); => Screen Point    e.g.) 0,0,0 ~ 1920, 1080, 0
    // Debug.Log(Camera.main.ScreenToViewportPoint(Input.mousePosition));      // => ViewPort Point    e.g.) 0.0, 0.0, 0.0 ~ 1.0, 1.0, 0.0
    
    if (Input.GetMouseButton(0))        // 마우스 좌클릭
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red,1.0f);

        //int mask = (1 << 8) | (1 << 9);        // mask = (1 << 8) : 숫자 1을 왼쪽으로 8번 밀어서(shift), 8번째 비트를 켜는 레이어 마스크.
                                                 // (1 << 8) | (1 << 9) : 9번째 비트도 함께 켜서, 이를 레이어 마스크로 활용.
        LayerMask mask1 = LayerMask.GetMask("Monster") | LayerMask.GetMask("Wall"); 
        // 이렇게 string으로 레이어 마스크 활용도 가능.
        
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 100.0f, mask1))
        {
            Debug.Log($"Raycast Camera @ {hit.collider.gameObject.tag}");
        }
    }
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.