Menu
CoddyTech

Geniş Raket

Coddy'nin Unity Oyunu: Tuğla Kırma kursunda ders 16 / 19.

Zaman sınırlı bir etki bir eş yordamdır: değiştir, bekle, geri değiştir. İlki çalışırken ikinci kez yakalama gerçekleşirse süre yeniden başlamalıdır; bu yüzden StartCoroutine'un döndürdüğü Coroutine'i saklayıp yeni bir tane başlatmadan önce durdur. Aksi takdirde ilki erken biter ve ikincisini geri alır. Hız artışı:

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;
}

Hızı, bir kez saklanan normalSpeed değerinden ayarlar; mevcut hızı ikiye katlamaz. Art arda iki hız artışı hızı 4 katına çıkarırdı. Paletin sınırlandırması genişliğini her adımda okur; bu nedenle geniş bir palet de duvarlarda durur.

challenge icon

Görev

Zor

Geniş güçlendirmesi, raketin genişliğini 8 saniyeliğine artırır.

  1. Paddle içinde public float wideFactor = 1.6f; ve public float wideSeconds = 8f; ekle ve Awake içinde normal x ölçeğini sakla.
  2. Widen(), varsa çalışan coroutine'i durdurur ve bir tane başlatır: x ölçeğini normalin wideFactor katına çıkar, wideSeconds kadar bekle ve sonra normale döndür.
  3. Coroutine için using System.Collections; gerekir.

“Oyna” düğmesine bas ve yeşil olanı yakala: raket büyür, ardından tekrar küçülür. Sonra “Kontrol et” düğmesine bas.

Kendin dene

using UnityEngine;
using UnityEngine.InputSystem;

public class Paddle : MonoBehaviour
{
    public float speed = 14f;
    public float wallX = 8f;   // yan duvarların iç yüzleri -wallX ve wallX konumlarındadır

    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);
    }

    public void Widen()
    {
        Debug.Log("Wide paddle");
    }
}

Unity Oyunu: Tuğla Kırma bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground