본문 바로가기
게임/Unity

[Unity 3D] 충돌 체크

by 신인용 2019. 11. 25.
반응형

 오늘도 게임의 기초 중에 기초를 공부하겠습니다.

 

충돌 체크

 

 게임에서 총알이 적에게 맞는다던가, 캐릭터가 목적지에 도달하던가 등등 충돌은 중요한 요소입니다. 이런 충돌을 유니티에서는 어떻게 구현해야 할 지 알아봅시다.

 

 

 Unity에서는 Object가 실제로 충돌을 감지하는 것이 아닌, Collider라는 Component가 감지하게 됩니다.

초록 박스가 Collider. 실제 판정 범위

 Cube가 실제로 충돌을 감지하는 범위가 초록박스 영역인 Collider입니다. 이미지에선 Collider의 Size를 조금 늘린 것입니다.  Collider는 각 모형마다 존재하며 필요에 따라 제거할수도 있습니다.

 

Cube의 Inspector창

 그리고 Box Collider에 "Is Trigger"라는 것이 존재하는데, 만약 체크하면 물리적인 구현을 쏙 빼고 충돌만을 감지하게 됩니다.

 

 

 

 

 

유니티에서는 충돌을 구현하기 위해서는 2가지 방법이 있습니다.

 

 1. Trigger 사용

 2. Collision 사용

 

 먼저 Trigger와 Collision의 차이점을 설명하자면, 

 Trigger는 물리적 계산을 하지 않고, 오직 충돌만을 감지합니다. 즉, 통과하지 못하고 부딪힌다면 Trigger는 작동하지 않습니다. 즉, IsTrigger를 체크해줘야 작동합니다.

 Collision은 물리적 계산과 함께 충돌을 감지합니다. 통과하지 못해도 Collision은 작동할 수 있습니다.

 

 

 

 그럼 충돌을 하게 되면 빨간색으로 변하는 프로그램을 구현하겠습니다.

 

0. 기본 셋팅

기본 세팅

 캐릭터는 움직이는 것이 구현되어 있고, 파란박스는 Collision충돌, 노란박스는 Trigger충돌을 할 것입니다. Trigger박스인 노란 박스는 IsTrigger를 체크해둡니다. 캐릭터에겐 Player 태그를 달아줍니다.

 

 

 

 

 

 

1. Trigger

1
2
3
4
5
6
7
8
9
private void OnTriggerEnter(Collider other){
   // event
}
private void OnTriggerExit(Collider other){
   // event
}
private void OnTriggerStay(Collider other){
   // event
}
cs

 ▶ OnTriggerEnter(Collider other)

 - 충돌하는 순간 작동

 ▶ OnTriggerExit(Collider other)

 - 충돌이 끝난 순간 작동

 ▶ OnTriggerStay(Collider other)

 - 충돌하는 순간 작동

 

Trigger의 충돌처리는 이처럼 3가지로 나눌 수 있습니다. 

매개변수로 Collider를 받는데, 이에 담겨져 있는 정보는 이곳에서 확인가능 합니다. (유니티 메뉴얼)

 

 

1
2
3
4
5
private void OnTriggerEnter(Collider other){        
   if(other.tag == "EndPoint"){
       // event
   }
}
cs

Collider에 포함되어 있는 tag기능으로 event부분에 조건문을 걸어 other의 태그를 확인해 필터링할 수도 있습니다.

 

 

 

 

 

2. Collision

1
2
3
4
5
6
7
8
9
private void OnCollisionEnter(Collision collision){
   // event
}
private void OnCollisionExit(Collision collision){
   // event
}
private void OnCollisionStay(Collision collision){
   // event
}
cs

 ▶ OnCollisionEnter(Collider other)

 - 충돌하는 순간 작동

 ▶ OnCollisionExit(Collider other)

 - 충돌이 끝난 순간 작동

 ▶ OnCollisionStay(Collider other)

 - 충돌하고 있는 순간 작동

 

 

 Trigger와 똑같은 충돌처리를 구현합니다.

 다른 점은, 매개변수로 Collision을 받는데, 여기에 담긴 정보는 이곳에서 확인가능 합니다. (유니티 메뉴얼)

 

 

 

 

 

3. 결과

파란박스: Collision, 노란박스: Trigger

충돌 소스 코드

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Trigger : MonoBehaviour
{
    private bool isOverlapped = false;
    private Renderer triggerRenderer;
 
    private Color originColor;
 
    void Start()
    {
        triggerRenderer = GetComponent<Renderer>();
        originColor = triggerRenderer.material.color;
    }
 
    private void OnTriggerEnter(Collider other){
        if(other.tag == "Player"){
            isOverlapped = true;
            triggerRenderer.material.color = Color.red;
        }
    }
    private void OnTriggerExit(Collider other){
        if(other.tag == "Player"){
            isOverlapped = false;
            triggerRenderer.material.color = originColor;
        }
    }
    private void OnTriggerStay(Collider other){
        if(other.tag == "Player"){
            isOverlapped = true;
            triggerRenderer.material.color = Color.red;
        }
    }
}
 
cs

                               Trigger

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CollisionA : MonoBehaviour
{
    private bool isOverlapped = false;
    private Renderer collisionRenderer;
 
    private Color originColor;
 
    void Start()
    {
        collisionRenderer = GetComponent<Renderer>();
        originColor = collisionRenderer.material.color;
    }
 
    private void OnCollisionEnter(Collision collision){
        if(collision.gameObject.tag == "Player"){
            isOverlapped = true;
            collisionRenderer.material.color = Color.red;
        }
    }
    private void OnCollisionExit(Collision collision){
        if(collision.gameObject.tag == "Player"){
            isOverlapped = false;
            collisionRenderer.material.color = originColor;
        }
    }
    private void OnCollisionStay(Collision collision){
        if(collision.gameObject.tag == "Player"){
            isOverlapped = true;
            collisionRenderer.material.color = Color.red;
        }
    }
}
 
cs

                               Collision

 

 Collision과 Trigger 충돌의 차이는??

1. 매개변수 타입이 다릅니다.

2. 물리구현이 Collision은 가능하고 Trigger는 불가능합니다.

반응형

'게임 > Unity' 카테고리의 다른 글

[Unity 이론] Firebase Database  (0) 2019.11.28
[Unity 이론] Object Pooling  (0) 2019.11.26
[Unity 이론] Coroutine  (1) 2019.11.26
[Unity 이론] Time.deltaTime  (0) 2019.11.24
[Unity 3D] 캐릭터 움직임 구현  (2) 2019.11.23

댓글