유니티 충돌 태그 - yuniti chungdol taegeu

또 이 Collider를 Inspector창을 통해 수정할 수 있다. 보통은 Object의 크기에 알맞게 자동으로 주어 지지만, 게임 난이도를 수정하기 위해서라던지 다양한 이유로 충돌체의 크기를 수정할 수 있다.

또, Collider에는 여러 종류가 있으니 유니티 API를 참조하길 바란다.


2. Collision 

Collision은 물리적인 연산을 하며 충돌을 감지한다. Collision 처리를 하려면 둘 중 하나에는 반드시 Rigidbody가 붙여져 있어야 하며, 이 Rigidbody의 Kinematic 속성이 꺼져 있어야 한다.

Collision에는 3가지 종류가 있다.

함수명

쓰임새

Void OnCollisionEnter(Collision o)

충돌이 시작되는 순간 호출

Void OnCollisionStay(Collision o)

충돌이 되고 있을 때 매 프레임 마다 호출

Void OnCollisionExit(Collision o)

충돌이 끝날 때 호출

이것은 3D기준이다.

collider2D혹은 Rigidbody2D를 붙일 수 있는 2D인 경우 void OnCollisionEnter2D(Collision2D o)이렇게 해야 한다.

void OnCollisionEnter2D(Collision2D other) 
    {
        print(other.gameObject.name);
        if (other.gameObject.name == "coin")
        {
            print(other.gameObject.name);
        }
}

이렇게 쓸 수 있다. 이 코드는 PlayerController스크립트에 붙여져 있으며, 충돌할때 OnCollisionEnter2D함수를 불러온다. 함수의 파라미터로 Collision2D 객체가 들어오면 other을 이용하여 이와 충돌한 Object에 대해 처리를 할 수 있게 된다.

충돌하자마자 충돌한 Object의 이름을 console에 출력하고, 만약 충돌한 상태 Object의 이름이 "Coin"이면, 그 Object의 이름을 또 다시 console에 출력하라는 뜻이다.


3. Trigger

Trigger은 두 오브젝트 간의 물리적 연산을 하지 않고 충돌을 감지할 때 사용된다. 

함수명

쓰임새

Void OnTriggerEnter(Collider c)

충돌이 시작되는 순간 호출

Void OnTriggerStay(Collider c)

충돌이 되고 있을 때 매 프레임 마다 호출

Void OnTriggerExit(Collider c)

충돌이 끝날 때 호출

두 Object가 충돌할 때, Object가 밀려나거나 튕겨 나가지 않고 그대로 통과하게 된다는 뜻이다.

유의해야할 점은 충돌하는 두 Object의 Collider에 Is Trigger를 활성화 해야 한다. 

우리는 Player에게 Rigidbody가 붙여져 있고 중력을 설정해 두었다. 얘의 Trigger가 활성화가 된다면 바닥체를 뚫고 아래로 끊임없이 내려갈 거다. 

그러므로 Is Trigger는 Coin들에게 붙여주도록 하자.

유니티 충돌 태그 - yuniti chungdol taegeu
void OnTriggerEnter2D(Collider2D o){
        if(o.gameObject.name == "Coin")
        {
            print(o.gameObject.name);
        }
}

우리는 Coin이 움직이지 않고 부딪치면 이 Coin이 사라지며 Score의 점수가 올라가는 것을 구현해야 하기 때문에

물리적 연산이 이루어 지지 않은 Trigger를 사용하도록 하겠다.

유니티 충돌 태그 - yuniti chungdol taegeu

이렇게 말이다!

그런데 문제가 생겼다. 코인은 여러개 이고 각 순서에 맞게 Coin, Con 2, Coin 3, Coin 4 이라는 이름을 붙였는데 우리의 코드는 Coin하나만 조건문에 있다! 이럴 때 조건문을 계속 만들어 줘야 하는가?

[Unity Function] 충돌 처리 Collision & Trigger 관련 함수/예제

  • novs
  • GameDevelop/Function&Interface
  • 2021. 6. 13.

반응형

반응형

유니티 충돌 태그 - yuniti chungdol taegeu

[목차]

#1 충돌 발생조건

#2 Collision - OnCollisionEnter(),  OnCollisionStay(),  OnCollisionExit()

#3 Trigger - OnTriggerEnter(), OnTriggerStay(), OnTriggerExit()

* 개인적인 공부 내용을 기록하기 위한 용도로 작성된 게시글 이기에, 잘못된 내용이 있을 수 있습니다.


#1 충돌 발생조건

* 충돌이 일어나기 위해서는, 두 오브젝트가 모두 Collider를 갖고 있어야 하며, 둘 중 하나 이상은 RigidBody 컴퍼넌트를 갖고 있어야 합니다.

* 두 개의 오브젝트 중 하나의 오브젝트만 움직인다면, 움직이는 오브젝트가 RigidBody 컴퍼넌트를 가지고 있어야 합니다.


#2 Collision

Collision실제로 물리적 충돌을 감지하여 충돌을 처리하는 클래스입니다.

* 따라서 두 오브젝트 모두 RigidBody 컴퍼넌트의 Is Kinematic (체크 하면 외부 물리효과를 무시함.) 항목이 비활성화 되어 있어야만 합니다.

 

