본문 바로가기

유니티 3D기본(Roll A Ball)

11. 물리 충돌 이벤트

물리 충돌 이벤트를 알아보겠습니다.

크게 두가지 방식으로 나뉩니다.

 

1. 물리적 충돌 감지

    - OnCollisionEnter : 물리적 충돌이 시작할 때 

    - OnCollisionExit : 물리적 충돌이 끝날 때 

    - OnCollisionStay : 물리적 충돌이 감지되고 있을 때 

 

2. 콜라이더 겹침 감지

    - OnTriggerEnter : 콜라이더 겹침이 시작할 때 

    - OnTriggerExit : 콜라이더 겹침이 끝날 때 

    - OnTriggerStay : 콜라이더가 겹치고 있을 때

 

물리적 충돌이란?

    - 말 그대로 오브젝트와 오브젝트가 그냥 물리적으로 충돌하는 걸 말합니다.

콜라이더 겹침이란? 
    - 오브젝트엔 콜라이더 컴포넌트가 있습니다. 이 콜라이더가 다른 콜라이더와 겹쳤을 때를 말합니다. 

 

 

우선 예제를 위해 스테이지를 만들었습니다.

 

OnCollisionEnter

Player 공이 다른 공과 충돌 했을 때 그 공의 색깔을 바꿔보는 걸로 하겠습니다.

우선 색깔을 바꿀 공들의 Material을 가져와야하는데, Material은 MeshRenderer안에 있으므로, 메쉬렌더러부터 가져옵니다.

 

소스코드

public class OtherBalls : MonoBehaviour
{

    MeshRenderer mesh; 
    Material mat;

    void Start()
    {
        mesh = GetComponent<MeshRenderer>();
        mat = mesh.material; //Material은 MeshRenderer안에 있습니다.
    }

    void OnCollisionEnter(Collision collision) //매개변수로 충돌 클래스 제공, 충돌한 상대의 정보가 담겨있습니다.
    {
        if (collision.gameObject.name == "Player") { //조건문으로 충돌한 상대의 name 확인 
            mat.color = new Color(0, 0, 0); //Color는 Material안에 있습니다.
        }
    }

    void OnCollisionExit(Collision collision)
    {
        if (collision.gameObject.name == "Player") {
            mat.color = new Color(1, 1, 1);
        }
    }

}

 

인게임

 

OnTriggerStay

이번엔 Player 공이 큐브안에 들어가면 위로 떠오르는 동작을 만들어보겠습니다.

그리고 OnTrigger 함수들은 isTrigger을 체크해야만 동작합니다. 콜라이더 겹침 검사를 할 상대오브젝트의 콜라이더 컴포넌트에서 isTrigger을 체크합니다.

위의 경우는 상대 오브젝트가 Cube이니 Cube의 isTrigger을 체크해야겠네요.

 

소스코드

public class MyBall : MonoBehaviour
{
    Rigidbody rigid;

    void Start()
    {
        rigid = GetComponent<Rigidbody>();    
    }
    void FixedUpdate()
    {
        Vector3 vec = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
        rigid.AddForce(vec, ForceMode.Impulse);
    }

    void OnTriggerStay(Collider other) //겹친 상대 콜라이더의 정보를 가져옵니다.
    {
        if (other.name == "Goal") { //조건문으로 상대의 정보를 활용할 수 있습니다.
            rigid.AddForce(Vector3.up * 2, ForceMode.Impulse); //AddForce를 위쪽 방향으로
        }
    }



}

 

인게임