본문 바로가기

유니티/유니티 엔진

[유니티] 물리엔진, 충돌 (Rigidbody, Collider, OnCollisionEnter)

728x90
반응형

 물리엔진

 

유니티는 물리엔진이 내장되어있어서 컴포넌트의 형태로 이를 제공하고 있다.

이를 이용해 우리는 물리현상을 직접 구현하지 않고 컴포넌트를 통해 사용할 수 있다.

 

 

 

 

 

 

계산비용

 

유니티에 내장되어있는 물리엔진은 계산 비용이 높다.

0.02초에 한번씩 호출하여서 물리 연산이 중요하지 않으면 이를 조정하여 최적화 하는 것도 가능하다.

 

Edit - Project Settings - Time - Fixed Timesetp 에서 이를 조정할 수 있다.

 

 

 

 

 

 

 

 Rigidbody

 

rigidbody 컴포넌트를 사용하면 해당 오브젝트는 유니티 물리 엔진의 영향을 받게 된다.

 

오브젝트에 컴포넌트를 추가하고 싶으면 Hierarchy 창에서 오브젝트를 선택한 후 Inspector 창에서 Add Component 를 눌러서

원하는 컴포넌트를 추가할 수 있다.

 

여기서 Rigidbody 2D 와 Rigidybody 3D 는 각각 2D 와 3D 에서 사용할 수 있는 컴포넌트이므로 상황에 맞게 선택하면 된다.

 

 

 

 

 

 

 

 Collider

 

collider 컴포넌트는 오브젝트 간의 충돌을 구현해준다.

 

물론 오브젝트간의 좌표를 활용하여 충돌을 구현할 수도 있겠지만 충돌의 세부적인 히트박스 등을 구현하기 위해서는

제공된 컴포넌트를 사용하는 것이 유리할 것이다.

 

Collider 컴포넌트의 Edit Collider 를 이용하면 원하는 대로 히트박스를 구현할 수 있다.

 

 

 

 

 

collider 컴포넌트가 적용된 두 오브젝트는 서로 겹쳐질 수 없다.

collider 컴포넌트가 충돌을 구현해주는 역할을 하므로 당연한 것이라고 할 수 있다.

 

그런데 만약 관통하는 화살이나 탄환 등을 구현하고 싶다면 어떻게 해야할까?

 

이 때 사용할 수 있는 것이 Collider 컴포넌트의 기능 중 하나인 is Trigger 이다.

 

is Trigger 의 체크박스를 선택하면 충돌을 감지만 할 뿐 엔진 내부에서 실제로 충돌이 일어나지는 않는다.

 

 

 

 

 

 

 

 

 

 충돌판정 (OnCollisionEnter)

 

OnCollisionEnter 함수를 이용하여 Collider 컴포넌트가 적용된 오브젝트 간의 충돌을 감지할 수 있다.

 

스크립트를 적용한 오브젝트와 Apple 이라는 이름의 오브젝트의 충돌을 감지하는 코드를 작성해보겠다.

 

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

public class PlayerMove : MonoBehaviour
{
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.name == "Apple")
        	Debug.Log("충돌!");

    }

    // Start is called before the first frame update
    void Start()
    {
    
    }

    // Update is called once per frame
    void Update()
    {
    
    }
}

 

위 코드를 적용시킨 후 실행시켜보면 Apple 이라는 이름의 오브젝트와 충돌할 때마다

콘솔창에 "충돌!" 이라고 출력될 것이다.

 

 

728x90
반응형