TIL

2024/02/02 TIL (충격량을 측정하는 법)

미역제자 2024. 2. 2. 20:57


유니티에서 충격량 측정

 

충격량 측정

충격량(I)은 운동량의 변화량(ΔP)과 같고, 충격력과 충돌시간(Δt)의 곱과 같다.
두 물체의 질량은 일정(m = const.), 물체의 충돌 시간은 일정하다고 가정할 때: I = m(v - v0)를 사용

따라서 우리는 물체의 충격량을 계산하려면 두 물체의 속도 차이를 비교하면 된다.

 

우리는 물체에 Rigidbody를 달아놓은 상태이다. -> 따라서 rigidbody.velocity를 사용해서 물체의 속도를 측정할 수 있다.
velocity를 받아오는 방법은 collider의 isTrigger를 사용할 생각이다.

  1. 부서지는 물체에 isTrigger가 걸려있는 collider를 추가
  2. collider안에 특정 레이어(혹은 tag)가 달려있는 물체가 들어오면
  3. 그 물체의 속도(a)와 본인의 속도(b)를 캐싱
  4. |b-a|를 구해서 특정 값을 넘어설 경우(특정 충격량을 넘어섰다고 판단) 파괴 애니메이션 출력

 

실제 게임상에서 대입

 

유리가 추락 시 일정 속도 이상이면(일정 충격량 이상이면) 파괴되도록 하는 스크립트 제작

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

public class CheckObjectVelocity : MonoBehaviour
{
    private Brack distroy;
    private Rigidbody rb;
    [SerializeField] private float distroyVelocity;

    private void Awake()
    {
        distroy = GetComponentInParent<Brack>();
        rb = GetComponent<Rigidbody>();
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (rb.velocity.magnitude > distroyVelocity || collision.rigidbody.velocity.magnitude > distroyVelocity)
        {
            distroy.Destroing();
        }
    }
}

 

문제 발생

유리가 추락할 때 깨지지 않음. Why?

  • 물체가 충돌하는 순간 측정하는 속도가 이미 추락 후 0이 된 속도를 측정하기 때문에 .magnitude값이 기준치보다 낮게 측정됨

해결 방안

  • 자식의 빈 오브젝트에 box collider를 하나 달고, IsTrigger를 켜줘서 그 충돌하기 직전의 속도를 측정함.

문제 발생 2

  • 방금 집어넣은 Collider가 기존에 시간을 되감는걸 담당하는 collider를 막아서 시간 되감기가 안됨.

해결 방안 2

  • 방금 집어 넣은 collider에 새로운 layer를 달아서 ray가 무시하고 지나가도록 수정

'TIL' 카테고리의 다른 글

2024/02/25 TIL (Localization 사용법)  (0) 2024.02.25
2024/02/06 TIL  (1) 2024.02.07
2024/02/01 TIL (Rendering_Lighting 문제)  (0) 2024.02.02
2024/01/31 TIL (움직임 구현에 대한 고찰)  (0) 2024.02.01
2024/01/30 TIL (시간 및 프레임)  (0) 2024.01.31