Unity&C# 수집형 오브젝트 만들기2 - 충돌을 감지하고 수집하기(태그 시스템)

OnTriggerEnter() 함수를 이용해서, 플레이어와 수집형 오브젝트의 접촉을 감지하고 실제 물리적 충돌을 발생시키지 않는다

 

private void OnTriggerEnter(Collider other)
{
    other.gameObject.SetActive(false);
}

 

 

플레이어가 트리거인 collider에 처음 접촉할 때 OnTriggerEnter가 호출

 

수집을 할려면 오브젝트에 충돌할때, 충돌한 오브젝트를 비활성화하면 된다

 

other.gameObject.SetActive(false);

 

그런데 이렇게만 하면, 플레이어가 어떤 오브젝트에 충돌하든, collider가 isTrigger이 on되어있으면 사라지게 된다

 

 

 

 

정확히 수집형 오브젝트만 인식해서, 수집형 오브젝트에 충돌하면 수집형 오브젝트만 비활성화 되도록 하고 싶다

 

이를 위해 unity의 tag 시스템을 이용

 

PickUp의 prefab으로 들어가서, inspector의 Tag 부분에 Add Tag 누르면

 

 

 

 

Tags & Layers에서 +부분을 누르고 PickUp이라고 이름 쓴 다음 Save로 저장

 

 

 

 

prefab에서 Tag를 PickUp으로 지정

 

그러면 모든 prefab instance의 모든 tag가 PickUp으로 바뀜

 

 

 

 

이제 if (ohter.gameObject.CompareTag("PickUp")) 문을 이용해서 

 

플레이어 게임 오브젝트가 충돌한 collider의 tag를 확인한 다음

 

PickUp tag 오브젝트만 비활성화해준다

 

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("PickUp")) {
            other.gameObject.SetActive(false);
        }
    }

 

 

이렇게 해도, 그냥 충돌하는 것처럼 수집형 오브젝트가 사라지지 않는데...

 

 

 

이거는 PickUp 오브젝트가 Trigger가 아니라 그냥 Collider를 쓰기 때문이다.

 

Collider는 물리 오브젝트가 서로 겹치치 않게 만들어준다

 

Trigger은 물리 오브젝트가 서로 겹친다는 것을 알려주긴 하지만, 겹치지 않게 막지는 않는다.

 

그래서 Collider를 Trigger로 바꿔서 플레이어 오브젝트와 수집형 오브젝트가 서로 겹치도록 만들어준다면, 

 

충돌했다는 것을 인식하고 수집형 오브젝트를 비활성화한다

 

방법은 PickUp prefab에서 Box Collider 부분을 is Trigger에서 체크박스에 체크해주면 된다

 

 

 

 

벽의 isTrigger이 켜져있더라도, 수집형 오브젝트는 비활성화되어 사라지는데

 

벽은 사라지지 않고 충돌하면 통과함

 

 

 

이거는 벽의 is Trigger가 켜져있기 때문이다.

 

벽의 is Trigger를 끄면 벽을 통과하지 않는다

 

 

 

 

이것이 가능한 이유는 충돌을 감지하고 수집형 오브젝트를 비활성화하는 함수로 OnTriggerEnter를 사용했기 때문이다.

 

만약 OnCollisionEnter를 사용한다면?

 

    private void OnCollisionEnter(Collider other)
    {
        if (other.gameObject.CompareTag("PickUp")) {
            other.gameObject.SetActive(false);
        }
    }

 

 

이러면 수집형 오브젝트에 충돌해도 비활성화되지 않는다

 

수집형 오브젝트가 Trigger Collider이기 때문이다

 

 

 

 

Trigger collider인 경우에, 예를 들어 어드벤처 게임 중 어떤 곳에 도달하면 맵이 업데이트 되면서 새로운 방을 찾았다든가

 

플레이어가 특정 위치로 도달하면 위에서 거미가 떨어진다든가...

 

이런걸 할 수 있다

 

 

마지막으로 수집형 오브젝트에 Rigidbody를 추가해서 동적인 오브젝트로 만들 수 있다

 

수집형 오브젝트를 정적인 오브젝트로 취급하면 물리 계산에 소요되는 프레임당 시간이 길어지기 때문이라고 함

 

수집형 오브젝트는 지금, 큐브가 회전하기 때문에 프레임마다 계산이 이루어지는데

 

rigidbody를 추가해서 프레임당 계산 시간이 길어지는 것을 방지할 수 있다

 

pickup prefab에서 add component로 rigidbody를 추가

 

 

 

 

근데 그러면 게임 시작하자마자 수집형 오브젝트가 바닥으로 추락하는데

 

중력이 끌어당겨서 그렇다

 

 

 

 

use gravity의 체크를 해제하면, 중력에 반응하지 않는데 

 

이렇게 하더라도 오브젝트가 떨어지지는 않지만 오브젝트가 물리적인 힘에 반응하게 된다

 

is Kinematic을 체크하면, 물리적인 힘에도 반응하지 않고 애니메이션이 적용되어 transform에 따라 움직이게 된다

 

 

 

 

TAGS.

Comments