Byn's Research Note

AI based Mixed Reality, Human-Computer Interaction

↓ My Web CV & Portfolio 자세히보기

Extended Reality/3D Engine Development

Unity Development [2] : 물리 시뮬레이션

JaehyeonByun 2024. 10. 7. 11:15

콜라이더는 유니티에서 가장 많이 쓰이는 것 중 하나로, 충돌을 감지할 때 쓰입니다.

3D에서는 Box Collider, Sphere Collider, Capsule Collider,
2D에서는 Box Collider2D와 Circle Collider2D가 대표적으로 쓰입니다.

콜라이더의 형태가 간단할수록 기기에 부하를 주지 않습니다. 

 

왼쪽부터 박스콜라이더, 캡슐콜라이더, 스피어콜라이더

위 그림은 콜라이더가 충돌을 감지하는 영역을 나타냅니다.

 

콜라이더의 요소

1. Box Collider

isTrigger은 나중에 설명할 예정이니 지금은 무시합시다.

Material은 물체 표면의 물리적 특성을 나타냅니다. 물체 표면의 마찰계수, 탄성계수, 정지마찰력 등을 설정할 수 있습니다. 물리 머터리얼을 따로 만들어 넣습니다.

Center은 콜라이더의 위치를 의미합니다. 게임 오브젝트의 로컬좌표를 기준으로 합니다.

Size는 충돌 판정 영역의 크기를 의미합니다. 이 역시 부모의 크기를 기준으로 합니다.

 

2. Capsule Collider

Center까지는 박스 콜라이더와 동일합니다.

Radius는 캡슐의 반지름을 의미합니다. 이 값이 Height보다 클 경우 그냥 구체가 되어버립니다.

Height는 콜라이더의 크기를 의미합니다.

Ditection은 캡슐이 향하는 방향을 의미합니다. 축의 방향은 로컬 좌표계를 따릅니다.

 

3. Sphere Collider

스피어 콜라이더는 캡슐콜라이더에서 Height를 제외한 것과 같습니다.

 

트리거(Is Trigger)

콜라이더끼리 충돌을 하면 부딪치므로써 작용반작용이 작용해버립니다. 물체를 통과하면서 이 콜라이더를 지나쳤는지 알고 싶다면 트리거를 사용하면 됩니다.

   

좌측은 트리거를 해제하였을 때, 우측은 트리거를 체크하였을 때의 차이입니다.

 

 

충돌 감지하기

충돌 감지를 하기위해 Enter, Stay, Exit가 쓰입니다. 

OnCollisionEnter 물체가 콜라이더와 충돌할 때 한 번 실행됩니다.
OnCollisionStay 물체가 콜라이더와 충돌하는 동안 실행됩니다.
OnCollisionExit 물체가 콜라이더와 충돌을 끝낼 때 한 번 실행됩니다.
void OnCollisionEnter(Collision collision) {
        //실행문
    }

void OnCollisionStay(Collision collision) {
        //실행문
    }
    
void OnCollisionExit(Collision collision) {
        //실행문
    }

위 함수가 실행될 때 매개변수로 지정된 collision을 통해 충돌한 물체의 요소들을 사용할 수 있습니다.

 

트리거 충돌 감지하기

트리거의 충돌을 감지할 때에는 조금 달라집니다.

트리거가 어느 쪽이든 실행됩니다.

OnTriggerEnter 트리거와 물체가 충돌할 때 한 번 실행됩니다
OnTriggerStay 트리거와 물체가 충돌하는 동한 실행됩니다
OnTriggerExit 트리거와 물체의 충돌이 끝날 때 한 번 실행됩니다
void OnTriggerEnter(Collider other) {
        //실행문
    }
    
void OnTriggerStay(Collider other) {
        //실행문
    }
    
void OnTriggerExit(Collider other) {
        //실행문
    }

 

물리 머터리얼

Dynamic Friction은 물체가 움직일 때 작용하는 마찰력입니다.

Static Friction은 물체가 정지할 때의 마찰력입니다. 

Bounciness는 탄성계수를 나타냅니다.

Combine들 (두 값이 다를 때 어떤 값을 따를 것이냐)

Average 두 값의 평균
Minimum 두 값 중 작은 값
Maximum 두 값 중 큰 값
Multiply 두 값의 곱

만약 두 콜라이더에 설정된 Combine이 다를 경우 Average < Minimum < Multiply < Maximum 순을  따른다

 

그냥 몇 가지 적어놓기

  • 두 물체 간에 충돌을 내고 싶다면 두 물체 모두 콜라이더가 있어야 합니다.
  • 리지드바디는 없어도 콜라이더만 있다면 충돌합니다. 리지드바디가 없다면 물리가 작용하지 않을 뿐
  • 트리거끼리는 충돌감지가 되지 않습니다.

https://docs.unity3d.com/kr/2018.4/Manual/CollidersOverview.html

 

콜라이더 - Unity 매뉴얼

콜라이더(Collider) 컴포넌트는 물리 충돌 처리를 위한 오브젝트의 형태를 정의합니다. 콜라이더는 보이지 않는 요소이므로 오브젝트의 메시와 정확히 동일한 모양일 필요는 없으며, 실제로는 게

docs.unity3d.com

 

임의로 콜라이더 생성

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

public class JointCapsuleCollider : MonoBehaviour
{
    public Transform bottomObject; // 콜라이더의 밑변을 맞출 오브젝트
    public Transform topObject; // 콜라이더의 윗변을 맞출 오브젝트
    private CapsuleCollider capsuleCollider;

    void Start()
    {
        // Capsule Collider 추가 (이미 있으면 생략 가능)
        capsuleCollider = gameObject.AddComponent<CapsuleCollider>();
        capsuleCollider.direction = 1; // Y축을 기준으로 콜라이더의 방향 설정
    }

    void Update()
    {
        // 두 오브젝트 사이의 방향과 거리를 계산
        Vector3 direction = topObject.position - bottomObject.position;
        float distance = direction.magnitude;

        // 콜라이더의 위치를 두 오브젝트 사이의 중간 지점으로 설정
        transform.position = (bottomObject.position + topObject.position) / 2;

        // 콜라이더의 회전을 두 오브젝트를 잇는 방향으로 설정
        transform.rotation = Quaternion.FromToRotation(Vector3.up, direction.normalized);

        // 콜라이더의 높이를 두 오브젝트 사이 거리로 설정
        capsuleCollider.height = distance;

        // 콜라이더의 반지름은 상황에 맞게 설정
        capsuleCollider.radius = 0.05f; // 원하는 반지름 값으로 설정
    }
}