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.
Görev
ZorPowerUpiçindepublic enum Kind { Wide, Multiball }vepublic Kind kindekle (her prefab kendi türünü ayarlar).OnTriggerEnterekle: güçlendirmePaddleetiketi taşıyan nesneye dokunduğunda Wide türündeyse o nesneninPaddlebetiğindeWiden()çağır; her iki türde de güçlendirmeyi yok et.Paddleiçindepublic float wideFactor = 1.6fvepublic float wideSeconds = 8fekle veAwake()içinde paletin normal genişliğini, yani x ölçeğini, kaydet.public void Widen()yaz: paletin x ölçeğini normal genişliğinwideFactorkatına ayarlayan,wideSecondskadar 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);
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.