[Unity] 오브젝트 통과와 충돌, 제거(Collider / Rigid Body / Destroy)

2023. 8. 17. 15:38Unity

728x90
반응형

오브젝트 통과

하나의 게임 오브젝트가 다른 오브젝트와 충돌하면 OnTriggerEnter를 호출하게 되며 둘 다 Collider가 있어야 한다. 플레이어 오브젝트에 Rigid Body가 있어야 하며 Is Kinematic 체크가 활성화되어있어야 한다. 두 오브젝트 모두 Is Trigger 체크박스를 활성화하면 충돌이 발생하지 않으므로 하나에만 체크해야 한다.

(**Is Kinematic 체크 활성화는 물리 계산을 하지 않는다는 뜻이다. Kinematic 뜻 자체가 운동학이라는 뜻이라 조금 헷갈린다.)

 

 

public class MoveScript : MonoBehaviour
{
    public float speed = 2;

    private void OnTriggerEnter(Collider other)
    {
        print("OnTriggerEnter");
    }

    private void OnTriggerStay(Collider other)
    {
        print("OnTriggerStay");
    }
    private void OnTriggerExit(Collider other)
    {
        print("OnTriggerExit");
    }

    void Update()
    {
        Vector3 dir = Vector3.zero;
        if (Input.GetKey(KeyCode.RightArrow))
        {
            dir += Vector3.right;
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            dir += Vector3.left;
        }
        if (Input.GetKey(KeyCode.UpArrow))
        {
            dir += Vector3.forward;
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            dir += Vector3.back;
        }
        transform.Translate(dir.normalized * Time.deltaTime * speed);
    }
}

네 방향으로 움직이며 Is Trigger, Is Kinematic이 켜져 있는 플레이어 오브젝트가 다른 오브젝트를 통과할 때 위와 같은 코드로 통과했는지를 알 수 있다.

 

 


 

 

오브젝트 충돌

오브젝트가 충돌하여 튕겨져 나가게 하기 위해서는 큰 Plane을 Static으로 깔아준 후 플레이어 오브젝트에 [Is Trigger 비활성화, Use Gravity 활성화, Is Kinematic 비활성화, Mass 수치 조정]을 하고 상대 오브젝트에는 [Is Trigger 비활성화, Use Gravity 활성화, Is Kinematic 비활성화, Mass 수치 조정]을 하면 된다.

빨간색 플레이어 오브젝트가 부딪히면서 이동 방향이 바뀌어 바닥에 계속 충돌하는 오류가 생겼는데, 플레이어가 튕겨져나가게 하지 않기 위해서는 Is Kinematic을 활성화하면 된다.

 

 


 

 

물체의 제거(Destroy)

private void OnTriggerEnter(Collider other)
{
    Destroy(other.gameObject, 1.0f);
    print("OnTriggerEnter");
}

Destroy를 이용해 물체에 닿을 때 해당 오브젝트를 삭제할 수 있다. Destroy(other);만 하면 해당 콜라이더만 지우는 것이므로 Destroy(other.gameObject);로 해당 게임 오브젝트를 삭제하며 1.0f를 통해 1초 뒤에 지우게 할 수 있다.

728x90
반응형