반응형

안녕하세요.

개발을 하다 보면 터치 혹은 마우스 클릭으로 오브젝트를 선택해야 하는 경우가 있습니다.

1. 3D 오브젝트 선택하기 

새로 프로젝트를 만들고 3D 오브젝트를 생성해줍니다.

저는 Cube, Capsule, Sphere, Cyinder를 생성한 후 적당한 위치로 이동시켜봅니다.

그리고 빈 오브젝트를 하나 생성해서 스크립트를 다음과 같이 작성합니다.

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
42
43
44
45
46
47
48
49
50
51
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class SelectObjectManager : MonoBehaviour
{
    Vector3 m_vecMouseDownPos;
 
    void Update()
    {
#if UNITY_EDITOR
        // 마우스 클릭 시
        if (Input.GetMouseButtonDown(0))
#else
        // 터치 시
        if (Input.touchCount > 0)
#endif
        {
 
#if UNITY_EDITOR
            m_vecMouseDownPos = Input.mousePosition;
#else
            m_vecMouseDownPos = Input.GetTouch(0).position;
            if(Input.GetTouch(0).phase != TouchPhase.Began)
                return;
#endif
            // 카메라에서 스크린에 마우스 클릭 위치를 통과하는 광선을 반환합니다.
            Ray ray = Camera.main.ScreenPointToRay(m_vecMouseDownPos);
            RaycastHit hit;
 
            // 광선으로 충돌된 collider를 hit에 넣습니다.
            if(Physics.Raycast(ray, out hit))
            {
                // 어떤 오브젝트인지 로그를 찍습니다.
                Debug.Log(hit.collider.name);
 
                // 오브젝트 별로 코드를 작성할 수 있습니다.
                if (hit.collider.name == "Cube")
                    Debug.Log("Cube Hit");
                else if (hit.collider.name == "Capsule")
                    Debug.Log("Capsule Hit");
                else if (hit.collider.name == "Sphere")
                    Debug.Log("Sphere Hit");
                else if (hit.collider.name == "Cylinder")
                    Debug.Log("Cylinder Hit");
            }
 
        }
    }
}
 
cs

실행하면 오브젝트를 클릭할 때마다 로그가 찍히는 것을 확인할 수 있습니다.

 

2. 2D 오브젝트 선택하기

같은 방식으로 2D 오브젝트를 Square, Circle, Capsule을 생성해줍니다.

2D 오브젝트는 생성할 때 기본적으로 Collider가 없기 때문에 오브젝트에 맞게 Collider를 넣어줘야 합니다.

Square에는 Box Collider 2D를 넣습니다.
Circle에는 Circle Collider 2D를 넣어줍니다.
Capsule에는 Capsule Collider 2D를 넣어줍니다.

그리고 스크립트를 넣을 빈 오브젝트도 생성한 후 다음 스크립트를 넣어줍니다.

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
42
43
44
45
46
47
48
49
50
51
52
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class SelectObjectManager : MonoBehaviour
{
    Vector3 m_vecMouseDownPos;
 
    void Update()
    {
#if UNITY_EDITOR
        // 마우스 클릭 시
        if (Input.GetMouseButtonDown(0))
#else
        // 터치 시
        if (Input.touchCount > 0)
#endif
        {
 
#if UNITY_EDITOR
            m_vecMouseDownPos = Input.mousePosition;
#else
            m_vecMouseDownPos = Input.GetTouch(0).position;
            if(Input.GetTouch(0).phase != TouchPhase.Began)
                return;
#endif
            
 
            // 마우스 클릭 위치를 카메라 스크린 월드포인트로 변경합니다.
            Vector2 pos = Camera.main.ScreenToWorldPoint(m_vecMouseDownPos);
 
            // Raycast함수를 통해 부딪치는 collider를 hit에 리턴받습니다.
            RaycastHit2D hit = Physics2D.Raycast(pos, Vector2.zero);
 
            if (hit.collider != null)
            {
                // 어떤 오브젝트인지 로그를 찍습니다.
                Debug.Log(hit.collider.name);
 
                // 오브젝트 별로 코드를 작성할 수 있습니다.
                if (hit.collider.name == "Square")
                    Debug.Log("Square Hit");
                else if (hit.collider.name == "Circle")
                    Debug.Log("Circle Hit");
                else if (hit.collider.name == "Capsule")
                    Debug.Log("Capsule Hit");
            }
 
        }
    }
}
 
cs

클릭할 때마다 로그가 찍히는 것을 확인할 수 있습니다.

 

3. 2D오브젝트가 선택이 제대로 안될 때

카메라 설정에 Projection이 "Perspective"로 되어있으면 제대로 선택이 안됩니다.

꼭 2D 일 때는 "Orthographic"로 설정해야 합니다.

Perspective : 원근감이 적용됩니다. (주로 3D)
Orthographic : 직각 투영으로 원근감이 없습니다.(주로 2D)

반응형

+ Recent posts