Menu
CoddyTech

Geniş Raket

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

Genişletme güçlendirmesi raketle yakalandığında raketi birkaç saniyeliğine genişletir. Güçlendirme, yakalandığını algılar: tetikleyici çarpıştırıcısı raketin çarpıştırıcısına dokunur ve her iki gövde de kinematiktir; bu, OnTriggerEnter için yeterlidir. Aşağı inerken topun içinden de geçer, bu yüzden etiketi kontrol eder. Türleri içeren ve Inspector'da her prefab için ayarlanan bir enum, güçlendirmeleri birbirinden ayırt eder.

Zamanlı bir etki bir coroutine'dir: değiştir, bekle, geri değiştir. İlki hâlâ çalışırken ikinci kez yakalama olursa süre yeniden başlamalıdır; bu yüzden StartCoroutine'in döndürdüğü Coroutine'i saklayıp yenisini başlatmadan önce durdur. Aksi takdirde ilki erken biter ve ikincisini geri alır. Hız artışı:

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

Hız artışı, mevcut hızı ikiye katlayıp daha sonra yarıya indirmek yerine, bir kez belleğe alınan normalSpeed değerini kullanarak hızı ayarlar: arka arkaya iki hız artışı hızı 4 katına çıkarırdı. Raketin sınırlandırma kodu genişliğini her adımda zaten okur, bu yüzden geniş raket de duvarlarda durur.

challenge icon

Görev

Zor
  1. PowerUp içinde public enum Kind { Wide, Multiball } ve public Kind kind ekle (her prefab kendi türünü ayarlar). OnTriggerEnter ekle: güçlendirme Paddle etiketi taşıyan nesneye dokunduğunda Wide türündeyse o nesnenin Paddle betiğinde Widen() çağır; her iki türde de güçlendirmeyi yok et.
  2. Paddle içinde public float wideFactor = 1.6f ve public float wideSeconds = 8f ekle ve Awake() içinde paletin normal genişliğini, yani x ölçeğini, kaydet.
  3. public void Widen() yaz: paletin x ölçeğini normal genişliğin wideFactor katına ayarlayan, wideSeconds kadar bekleyen ve ardından normal genişliği geri yükleyen bir coroutine başlatır. Palet genişlemişken bir güçlendirme yakalanırsa süre yeniden başlar.

Multiball güçlendirmesi yakalanır ve şimdilik hiçbir şey yapmaz.

Play'e bas, yeşil bir güçlendirme yakala, ardından Check'e 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üzeyleri -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);
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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