Menu
CoddyTech

속도 유지하기

Coddy의 Unity 게임: 벽돌 깨기 코스 레슨. 19개 중 3번째.

브릭 브레이커의 공은 절대 느려지지 않습니다. 대부분의 역할은 PhysicsMaterial이 합니다. 반발력 1은 튕길 때마다 속도를 그대로 유지하고, 마찰력 0은 벽이 공을 끌어당기지 않게 합니다. 벽에는 재질이 없으며, Unity는 기본적으로 두 콜라이더의 값을 평균냅니다. 공의 값 1과 벽의 값 0을 평균하면 튕길 때 속도는 절반이 됩니다. bounceCombine = Maximum과 frictionCombine = Minimum을 설정하면 공 자체의 값이 우선 적용됩니다.

그래도 물리 계산이 완벽하지는 않습니다. 움직이는 패들의 속도가 더해지고, 작은 오차가 수백 번의 튕김에 걸쳐 누적됩니다. 따라서 공은 매 물리 업데이트마다 방향을 유지하고 속도를 다시 설정합니다.

rb.linearVelocity = rb.linearVelocity.normalized * 7f;

초당 2유닛으로 느려진 공은 다음 업데이트에서 다시 7의 속도로 날아갑니다.

challenge icon

챌린지

쉬움

공이 한 가지 속도로 영원히 튕기게 하세요.

  1. Ball의 Awake()에서 바운스 정도가 1이고 마찰력이 모두 0인 new PhysicsMaterial("Bouncy")를 만들고, bounceCombine = PhysicsMaterialCombine.Maximum 및 frictionCombine = PhysicsMaterialCombine.Minimum을 설정하세요. 그런 다음 GetComponent<Collider>().material에 적용하세요.
  2. FixedUpdate()를 추가하세요. 공이 발사되었다면 rb.linearVelocity = rb.linearVelocity.normalized * speed;

‘플레이’를 누르고 공을 발사하세요. 공은 속도가 줄지 않고 모든 벽에 부딪혀 튕깁니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;
using UnityEngine.InputSystem;

public class Ball : MonoBehaviour
{
    public Transform paddle;
    public float speed = 9f;

    Rigidbody rb;
    bool launched;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (launched) return;
        transform.position = paddle.position + Vector3.up * 0.5f;
        if (Keyboard.current.spaceKey.wasPressedThisFrame) Launch(new Vector3(0.3f, 1f, 0f));
    }

    public void Launch(Vector3 direction)
    {
        launched = true;
        rb.linearVelocity = direction.normalized * speed;
    }
}

Unity 게임: 벽돌 깨기의 모든 레슨

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