Menu
CoddyTech

물체 밀기

Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 60개 중 41번째.

CharacterController는 아무것도 밀지 않습니다. Rigidbody가 있는 상자에 부딪히며 걸어가도 벽에 막힌 것처럼 멈춥니다. 대신 Unity는 Move가 닿는 모든 콜라이더에 대해 바닥을 포함해 컨트롤러 자체 스크립트에서 OnControllerColliderHit(ControllerColliderHit hit)를 호출하고, 스크립트가 어떤 일이 일어날지 결정합니다. hit.collider는 닿은 대상이고, hit.moveDirection은 닿게 한 Move의 방향이며, hit.normal은 접촉 지점에서 표면이 향하는 방향입니다. 다음은 Unity의 자체 밀기 스크립트입니다.

public float pushPower = 2f;

void OnControllerColliderHit(ControllerColliderHit hit)
{
    Rigidbody body = hit.collider.attachedRigidbody;
    if (body == null || body.isKinematic) return;   // 밀 대상이 없음
    if (hit.moveDirection.y < -0.3f) return;        // 발밑에 있음

    Vector3 pushDir = new Vector3(hit.moveDirection.x, 0f, hit.moveDirection.z);
    body.linearVelocity = pushDir * pushPower;
}

각 return에는 이유가 있습니다. 바닥과 벽에는 Rigidbody가 없으므로 이들의 body는 null이며, 거의 모든 Move에서 이들에 닿습니다. 키네마틱 바디는 자체 스크립트가 움직일 때만 움직이므로, 속도를 설정해도 아무런 효과가 없습니다. 가파르게 아래를 향하는 Move는 발밑에 있는 대상에 닿은 것이므로, 플레이어가 딛고 있는 상자를 밀어서는 안 됩니다.

밀기 방향에는 x와 z만 남기므로 상자는 바닥에 눌리는 대신 바닥을 따라 미끄러집니다. 힘을 더하는 대신 linearVelocity를 설정하면 가벼운 상자와 무거운 상자가 같은 속도로 움직입니다. body.AddForce(pushDir * pushPower, ForceMode.Impulse)를 사용하면 무거운 상자는 덜 밀립니다.

challenge icon

챌린지

중급

플레이어가 걸어가며 부딪히는 공을 차게 하세요.

  1. Kicker.cs에서 void OnControllerColliderHit(ControllerColliderHit hit)를 작성하고 Rigidbody body = hit.collider.attachedRigidbody;를 가져오세요.
  2. body가 null이거나 키네마틱 상태일 때, 또는 hit.moveDirection.y < -0.3f일 때(발밑에 공이 있을 때) return하세요.
  3. body.linearVelocity를 y값이 0인 이동 방향에 kickPower를 곱한 값에 Vector3.up * lift를 더한 값으로 설정하세요.

‘플레이’를 누르고 빨간 공에 부딪히도록 걸어가세요. 공이 앞쪽 위로 날아갑니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

public class Kicker : MonoBehaviour
{
    public float kickPower = 6f;
    public float lift = 4f;

    // 플레이어가 부딪히는 공을 차기
}

실제 게임 만들기의 모든 레슨

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