넉백
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 54번째.
넉백은 무언가에 부딪힌 대상이 그 물체로부터 튕겨 나가는 것입니다. 충돌한 물체에서 맞은 물체로 이어지는 선을 따라 한 번의 충격을 가합니다. 이 범퍼는 부딪히는 모든 것을 넉백시킵니다:
[SerializeField] private float power = 8f;
void OnCollisionEnter(Collision collision)
{
Vector3 away = collision.transform.position - transform.position;
away.y = 0f;
collision.rigidbody.AddForce(away.normalized * power, ForceMode.Impulse);
}collision.transform.position - transform.position은 범퍼에서 범퍼에 부딪힌 물체를 향합니다. 넉백이 수평으로 유지되도록 y를 0으로 설정하고, normalized는 두 중심 사이의 거리에 관계없이 벡터의 크기를 동일하게 만듭니다. ForceMode.Impulse는 한 번만 가하는 충격입니다. 즉시 질량으로 나눈 power만큼 속도를 변화시키므로, 질량이 2인 공은 질량이 1인 공의 절반 속도로 날아갑니다. 기본값인 ForceMode.Force는 매 스텝 적용하도록 만들어졌으며, 한 스텝 분량의 힘만 가하므로 50배 더 약합니다.
속도를 덮어쓰는 것이 없을 때만 충격이 지속됩니다. 매 스텝마다 화살표 키로부터 rb.linearVelocity를 설정하는 플레이어는 한 스텝 뒤에 넉백 효과를 잃습니다. 따라서 그런 스크립트는 충돌 후 잠시 속도를 변경하지 않거나, 힘을 이용해 플레이어를 움직여야 합니다.
챌린지
중급플레이어는 충격파를 일으킬 수 있습니다. Player에 Shockwave 스크립트를 작성하세요. Inspector에서 radius(4), power(6), lift(2)를 설정합니다. Player 스크립트는 준비되어 있습니다. 방향키로 플레이어를 움직입니다.
- Space를 누르면
Physics.OverlapSphere를 사용해 플레이어로부터radius안에 있는 모든 콜라이더를 찾습니다. - 플레이어 자신을 제외하고 Rigidbody가 있는 각 오브젝트에 Impulse를 적용합니다. 지면을 따라 플레이어로부터 곧장 멀어지는 방향으로
power만큼, 위쪽으로lift만큼 적용합니다. - 지면처럼 Rigidbody가 없는 콜라이더는 그대로 둡니다.
플레이를 누르고, 상자 사이를 걸어 다닌 다음 Space를 누르고 확인을 누르세요.
직접 해보기
using UnityEngine;
public class Shockwave : MonoBehaviour
{
[SerializeField] private float radius = 4f;
[SerializeField] private float power = 6f;
[SerializeField] private float lift = 2f;
void Update()
{
// Space를 누르면 radius 안의 모든 Rigidbody를 플레이어에게서 멀어지도록 밀어냅니다
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.