속도 유지하기
Coddy의 Unity 게임: 벽돌깨기 코스 레슨. 16개 중 3번째.
Brick Breaker의 공은 절대 속도가 줄어들지 않습니다. 대부분의 역할은 PhysicsMaterial이 합니다. 탄성 1은 튀어 오를 때 속도를 모두 유지하고, 마찰 0은 벽이 공을 끌거나 회전시키지 못하게 합니다. 벽과 벽돌에는 자체 재질이 없으며, Unity는 두 콜라이더의 값을 기본적으로 Average로 결합합니다. 공의 1과 벽의 기본값 0이 결합되어 튀어 오를 때 속도가 절반이 됩니다. bounceCombine = Maximum 및 frictionCombine = Minimum을 설정하면 공이 부딪히는 대상이 무엇이든 공 자체의 값이 우선 적용됩니다.
그래도 물리 계산이 완벽한 것은 아닙니다. 움직이는 패들은 튀어 오를 때 자체 속도를 더하고, 공 두 개는 서로 밀어내며, 작은 오차가 수백 번의 튕김에 걸쳐 누적됩니다. 따라서 공은 매 FixedUpdate마다 방향을 유지하고 속도를 다시 설정합니다. Ball의 Rigidbody에는 Inspector에서 Freeze Position Z도 체크되어 있어 공이 플레이 평면을 벗어나지 않습니다.
다른 게임에는 다른 규칙이 필요합니다. 에어 하키 퍽은 느려질 수 있지만 제한 속도보다 빨라지지는 않을 수 있습니다. Vector3.ClampMagnitude는 너무 긴 벡터를 짧게 만들고, 이미 더 짧은 벡터는 그대로 둡니다.
void FixedUpdate()
{
rb.linearVelocity = Vector3.ClampMagnitude(rb.linearVelocity, maxSpeed);
}공에는 속도 제한만으로는 충분하지 않습니다. 초당 2유닛으로 느려지면 그대로 2에 머물기 때문입니다. 공의 방향을 기준으로 속도를 정확히 설정해야 합니다.
챌린지
쉬움Ball에서:
Awake()에서 반발력 1, 동적 및 정적 마찰력 0,bounceCombine은 Maximum,frictionCombine은 Minimum으로 설정한new PhysicsMaterial("Bouncy")를 만들고,GetComponent<Collider>().material을 사용해 공의 콜라이더에 할당하세요.FixedUpdate()를 추가하세요. 공이 발사된 동안 공의 현재 방향에speed를 곱한 값을linearVelocity로 설정하세요.
Unity에서는 머티리얼을 에셋으로 만들 수도 있습니다(Create > Physics Material). 그런 다음 Sphere Collider의 Material 슬롯에 드래그하세요. 여기서는 스크립트가 머티리얼을 만듭니다.
Play를 눌러 공을 발사하고 튕기는 모습을 확인한 다음, Check를 누르세요.
직접 해보기
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;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.