[Collision 관련 함수]

OnCollisionEnter(Collision collision) : 두 객체가 충돌 시 호출되는 함수 입니다.

OnCollisionStay(Collision collision) : 두 객체가 충돌하는 동안 호출되는 함수 입니다.

OnCollisionExit(Collision collision) : 두 객체가 충돌을 끝마치면 호출되는 함수 입니다.

 

[OnCollisionEnter() 예제]

* 좌측의 검은색 공이 우측의 흰색 공과 충돌 시 흰색 공의 색깔을 검은색으로 변하는 예제 입니다.

유니티 충돌 태그 - yuniti chungdol taegeu

검은색 공에 적용된 C# 스크립트 : BallController 

- 단순히 Input 함수들을 이용해 WASD 방향으로 이동을 수행하는 스크립트 입니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallController : MonoBehaviour
{
    [SerializeField]
    private float _speed = 10.0f;

    void Start()
    {
        //rigid = GetComponent<Rigidbody>();
    }

    void Update()
    {
        Move();
    }

    void Move()
    {
        if (Input.GetKey(KeyCode.W))
        {
            transform.Translate(Vector3.forward * _speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.S))
        {
            transform.Translate(Vector3.back * _speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.A))
        {
            transform.Translate(Vector3.left * _speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.D))
        {
            transform.Translate(Vector3.right * _speed * Time.deltaTime);
        }
    }
}

흰색 공에 적용된 C# 스크립트 : CollisionDetected

- OnCollisionEnter() 함수를 이용해 , 충돌을 감지하여 충돌 시 공의 색상을 검은색으로 바꿔주는 기능을 수행합니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CollisionDetected : MonoBehaviour
{
    MeshRenderer mesh;
    Material mat;

    void Start()
    {
        mesh = GetComponent<MeshRenderer>();
        mat = mesh.material;
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.name == "Sphere")
        {
            mat.color = new Color(0, 0, 0);
        }
    }
}

 

[실행결과]

유니티 충돌 태그 - yuniti chungdol taegeu

#3 Trigger

Trigger은 Collision과 달리 Collider 를 이용해 충돌을 감지하는 클래스 입니다. 실제적인 물리적 충돌 연산을 하지 않고, 충돌을 감지 하기에 Is Kinematic 의 활성화 여부는 영향을 받지 않습니다. 따라서, 파라미터도 Collision이 아닌 Collider 입니다. 단, Trigger을 사용하기 위해서는 해당하는 게임 오브젝트의 Collider에 Is Trigger 항목을 활성화 해 주어야 합니다.

* 보통 특정 영역에 오브젝트가 진입했을 시 , 이벤트가 발생하는 상황에서 자주 사용됩니다. 

 

[Trigger 관련 함수]

OnTriggerEnter(Collider other) : 두 객체가 충돌 시 호출되는 함수 입니다.

OnTriggerStay(Collider other) : 두 객체가 충돌하는 동안 호출되는 함수 입니다.

OnTriggerExit(Collider other) : 두 객체가 충돌을 끝마치면 호출되는 함수 입니다.

 

[OnTriggerStay() 예제]

* 검은색 공이 투명한 큐브 영역에 들어갈 시 공의 색이 하얀색으로 변하는 예제 입니다.

유니티 충돌 태그 - yuniti chungdol taegeu

[사전작업]

* Cube 오브젝트의 Collider에서 Is Trigger 항목을 활성화 해 줍니다.

유니티 충돌 태그 - yuniti chungdol taegeu

검은색 공에 적용된 C# 스크립트 : BallController (#2와 동일) 

TriggerDetected - OnTriggerStay() 함수를 이용해 검은색 공이 박스 영역에 진입 시, 색깔이 흰색으로 바뀌는 역할을 수행합니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TriggerDetected : MonoBehaviour
{
    MeshRenderer mesh;
    Material mat;

    void Start()
    {
        mesh = GetComponent<MeshRenderer>();
        mat = mesh.material;
    }

    private void OnTriggerStay(Collider other)
    {
        if(other.gameObject.name == "Cube")
        {
            mat.color = new Color(1, 1, 1);
        }
    }

}
유니티 충돌 태그 - yuniti chungdol taegeu

반응형

공유하기

게시글 관리

구독하기novDev

  • 카카오스토리
  • 트위터
  • 페이스북

'GameDevelop > Function&Interface' 카테고리의 다른 글

[Unity Function] Invoke() 관련 함수  (0)2021.06.26[Unity Function] 플레이어 점프 구현 Physics2D.OverlapCircle()  (0)2021.06.25[Unity Interface] IPointer Interface (마우스 클릭 / 터치 반응 인터페이스)  (2)2021.06.25

유니티, 유니티3D, 충돌감지, 충돌처리

'GameDevelop/Function&Interface' 관련 글

더 보기

[Unity Function] Invoke() 관련 함수

  • 2021.06.26

더 읽기

[Unity Function] 플레이어 점프 구현 Physics2D.OverlapCircle()

  • 2021.06.25

더 읽기

[Unity Interface] IPointer Interface (마우스 클릭 / 터치 반응 인터페이스)

  • 2021.06.25

더 읽기

댓글(0)

비밀 글

등록