반응형
안녕하세요.
개발을 하다 보면 터치 혹은 마우스 클릭으로 오브젝트를 선택해야 하는 경우가 있습니다.
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를 넣어줘야 합니다.
그리고 스크립트를 넣을 빈 오브젝트도 생성한 후 다음 스크립트를 넣어줍니다.
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)
반응형
'개발공부 > 유니티' 카테고리의 다른 글
[Unity] Stopped polling job due to exception 에러 (0) | 2022.07.07 |
---|---|
[Unity] Target Android SDK installed (0) | 2022.07.07 |
[Unity] Unity와 Firebase연동(Database) (2) | 2021.09.30 |
[Unity] 유니티에서 빌드한 apk가 블루스택에서 실행되지 않는 문제 해결 (2) | 2021.09.29 |
[Unity] 하이라이키 순위 변경 방법(SetAsFirstSibling, SetAsLastSibling, SetSiblingIndex, GetSiblingIndex) (0) | 2021.05.31 |