Menu
CoddyTech

충격으로 부서지기

Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 10번째.

충격은 얼마나 강했을까요? collision.relativeVelocity는 두 오브젝트가 서로 부딪히는 순간 서로를 향해 얼마나 빠르게 다가가고 있었는지를 나타내며, 그 magnitude는 충돌 속도(m/s)입니다. 이는 속도의 차이입니다. 10 m/s로 달리던 자동차가 같은 방향으로 8 m/s로 가는 자동차와 부딪히면 충돌 속도는 겨우 2 m/s이며, 두 자동차 모두 같은 충돌 속도를 인식합니다.

이 알은 crackSpeed보다 빠르게 착지하면 깨집니다. 1 m 높이에서 떨어뜨리면 약 4.4 m/s(2 x 9.81 x 1의 제곱근)로 부딪히고, 2 m 높이에서는 약 6.3 m/s로 부딪힙니다.

public float crackSpeed = 5f;

void OnCollisionEnter(Collision collision)
{
    if (collision.relativeVelocity.magnitude > crackSpeed)
    {
        Debug.Log("Splat!");
        Destroy(gameObject);
    }
}

왜 알 자체의 rb.linearVelocity를 사용하지 않을까요? OnCollisionEnter가 실행될 때쯤이면 물리 엔진이 이미 충돌을 처리했으므로, 알의 속도는 충돌 후 남은 값으로 거의 0에 가깝습니다. relativeVelocity는 충돌 자체의 속도를 유지합니다. 속도이므로 질량은 영향을 주지 않습니다. 무거운 알과 가벼운 알이 6 m/s로 착지하면 둘 다 같은 값인 6을 보고합니다.

challenge icon

챌린지

쉬움

Window.cs를 작성하세요. 창문은 충격을 받을 때마다 약해지고, 강도가 0이 되면 산산조각 납니다.

  1. 창문의 OnCollisionEnter에서 collision.relativeVelocity.magnitude를 strength에서 빼세요.
  2. strength <= 0f이면 Destroy(gameObject);를 호출하세요.

‘플레이’를 누르고, 위쪽 화살표 키로 약하게 공을 굴린 다음 스페이스 키로 세게 굴리세요. 창문이 깨집니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

public class Window : MonoBehaviour
{
    public float strength = 10f;

    // 충돌할 때마다 충돌 속도만큼 strength가 감소하며, 0이 되면 창문이 산산조각 납니다
}

물리와 게임플레이의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드