Menu
CoddyTech

Hızı Koru

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

Brick Breaker topu hiç yavaşlamaz. İşin çoğunu PhysicsMaterial halleder: 1 zıplama esnasındaki hızın tamamını korur, 0 sürtünme ise duvarların topu yavaşlatmasını veya döndürmesini engeller. Duvarların ve tuğlaların kendilerine ait bir malzemesi yoktur ve Unity iki çarpıştırıcının değerlerini varsayılan olarak Average ile birleştirir: topun 1 değeri ile duvarın varsayılan 0 değeri, topun yarı hızla zıplamasına neden olur. bounceCombine = Maximum ve frictionCombine = Minimum, topun kendi değerlerinin çarptığı her şeye karşı geçerli olmasını sağlar.

Fizik yine de tam olarak kusursuz değildir: hareket eden bir palet zıplamaya kendi hızını ekler, iki top birbirini iter ve küçük hatalar yüzlerce zıplama boyunca birikir. Bu nedenle top, her FixedUpdate çağrısında yönünü korur ve hızı yeniden ayarlanır. Ball nesnesinin Rigidbody bileşeninde Inspector'da Freeze Position Z seçeneği de işaretlidir; bu, topu oyun düzleminde tutar.

Farklı bir oyun farklı bir kural ister. Bir air hockey diski yavaşlayabilir ama hiçbir zaman bir hız sınırını aşmamalıdır; Vector3.ClampMagnitude çok uzun bir vektörü kısaltır, daha kısa bir vektöre ise dokunmaz:

void FixedUpdate()
{
    rb.linearVelocity = Vector3.ClampMagnitude(rb.linearVelocity, maxSpeed);
}

Top için bir üst sınır yeterli değildir: saniyede 2 birime yavaşlayan top 2 hızında kalır. Topun hızının, yönüne göre tam olarak ayarlanması gerekir.

challenge icon

Görev

Kolay

Ball içinde:

  1. Awake() içinde, esnekliği 1, dinamik ve statik sürtünmesi 0, bounceCombine değeri Maximum ve frictionCombine değeri Minimum olan bir new PhysicsMaterial("Bouncy") oluşturun ve bunu GetComponent<Collider>().material ile topun collider'ına atayın.
  2. FixedUpdate() ekleyin: top fırlatılmış durumdayken, linearVelocity değerini geçerli yönüyle speed değerinin çarpımı olarak ayarlayın.

Unity'de materyali bir varlık olarak da oluşturabilir (Create > Physics Material) ve Sphere Collider'ın Material yuvasına sürükleyebilirsiniz; burada materyali betik oluşturuyor.

Play'e basın, topu fırlatıp sektigini izleyin, ardından Check'e tıklayın.

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

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