Menu
CoddyTech

Raketle Nişan Al

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

Mükemmel bir sekmeyle oyuncu nişan alamaz. Brick Breaker oyunlarında yönü raket belirler: sol uca yakın bir vuruş topu yukarı ve sola gönderirken, ortadan bir vuruş topu doğrudan yukarı gönderir.

Vuruşu, sol uçta -1'den sağ uçta 1'e kadar bir sayıya dönüştür: topun x eksenindeki raket merkezine göre uzaklığını raketin genişliğinin yarısına böl. Genişliği 4 olan ve merkezi x 2'de bulunan bir rakete x 3'te vurulduğunda: uzaklık 1, genişliğin yarısı 2 olur; dolayısıyla sayı 0.5'tir ve top normalize edilmiş (0.5, 1, 0) yönünde hareket eder. Top köşeye ucun biraz ötesinde dokunabileceğinden, değeri sınırla.

OnCollisionEnter, fizik sekmeyi hesapladıktan sonra çalışır; bu yüzden orada ayarlanan hız, hesaplanan hızın yerine geçer. Duvarlar da çarpışma olayı gönderir ve normal şekilde sekmeye devam eder; bu nedenle önce etiketi kontrol et. collision.collider.bounds.size.x, raketin dünyadaki genişliğidir.

challenge icon

Görev

Kolay

Topu raketle yönlendir: topun nereye düştüğü açıyı belirler.

  1. Ball içinde OnCollisionEnter(Collision collision) ekle; çarpılan nesne Paddle etiketi taşımıyorsa metottan çık.
  2. float x değerini hesapla: topun x konumundan raketin x konumunu çıkar, sonucu collision.collider.bounds.size.x değerinin yarısına böl ve -1 ile 1 arasında sınırla.
  3. rb.linearVelocity = new Vector3(x, 1f, 0f).normalized * speed; değerini ayarla.

“Oyna” düğmesine bas ve topu raketin sol ucunda yakala: top sola doğru uçar. Ardından “Kontrol et” düğmesine 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;
    }
}

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

Kendi başına pratik yap: Unity playground