섹션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 라이센스를 따릅니다.