Menu
CoddyTech

넉백

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

넉백은 무언가에 맞은 대상이 맞은 물체로부터 밀려나는 것입니다. 맞힌 물체에서 맞은 대상까지 이어지는 선을 따라 한 번 충격을 가합니다. 이 범퍼는 부딪히는 모든 것을 밀어냅니다:

[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를 설정하는 FixedUpdate가 있는 플레이어는 한 단계 뒤에 그 힘을 잃습니다. 따라서 그런 스크립트는 피격된 뒤 잠시 속도를 그대로 두거나, 힘을 사용해 플레이어를 움직여야 합니다.

challenge icon

챌린지

중급

플레이어가 스페이스바를 눌러 충격파를 일으키게 하세요.

  1. Input.GetKeyDown(KeyCode.Space)일 때 foreach (Collider hit in Physics.OverlapSphere(transform.position, radius))를 반복하며, 플레이어 자신의 콜라이더는 건너뜁니다.
  2. 각 hit.TryGetComponent(out Rigidbody body)에 대해 away = hit.transform.position - transform.position을 구하고 away.y = 0f로 설정합니다.
  3. body.AddForce(away.normalized * power + Vector3.up * lift, ForceMode.Impulse);를 호출합니다.

‘플레이’를 누른 다음 상자들 사이에서 스페이스바를 누르세요. 그런 다음 ‘확인’을 누르세요.

직접 해보기

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를 플레이어에게서 멀어지도록 밀어냅니다
    }
}

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

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