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);
}Görev
KolayBall'a OnCollisionEnter(Collision collision) ekle:
- Çarpılan nesne
Paddleetiketi taşımıyorsa hiçbir şey yapma. xdeğ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.- Rigidbody'nin hızını
new Vector3(x, 1f, 0f)değerini normalize edipspeedile ç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;
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.