Unity_04 Rigidbody, 충돌 처리, Layer, Raycast, Gizmo

SeonggyuMin·2025년 4월 17일

Unity

목록 보기
3/11

1. Rigidbody

Rigidbody

  • Mass: 질량
    - kg 단위이며 힘, 충돌 반응 시 차이 발생
  • Drag: 공기 저항
    - Rigidbody의 속도가 자동으로 줄어드는 정도
  • Angular Drag: 회전 저항
    - 회전이 자동으로 줄어드는 정도(0이면 영원히 굴러감)
  • Use Gravity: 중력 적용 여부
    - 체크 해제하면 공중에 떠 있음
  • is Kinematic: 물리 연산 제외
    - 충돌 반응, AddForce X
    - 문, 승강기 등 물리 없이 움직이는 오브젝트에 주로 사용
  • Interpolate: 프레임 사이 움직임 보간
    - None(기본값): 위치 그대로 표시
    - Interpolate: 이전 위치와 현재 위치를 보간
    - Extrapolate: 미래 위치 예측해서 표시
  • Collision Detection: 충돌 감지 정확도
    - Discrete(기본값): 일반 충돌
    - Continuous: 빠른 물체가 정적 콜라이더를 뚫고 지나가는 것을 방지
    - Continuous Dynamic: 빠른 물체가 빠른 물체를 뚫고 지나가는 것을 방지
    - Continuous Speculative: 예측 기반 충돌, 안정성은 증가하지만 덜 정확할 수 있음
    - 물리엔진은 0.02초 마다 물리를 계산하는데, 그 사이에 일어난 일은 무시될 수 있음 - 프레임 사이에 계산, ccd - 비현실적인 충돌 무시는 줄어들고 대신 성능적 부담 증가
  • Constraints: 제약 위치/회전 고정
    - 특정 위치 또는 회전 축을 잠금 처리

현실과 동일하게 유니티에서도 질량이 크다고 해서 더 빨리 떨어지지 않는다.

Main Menu(좌상단) - Edit - Project Settings - Physics - Gravity에서 다양한 물리 설정을 전체적으로 수정 가능하다. 예를 들면 프로젝트 전체의 중력 가속도 등 수정이 가능 가능하다. 많은 게임들에서는 빠른 것을 선호하여 중력가속도를 -9.81로 사용하지 않고 -25, -30 등을 주로 사용하기도 한다.

Rigidbody rigidbody => 예전 버전에 쓰이던 기본적인 기능이랑 같은 이름이라 new 붙이면 사라짐(transform, gameObject처럼)

AddForce - 힘 가해주기(가속)

  • ForceMode.Force(기본값): 질량에 따라 적용
  • ForceMode.Impulse: 질량과 관계 없이 가속
  • ForceMode.VelocityChange: 질량 무시, 즉시 속도 변화
  • Acceleration: 질량 무시, 가속도 적용
rigidbody.AddForce(Vector3.right * xInput * power, ForceMode.Force);

velocity - 속도를 설정하기(속도 직접 설정)

rigidbody.velocity = Vector3.right * power * xInput;

AddTorque - 회전력 가해주기

rigidbody.AddTorque(Vector3.up * xInput * power);

angularVelocity - 회전력 직접 설정

rigidbody.angularVelocity = Vector3.up * power * xInput;

2. 충돌 처리

충돌 처리는 Rigidbody와 Collider를 통해 이뤄진다. 상황에 따라 IsTrigger 사용 여부를 선택하고 Collision과 Trigger로 사용한다.

1. 충돌 (Collision)

충돌체 : 게임오브젝트의 물리적 충돌을 목적으로 모양을 정의
게임오브젝트 간의 충돌체로 부딪힘과 반발력을 처리하며 충돌체는 충돌상황에 있을 경우 유니티 충돌 메시지를 받아 상황을 확인한다.

충돌 메서드

OnCollisionEnter(Collision other) // Enter : 충돌이 실행될 때 1회 실행

OnCollisionStay(Collision other)  // Stay : 충돌이 유지되는 동안 반복적으로 실행

OnCollisionExit(Coliision other)  // Exit : 충돌이 종료될 때(벗어나는 순간) 1회 실행

2. 트리거

하나의 충돌체가 충돌을 일으키지 않고 다른 충돌체의 공간에 들어가는 것을 감지하며 트리거는 겹침상황에 있을 경우 유니티 트리거 메시지를 받아 상황을 확인한다.

트리거 메서드

OnTriggerEnter(Collider other)    // Enter : 충돌이 실행될 때 1회 실행

OnTriggerStay(Collider other)     // Stay : 충돌이 유지되는 동안 반복적으로 실행

OnTriggerExit(Collider other)     // Exit : 충돌이 종료될 때(벗어나는 순간) 1회 실행

