Menu
CoddyTech

넓은 패들

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

넓히기 파워업을 패들로 잡으면 몇 초 동안 패들이 넓어집니다. 파워업은 잡혔다는 것을 감지합니다. 트리거 콜라이더가 패들의 콜라이더에 닿고 두 바디가 모두 키네마틱이면 OnTriggerEnter를 실행하기에 충분합니다. 파워업은 내려오는 동안 공을 통과하기도 하므로 태그를 확인합니다. 종류를 담은 enum을 Inspector에서 프리팹마다 설정하면 각 파워업을 구별할 수 있습니다.

시간 제한 효과는 코루틴으로 구현합니다. 변경하고, 기다린 다음, 되돌립니다. 첫 번째 효과가 아직 실행 중일 때 두 번째로 잡으면 시간을 다시 시작해야 하므로, StartCoroutine이 반환하는 Coroutine을 저장하고 새 코루틴을 시작하기 전에 중지합니다. 그러지 않으면 첫 번째 코루틴이 일찍 끝나 두 번째 효과를 되돌립니다. 속도 부스트는 다음과 같습니다.

Coroutine boost;

public void Boost()
{
    if (boost != null) StopCoroutine(boost);
    boost = StartCoroutine(BoostFor(3f));
}

IEnumerator BoostFor(float seconds)
{
    speed = normalSpeed * 2f;
    yield return new WaitForSeconds(seconds);
    speed = normalSpeed;
    boost = null;
}

부스트는 현재 속도를 두 배로 했다가 나중에 절반으로 되돌리는 대신, 한 번 저장해 둔 normalSpeed를 기준으로 속도를 설정합니다. 두 번 연속 부스트하면 속도가 4배가 되기 때문입니다. 패들의 클램프는 매 단계마다 너비를 확인하므로 넓어진 패들도 여전히 벽에서 멈춥니다.

challenge icon

챌린지

어려움
  1. PowerUp에서 public enum Kind { Wide, Multiball }과 public Kind kind을 추가합니다(각 프리팹에서 kind를 설정합니다). OnTriggerEnter를 추가합니다. 파워업이 Paddle 태그가 지정된 객체에 닿으면, Wide 유형은 해당 객체의 Paddle 스크립트에서 Widen()을 호출하고, 두 유형 모두 파워업을 제거합니다.
  2. Paddle에서 public float wideFactor = 1.6f와 public float wideSeconds = 8f를 추가하고, Awake()에서 패들의 기본 너비인 x 스케일을 기억합니다.
  3. public void Widen()을 작성합니다. 코루틴을 시작해 패들의 x 스케일을 기본 너비에 wideFactor를 곱한 값으로 설정하고, wideSeconds 동안 기다린 다음 기본 너비로 되돌립니다. 패들이 넓어진 상태에서 파워업을 다시 획득하면 시간이 다시 시작됩니다.

Multiball 파워업은 획득해도 아직 아무 일도 일어나지 않습니다.

Play를 누르고 초록색 파워업을 획득한 다음 Check를 누릅니다.

직접 해보기

using UnityEngine;
using UnityEngine.InputSystem;

public class Paddle : MonoBehaviour
{
    public float speed = 14f;
    public float wallX = 8f;   // 양쪽 벽의 안쪽 면은 -wallX와 wallX에 있습니다

    Rigidbody rb;

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

    void FixedUpdate()
    {
        float input = 0f;
        if (Keyboard.current.leftArrowKey.isPressed || Keyboard.current.aKey.isPressed) input -= 1f;
        if (Keyboard.current.rightArrowKey.isPressed || Keyboard.current.dKey.isPressed) input += 1f;

        Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;
        float halfWidth = transform.localScale.x / 2f;
        target.x = Mathf.Clamp(target.x, -wallX + halfWidth, wallX - halfWidth);
        rb.MovePosition(target);
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

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