속도 유지하기
Coddy의 Unity 게임: 벽돌 깨기 코스 레슨. 19개 중 3번째.
브릭 브레이커의 공은 절대 느려지지 않습니다. 대부분의 역할은 PhysicsMaterial이 합니다. 반발력 1은 튕길 때마다 속도를 그대로 유지하고, 마찰력 0은 벽이 공을 끌어당기지 않게 합니다. 벽에는 재질이 없으며, Unity는 기본적으로 두 콜라이더의 값을 평균냅니다. 공의 값 1과 벽의 값 0을 평균하면 튕길 때 속도는 절반이 됩니다. bounceCombine = Maximum과 frictionCombine = Minimum을 설정하면 공 자체의 값이 우선 적용됩니다.
그래도 물리 계산이 완벽하지는 않습니다. 움직이는 패들의 속도가 더해지고, 작은 오차가 수백 번의 튕김에 걸쳐 누적됩니다. 따라서 공은 매 물리 업데이트마다 방향을 유지하고 속도를 다시 설정합니다.
rb.linearVelocity = rb.linearVelocity.normalized * 7f;초당 2유닛으로 느려진 공은 다음 업데이트에서 다시 7의 속도로 날아갑니다.
챌린지
쉬움공이 한 가지 속도로 영원히 튕기게 하세요.
Ball의Awake()에서 바운스 정도가 1이고 마찰력이 모두 0인new PhysicsMaterial("Bouncy")를 만들고,bounceCombine = PhysicsMaterialCombine.Maximum및frictionCombine = PhysicsMaterialCombine.Minimum을 설정하세요. 그런 다음GetComponent<Collider>().material에 적용하세요.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 플레이그라운드