Stay 함수는 충돌이 유지되는 동안 지속적으로 호출되므로 사용을 지양하며, Enter와 Exit를 사용해 충돌 상태를 체크할 수 있다.

3. 충돌체 & 트리거 종류

두 게임오브젝트가 충돌하면 리지드바디의 환경설정에 따라 다른 반응을 할 수 있다. 일반적으로 Rigidbody 컴포넌트가 있는 게임오브젝트가 물리가 적용되는 것이 원칙이다.

  • 정적 충돌체 (Static Collider)
    - Rigidbody가 없는 충돌체, 외부에 힘에 움직이지 않음
    - 절대로 움직이지 않는 지형, 구성요소에 주로 사용
  • 리지드바디 충돌체 (Rigidbody Collider)
    - Rigidbody가 있는 충돌체, 외부에 힘을 받아 움직임
    - 충돌하여 힘을 받아 움직이는 물체에 사용
  • 키네마틱 충돌체 (Kinematic Collider)
    - Kinematic Rigidbody가 있는 충돌체, 외부의 힘에 반응하지 않음
    - 움직이지만 외부 충격에는 밀리지 않는 물체에 사용
    - Kinematic 상태를 활성화/비활성화 하여 움직임 여부를 설정하는 경우에도 사용

충돌체 & 트리거 상호작용 매트릭스

충돌체와 트리거의 종류에 따라 메시지가 전송되는 경우가 다르다

// 충돌시 충돌 메시지가 전송
//      SC  RC  KC  ST  RT  KT
// SC        O
// RC    O   O   O
// KC        O
// ST
// RT
// KT

// 트리거시 트리거 메시지가 전송
//      SC  RC  KC  ST  RT  KT
// SC                    O   O
// RC                O   O   O
// KC                O   O   O
// ST        O   O       O   O
// RT    O   O   O   O   O   O
// KT    O   O   O   O   O   O

정적충돌체(SC), 리지드바디충돌체(RC), 키네마틱충돌체(KC), 정적트리거(ST), 리지드바디트리거(RT), 키네마틱트리거(KT)

3. Layer

Layer는 많은 오브젝트를 그룹으로 묶어 계층 단위로 관리하기 위한 기능이다.

레이어는 Inspector - Layer에서 선택할 수 있다. tag와 사용법은 비슷하지만, 여러 오브젝트를 묶어서 기능적으로 관리할 수 있기 때문에 물리/충돌처리에 유용하게 활용할 수 있다.

또한 Edit - Project Settings - Physics - Layer Collision Matrix 에서 레이어끼리 서로 충돌하지 않을 것을 선택할 수 있다.

4. Raycast

레이캐스트는 시작 위치에서 방향으로 레이저를 발사하여 부딪히는 충돌체를 감지하는 기능이다.

레이캐스트는 안 쓰이는 게임을 찾기 힘들 정도로 많은 곳에서 쓰인다. FPS 게임의 저격 총, 시야 내 적 감지 기능, 마우스 클릭으로 상호작용 등에 사용된다. 그러나 매 프레임마다 레이캐스트로 검사하는 것은 많은 연산이 필요하기 때문에 대체할 수 있는 방법을 확인하는 것이 좋다.

Physics.Raycast(transform.position, transform.forward, out RaycastHit hitinfo, 10f);

레이캐스트는 기본적으로 bool을 반환한다.
매개변수

  • transform.position: 시작 위치
  • transform.forward: 쏘는 방향
  • hitinfo: 광선이 맞은 대상의 정보
  • 10f: 최대 거리

5. Gizmo

Gizmo는 실제 게임에서는 구현되지 않는 개발자의 테스트를 위한 도구이다. 씬 뷰에서만 보이게 되며, 레이캐스트 등 인위의 선을 그려 눈에 보이지 않는 요소를 테스트하기 위해 사용한다.

기즈모는 메시지 함수 OnDrawGizmos(), OnDrawGizmosSelected()에서만 사용할 수 있다.

그러나 Debug.DrawLine, Debug.DrawRay를 통해 다른 메시지 함수에서도 호출할 수 있다. 이는 씬뷰뿐만 아니라 게임뷰에서도 볼 수 있다.

6. 레이어 응용

Raycast에 레이어를 선택 적용할 수 있다.

private Camera cam;

[SerializeField] private float rayDist;

[SerializeField] private LayerMask detectionLayer;

private void Awake()
{
    cam = Camera.main;
}

private void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        RayShot();
    }
}

public void RayShot()
{
    Ray ray = cam.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;

    if (Physics.Raycast(ray, out hit, detectionLayer))
    {
        Debug.Log(hit.transform.name);
    }
}

0개의 댓글