유니티에서 충격량 측정
충격량 측정
충격량(I)은 운동량의 변화량(ΔP)과 같고, 충격력과 충돌시간(Δt)의 곱과 같다.
두 물체의 질량은 일정(m = const.), 물체의 충돌 시간은 일정하다고 가정할 때: I = m(v - v0)를 사용
따라서 우리는 물체의 충격량을 계산하려면 두 물체의 속도 차이를 비교하면 된다.
우리는 물체에 Rigidbody를 달아놓은 상태이다. -> 따라서 rigidbody.velocity를 사용해서 물체의 속도를 측정할 수 있다.
velocity를 받아오는 방법은 collider의 isTrigger를 사용할 생각이다.
- 부서지는 물체에 isTrigger가 걸려있는 collider를 추가
- collider안에 특정 레이어(혹은 tag)가 달려있는 물체가 들어오면
- 그 물체의 속도(a)와 본인의 속도(b)를 캐싱
- |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 |