패들로 방향 조준하기
Coddy의 Unity 게임: 벽돌깨기 코스 레슨. 16개 중 4번째.
맞은 위치를 왼쪽 끝에서 -1부터 오른쪽 끝에서 1까지의 숫자로 바꾸세요. 즉, 패들 중심에서 공까지의 x 오프셋을 패들 너비의 절반으로 나눈 값입니다. 패들의 너비가 4단위이고 중심이 x = 2이며, 공이 x = 3에서 맞았다고 해봅시다. 오프셋은 1이고 너비의 절반은 2이므로 숫자는 0.5입니다. 새로운 방향은 오른쪽으로 0.5, 위쪽으로 1인 (0.5, 1, 0)을 정규화한 값입니다. 끝부분에 정확히 맞으면 값은 1 또는 -1이 되며, 이는 수직 위쪽에서 45도 떨어진 각도입니다. 공이 패들의 모서리에 살짝 걸쳐 끝부분 바깥에서 닿을 수도 있으므로 숫자를 해당 범위로 제한하세요.
공의 OnCollisionEnter는 물리 엔진이 튕김을 계산한 후 실행되므로, 여기서 설정한 속도가 기존 속도를 대체합니다. 벽에서도 같은 메시지가 발생하지만 벽은 기존 방식대로 튕겨야 하므로, 먼저 무엇에 맞았는지 확인하세요. collision.collider.bounds는 콜라이더가 월드 공간에서 차지하는 상자이며, 스케일도 포함됩니다:
void OnCollisionEnter(Collision collision)
{
Bounds box = collision.collider.bounds;
Debug.Log(collision.gameObject.name + " is " + box.size.x + " wide, centered at x = " + box.center.x);
}챌린지
쉬움Ball에 OnCollisionEnter(Collision collision)를 추가하세요:
- 충돌한 객체에
Paddle태그가 지정되어 있지 않으면 아무것도 하지 마세요. x를 계산하세요. 공의 x 좌표에서 패들의 x 좌표를 뺀 값을 패들 너비의 절반(collision.collider.bounds.size.x)으로 나누고, 그 결과를 -1과 1 사이로 제한합니다.- Rigidbody의 속도를
new Vector3(x, 1f, 0f)로 설정하고, 정규화한 다음speed를 곱하세요.
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>();
PhysicsMaterial bouncy = new PhysicsMaterial("Bouncy");
bouncy.bounciness = 1f;
bouncy.dynamicFriction = 0f;
bouncy.staticFriction = 0f;
bouncy.bounceCombine = PhysicsMaterialCombine.Maximum;
bouncy.frictionCombine = PhysicsMaterialCombine.Minimum;
GetComponent<Collider>().material = bouncy;
}
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;
}
void FixedUpdate()
{
if (!launched) return;
rb.linearVelocity = rb.linearVelocity.normalized * speed;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.