Menu
CoddyTech

Arahkan dengan Papan Pemukul

Pelajaran 4 dari 16 dalam kursus Game Unity: Brick Breaker di Coddy.

Dengan pantulan sempurna, pemain tidak bisa membidik: bola meninggalkan paddle pada sudut yang sama dengan sudut saat datang. Game Brick Breaker membuat paddle yang menentukan arah. Pukulan di dekat ujung kiri mengirim bola ke atas dan ke kiri, pukulan di tengah mengirimnya lurus ke atas, dan semakin jauh dari tengah, semakin lebar sudutnya.

Ubah titik pukulan menjadi angka dari -1 di ujung kiri hingga 1 di ujung kanan: offset x bola dari titik tengah paddle, dibagi setengah lebar paddle. Misalkan paddle lebarnya 4 unit dengan titik tengah di x = 2, dan bola mengenai paddle di x = 3. Offset-nya adalah 1, setengah lebarnya adalah 2, jadi angkanya 0.5, dan arah baru bola adalah 0.5 ke samping dan 1 ke atas, (0.5, 1, 0), yang dinormalisasi. Pukulan tepat di ujung menghasilkan 1 atau -1, yaitu sudut 45 derajat dari arah lurus ke atas. Batasi angka itu ke rentang tersebut, karena bola bisa menyentuh sudut paddle sedikit melewati ujungnya.

OnCollisionEnter bola berjalan setelah fisika menghitung pantulannya, jadi kecepatan yang ditetapkan di sana akan menggantikannya. Dinding mengirim pesan yang sama dan harus mempertahankan pantulan biasanya, jadi periksa terlebih dahulu apa yang terkena. collision.collider.bounds adalah kotak yang ditempati collider di dunia, termasuk skalanya:

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

Tantangan

Mudah

Tambahkan OnCollisionEnter(Collision collision) ke Ball:

  1. Jangan lakukan apa pun kecuali object yang terkena memiliki tag Paddle.
  2. Hitung x: nilai x bola dikurangi nilai x paddle, lalu dibagi setengah lebar paddle (collision.collider.bounds.size.x), dan batasi hasilnya antara -1 dan 1.
  3. Atur kecepatan Rigidbody menjadi new Vector3(x, 1f, 0f), normalkan, lalu kalikan dengan speed.

Tekan Play, tangkap bola di dekat tiap ujung paddle, lalu tekan Periksa.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Unity: Brick Breaker