본문 바로가기
Learning/Unity

유니티 강좌_#05_ 컬라이더

by HappyStar 2020. 9. 7.
반응형

오늘은 컬 라이더에 대해서 알아보도록 하겠습니다. 컬 라이더는 오브젝트를 충돌시키는 기능을 가진 컴포넌트입니다.

AddComponent에서 collider라고 쳐 봅시다. 그러면 여러 가지 종류의 컬 라이더가 나타납니다. 컬라이더 명 뒤에 2D가 붙는다면 2D환경에서 사용하는 컬라이더고, 컬라이더 명 뒤에 아무 글자가 없다면 3D 환경에서 사용하는 컬 라이더입니다. 

 

BoxColider 사용하기

AddComponent에서 BoxCollider를 cube에 추가해주세요. 그리고 큐브도 하나 더 만들어 주세요. 그리고 큐브 두 개의 좌표를 0,0,0으로 정렬하고 Rigidbody가 없는 큐브를 선택하여 Y좌표를 -2로 설정해주세요. 그리고 실행을 해봅시다. 그러면 첫 번째 사진처럼 두 개가 정지해있다가 위쪽 큐브가 아래 큐브에 떨어지면서 충돌하며 겹쳐집니다. 이렇게 겹쳐지는 이유는 위쪽 큐브에 BoxCollider를 사용했기 때문입니다. Collider 앞에서 충돌시키는 기능을 가지고 있다고 하였습니다. 그런데 컬 라이더의 종류가 무엇 때문에 이렇게 많은 것일까요? 그 이유는 오브젝트의 모양에 따라 사용하는 Collider가 다르기 때문입니다. 

 

-Edit Collider : 실제로 충돌하는 위치를 정할 수 있습니다. 

 

위와 같이 BoxCollider의 Y좌표를 늘리게 되면 실제로 큐브의 밑면에서 충돌하는 게 아니라 초록색 부분의 밑면이 충돌하게 됩니다. 아래는 실행결과입니다. 위쪽 큐브의 밑면에서 충돌하지 않고 아까 늘렸던 부분과 충돌한다는 사실을 알 수 있습니다.

 

-Is Trigger : 충돌을 감지하는 기능을 가지고 있습니다. 

-Material : Materail은 재료, 물질이라는 뜻을 가지고 있습니다. 이곳에는 물리적인 물질을 추가하면 되는 데요. 한 번 추가해보도록 하겠습니다. Project창에서 우클릭-Create-PhysicsMaterial을 선택하시면 아래와 같은 아이콘이 나타납니다.

그리고 이름을 정해주시고, 아이콘을 클릭해주세요. Inspector창에서 Bounciness를 5로 정해봅시다.

그런 다음 Cube에서 BoxCollider의 Material에 추가해봅시다. 그러면 실행했을 때 큐브가 충돌했을 때 위로 튀어 올랐다가 점점 멈추게 됩니다. 신기하죠? 

 

-Dynamic Friction : 이동 중에 사용되는 마찰입니다. 마찰을 0으로 해주시면 얼음처럼 미끄러지게 됩니다. | 값 : 0~1

-Static Friction : 정지해 있을 때 사용되는 마찰입니다. | 값 : 0~1 

-Bounciness : 반동을 정할 수 있습니다. 0은 반동을 하지 않고, 1은 에너지를 손실하지 않고 반동을 하게 됩니다. 값 : 0~1

-Friction Combine : 마찰의 정도를 정할 수 있습니다. Average는 적당히 움직이다가 에너지가 감소하게 되고 Maximum은 마찰이 없어지게 됩니다.

-Bounce Combie : 반동의 정도를 정할 수 있습니다. Average는 적당히 튕기다가 에너지가 감소하게 되고 Maximum은 계속 튀어 오르게 됩니다. 하지만 마찰이 있다면 계속 튀지 않고 언젠가는 멈추게 됩니다. 다시 BoxCollider설명으로 돌아가겠습니다.

 

- Center : 컬 라이더 중심의 위치를 정할 수 있습니다.

- Size : 컬 라이더의 크기를 섬세하게 변경할 수 있습니다.

 

스크립트로 컬라이더 제어하기

public class Test : MonoBehaviour
{
    private BoxCollider collider;
    void Start()
    {
        collider = GetComponent<BoxCollider>();
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.D))
        {
            Debug.Log("Collider-Bounds : " + collider.bounds);
            Debug.Log("collider-bounds-extents" + collider.bounds.extents);
            Debug.Log("collider-bounds-extents-z" + collider.bounds.extents.z);
            Debug.Log("collider-size" + collider.size);
            Debug.Log("collider-center" + collider.center);
        }
    }
}

 

-GetKeyDown : 키보드를 눌렸을 때 처음 한 번만 작동합니다.

-bounds : 컬 라이더의 중심 좌표와 컬라이더의 사이즈의 반이 나타납니다.

-extents : 컬라이더 사이즈의 반이 나타납니다.

-size : 컬라이더의 실제 크기가 나타납니다,

-center : 컬라이더의 중심 좌표를 나타냅니다.

 

 

실행결과

 

위에 나온 값들을 출력만 하지 말고 직접 수정할 수도 있습니다. 하지만 bounds는 수정 할 수 없습니다. extents도 수정 할 수 없습니다.

collider.size = new Vector3(1, 1, 1);
collider.center = new Vector3(3, 0, 2);

 

컬 라이더 관련 메서드

public class Test : MonoBehaviour
{
    private BoxCollider collider;
    void Start()
    {
        collider = GetComponent<BoxCollider>();
    }
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray testRay = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit testRayHit;
            if(collider.Raycast(testRay, out testRayHit, 1000))
            {
                this.transform.position = testRayHit.point;
            }
        }
    }
}

 

-Camera : 현재 게임 뷰에 보이는 화면이라고 생각하면 됩니다.

-main : main 카메라를 가리킵니다.

-ScreenPointToRay : 특정 좌표에 레이저를 쏘는 기능을 가지고 있습니다.

-RaycastHit : 레이저를 쏜 곳의 정보를 가지고 있습니다.

-Raycast : 레이저를 발사하고 특정한 곳에 접촉하게 되면 RaycastHit에 정보를 입력합니다. 3개의 매개변수에는 각각 Ray, RaycastHit, 사정거리를 입력해줍니다.

 

위 코드를 입력한 뒤 실행하시면 큐브의 내부에서 클릭한 곳으로 큐브의 중심이 이동하게 되며 maincamera로 점점 다가오게 됩니다. 

 

public class Test : MonoBehaviour
{
    private BoxCollider testcollider;
    void Start()
    {
        testcollider = GetComponent<BoxCollider>();
    }

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("접촉하였습니다.");
    }

    private void OnTriggerExit(Collider other)
    {
        Debug.Log("접촉영역에서 벗어났습니다.");
    }

    private void OnTriggerStay(Collider other)
    {
        other.transform.position += new Vector3(0, 0, 0.01f);
    }

}

 

-OnTriggerEnter : 다른 오브젝트와 접촉했을 때 실행되는 내장 함수입니다.

-OnTriggerExit : 오브젝트와 접촉되어 있다가 접촉하지 않았을 때 실행되는 내장 함수입니다.

-OnTriggerStay : 오브젝트가 접촉이 꾸준히 머무르고 있을 때 실행되는 내장 함수입니다.

 

실행결과

 

처음에 둘이 포개져 있으니 큰 큐브가 z 축 방향으로 이동을 하고 접촉했을 때 로그가 찍히고, 큰 큐브가 큐브와 떨어졌을 때 로그가 찍힙니다. 그리고 중요한 것은 BoxCollider에서 Is Trigger를 꼭 체크해주셔야 합니다.

 

public class Test : MonoBehaviour
{
    private BoxCollider testcollider;
    void Start()
    {
        testcollider = GetComponent<BoxCollider>();
    }

    private void OnCollisionEnter(Collision collision)
    {
        
    }

    private void OnCollisionExit(Collision collision)
    {
        
    }

    private void OnCollisionStay(Collision collision)
    {
        
    }
}

 

-OnCollisionEnter : 다른 오브젝트가 특정한 오브젝트에 물리적으로 부딪쳤을 때 실행되는 내장 함수입니다.

-OnCollisionExit : 다른 오브젝트가 물리적으로 겹쳐져 있지 않았을 때 실행되는 내장 함수입니다.

-OnCollisionStay : 다른 오브젝트가 물리적으로 머물러 있을 때 실행되는 내장 함수입니다.

 

OnTrigger와 OnCollision은 Is Trigger가 체크되어 있나 없나의 차이 입니다. Is Trigger가 체크 되어 있으면 OnTrigger 아니면 OnCollision을 사용하면 됩니다.

 

오늘 강의는 여기서 마치도록 하겠습니다. 다음 강의도 기대해주세요!^^

반응형

댓글