Menu
CoddyTech

Raketle Nişan Al

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

Mükemmel bir sekmede oyuncu nişan alamaz: top, rakete geldiği açıyla raketten ayrılır. Brick Breaker oyunlarında bunun yerine açıyı raket belirler. Sol uca yakın bir vuruş topu yukarı ve sola gönderir, ortadaki bir vuruş dümdüz yukarı gönderir ve vuruş orta noktadan ne kadar uzaksa açı o kadar geniş olur.

Vuruşu sol uçta -1'den sağ uçta 1'e kadar bir sayıya dönüştür: topun x konumunun raketin merkezine göre farkını raketin genişliğinin yarısına böl. Raketin 4 birim genişliğinde ve merkezinin x = 2 konumunda olduğunu, topun da x = 3 konumunda vurduğunu varsayalım. Fark 1, genişliğin yarısı 2 olduğundan sayı 0.5 olur ve yeni yön, 0.5 yana ve 1 yukarı şeklinde (0.5, 1, 0) vektörünün normalize edilmiş hâlidir. Tam uçtaki bir vuruş 1 veya -1 verir; bu da dümdüz yukarı yönünden 45 derece sapma demektir. Sayıyı bu aralıkla sınırla; çünkü top raketin köşesine, ucunu biraz aşacak şekilde dokunabilir.

Topun OnCollisionEnter metodu, fizik sistemi sekmeyi hesapladıktan sonra çalışır; dolayısıyla burada ayarlanan hız, hesaplanan hızın yerine geçer. Duvarlar da aynı mesajı gönderir ve normal şekilde sekmeye devam etmelidir; bu yüzden önce neye çarptığını kontrol et. collision.collider.bounds, çarpıştırıcının dünyada kapladığı kutudur; ölçek de hesaba katılır:

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

Görev

Kolay

Ball'a OnCollisionEnter(Collision collision) ekle:

  1. Çarpılan nesne Paddle etiketi taşımıyorsa hiçbir şey yapma.
  2. x değerini hesapla: topun x konumundan paletin x konumunu çıkar ve sonucu paletin genişliğinin yarısına (collision.collider.bounds.size.x) böl; değeri -1 ile 1 arasında tut.
  3. Rigidbody'nin hızını new Vector3(x, 1f, 0f) değerini normalize edip speed ile çarparak ayarla.

Oynat'a bas, topu paletin iki ucunun yakınında yakala, ardından Kontrol Et'e bas.

Kendin dene

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