Unity Eğitim
Dersler
Forum Sınav Merkezi Premium 💎
2D Oyun Geliştirme

Unity'de Basit Pong Oyunu: İki Raket ve Temel Yapay Zeka

Paylaşan: Unity Eğitim 22 October 2025 8 dakika okuma 97 görüntülenme

Unity ile oyun geliştirmeye yeni başlayanlar için klasik bir başlangıç noktası olan Pong, temel oyun mekaniklerini anlamanın harika bir yoludur. Bu eğitimde, iki raket (biri oyuncu kontrollü, diğeri basit bir yapay zeka tarafından yönetilen), bir top, skor sistemi ve sahne sınırları içeren eksiksiz bir Unity Pong Oyunu oluşturmayı adım adım öğreneceksiniz.

Bu makalenin sonunda, sadece çalışan bir Pong oyununa sahip olmakla kalmayacak, aynı zamanda Unity'nin fizik sistemi, giriş yönetimi, UI elemanları ve basit AI uygulamaları hakkında da değerli bilgiler edinmiş olacaksınız.

Pong'a Giriş ve Temel Kurulum


Herhangi bir Unity Pong Oyunu projesine başlarken, ilk adım sahneyi düzenlemek ve gerekli oyun objelerini (GameObjects) oluşturmaktır. Bu oyun için ihtiyacımız olan temel objeler şunlardır:

  • Top (Ball): Oyunun ana objesi.

  • Oyuncu Raketi (Player Paddle): Klavyeyle kontrol edilecek.

  • Yapay Zeka Raketi (AI Paddle): Topu takip edecek basit AI.

  • Duvarlar (Walls): Topun sahne dışına çıkmasını engelleyen üst ve alt sınırlar.

  • Gol Bölgeleri (Goal Zones): Topun bu bölgelere çarpmasıyla skor kazanılacak.

  • Skor Paneli (Score UI): Mevcut skorları gösterecek.


Sahne Kurulumu



  1. Yeni bir 2D proje başlatın.

  2. Kamera ayarlarını ortogonal (Orthographic) olarak değiştirin.

  3. Tüm raket, top ve duvar objeleri için Sprite Renderer bileşeni ve uygun bir renk seçin.

  4. Tüm hareketli objeler (top, raketler) için Rigidbody2D bileşeni ekleyin. Topun `Rigidbody2D`'sinde `Gravity Scale`'i 0 olarak ayarlayın.

  5. Tüm objeler için BoxCollider2D bileşeni ekleyin. Duvarlar ve gol bölgeleri için `Is Trigger` seçeneğini işaretlemeyi unutmayın.


Topun Hareketi ve Fiziği


Topun hareketi, Unity Pong Oyunu'nun kalbidir. Topa başlangıçta bir kuvvet uygulayarak hareketini başlatacak ve çarpışmaları `OnCollisionEnter2D` veya `OnTriggerEnter2D` ile yöneteceğiz.

BallController.cs


using UnityEngine;
using UnityEngine.SceneManagement;

public class BallController : MonoBehaviour
{
public float initialSpeed = 5f;
public float speedIncreaseFactor = 0.1f;
private Rigidbody2D rb;

void Start()
{
rb = GetComponent<Rigidbody2D>();
Invoke("LaunchBall", 2f); // 2 saniye sonra topu fırlat
}

void LaunchBall()
{
float x = Random.Range(0, 2) == 0 ? -1 : 1;
float y = Random.Range(0, 2) == 0 ? -1 : 1;
rb.velocity = new Vector2(x * initialSpeed, y * initialSpeed);
}

private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Paddle"))
{
rb.velocity *= (1 + speedIncreaseFactor); // Her vuruşta hızlan
}
}

public void ResetBall()
{
rb.velocity = Vector2.zero;
transform.position = Vector2.zero;
Invoke("LaunchBall", 1f); // Reset sonrası tekrar fırlat
}
}


Bu kodda, top rastgele bir yöne fırlatılır ve her rakete çarptığında hızı artırılır. `ResetBall` fonksiyonu, gol olduğunda topu merkeze döndürüp yeniden başlatır.

Oyuncu Raketinin Kontrolü


Oyuncu raketini, klavye girişlerini kullanarak yukarı ve aşağı hareket ettireceğiz.

PlayerPaddle.cs


using UnityEngine;

public class PlayerPaddle : MonoBehaviour
{
public float speed = 7f;
public KeyCode upKey = KeyCode.W;
public KeyCode downKey = KeyCode.S;
private Rigidbody2D rb;

void Start()
{
rb = GetComponent<Rigidbody2D>();
}

void FixedUpdate()
{
Vector2 velocity = rb.velocity;
if (Input.GetKey(upKey))
{
velocity.y = speed;
}
else if (Input.GetKey(downKey))
{
velocity.y = -speed;
}
else
{
velocity.y = 0;
}
rb.velocity = velocity;
}
}


FixedUpdate, fizik işlemleri için idealdir. Burada, `W` ve `S` tuşlarıyla raketin dikey hareketini kontrol ediyoruz.

Basit Yapay Zeka (AI) Raketi


Yapay zeka raketi, topun Y konumunu takip ederek basit bir şekilde hareket edecektir.

AIPaddle.cs


using UnityEngine;

public class AIPaddle : MonoBehaviour
{
public float speed = 6f;
public Transform ball;
private Rigidbody2D rb;

void Start()
{
rb = GetComponent<Rigidbody2D>();
}

void FixedUpdate()
{
if (ball.position.y > transform.position.y)
{
rb.velocity = new Vector2(0, speed);
}
else if (ball.position.y < transform.position.y)
{
rb.velocity = new Vector2(0, -speed);
}
else
{
rb.velocity = Vector2.zero;
}
}
}


Bu AI, topun Y konumuna göre raketini yukarı veya aşağı hareket ettirir. `speed` değeri, AI'ın zorluk seviyesini belirler.

Skor Sistemi ve Oyun Durumu


Skor sistemi, gol bölgelerine giren topu algılayacak ve skorları güncelleyecektir. Ayrıca, topu yeniden başlatma işlevini de içerecektir.

GoalZone.cs


using UnityEngine;
using TMPro; // UI.Text kullanıyorsanız UnityEngine.UI;

public class GoalZone : MonoBehaviour
{
public bool isPlayerGoal;
public TextMeshProUGUI player1ScoreText; // Veya Text
public TextMeshProUGUI player2ScoreText; // Veya Text
public BallController ballController;

private int player1Score = 0;
private int player2Score = 0;

void Start()
{
UpdateScoreUI();
}

private void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Ball"))
{
if (isPlayerGoal)
{
player2Score++; // AI gol attı
}
else
{
player1Score++; // Oyuncu gol attı
}
UpdateScoreUI();
ballController.ResetBall();
}
}

void UpdateScoreUI()
{
player1ScoreText.text = player1Score.ToString();
player2ScoreText.text = player2Score.ToString();
}
}


Bu scripti her iki gol bölgesine (sol ve sağ) ekleyin. `isPlayerGoal` değişkenini sol gol bölgesi için `true`, sağ gol bölgesi için `false` olarak ayarlayın. `TextMeshPro` kullanmak için projenize import etmeniz gerekebilir (Window -> TextMeshPro -> Import TMP Essential Resources).

Pratik İpuçları


1. Top Hızını Dinamik Ayarlama


Topun her rakete çarptığında hızını artırmak, oyunu daha dinamik hale getirir. Yukarıdaki `BallController` script'inde bu zaten uygulandı (`speedIncreaseFactor`). Bu değeri ayarlayarak oyunun zorluğunu değiştirebilirsiniz.

2. Raketlerin Topu Farklı Açılarda Yansıtması


Topun rakete çarptığı noktaya göre yansıma açısını değiştirmek, oyunun stratejik derinliğini artırır. Örneğin, raketin ortasına çarpan top düz giderken, kenarlara çarpan top daha açılı gidebilir. Bunu `OnCollisionEnter2D` içinde `ContactPoint2D` kullanarak yapabilirsiniz.
// BallController içinde, OnCollisionEnter2D metodu
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Paddle"))
{
float hitPoint = collision.contacts[0].point.y - collision.transform.position.y;
float paddleHeight = collision.collider.bounds.size.y;
float normalizeHit = hitPoint / (paddleHeight / 2);
float bounceAngle = normalizeHit * 45f; // Maksimum 45 derece

Vector2 currentVelocity = rb.velocity;
float magnitude = currentVelocity.magnitude * (1 + speedIncreaseFactor);

Vector2 newDirection = new Vector2(Mathf.Sign(currentVelocity.x) * Mathf.Cos(bounceAngle * Mathf.Deg2Rad), normalizeHit * Mathf.Sin(bounceAngle * Mathf.Deg2Rad));
rb.velocity = newDirection.normalized * magnitude;
}
// ... diğer çarpışmalar
}


3. Görsel ve İşitsel Geri Bildirim


Oyun deneyimini zenginleştirmek için ses efektleri (top çarpması, gol olma) ve basit parçacık efektleri ekleyin. Örneğin, top bir şeye çarptığında küçük bir patlama efekti veya raketten sektiğinde hafif bir titreşim (kamera sallama) ekleyebilirsiniz. Bu, bir Unity Pong Oyunu'nu daha sürükleyici yapar.

Yaygın Hatalar ve Çözümleri



  • Topun Takılması veya Hızını Kaybetmesi: `Rigidbody2D`'nin `Collision Detection` modunu `Continuous` olarak ayarlayarak ve fizik materyali (Physics Material 2D) kullanarak `Friction` (sürtünme) değerini 0, `Bounciness` (sekme) değerini 1 olarak ayarlayarak çözülebilir.

  • AI'ın Çok Agresif veya Çok Yavaş Olması: `AIPaddle` script'indeki `speed` değişkeni ile oynayarak AI'ın reaksiyon süresini ve zorluğunu ayarlayın. Ayrıca, AI'ın topu takip etme hızına küçük bir gecikme veya sapma ekleyerek daha insansı bir davranış sağlayabilirsiniz.

  • UI Skorlarının Güncellenmemesi: `GoalZone` script'indeki `player1ScoreText` ve `player2ScoreText` referanslarının Unity Editor'ünde doğru `TextMeshProUGUI` veya `UI.Text` objelerine atanmış olduğundan emin olun.

  • Raketlerin Sınır Dışına Çıkması: Raketlerin `Rigidbody2D`'sinde `Constraints` altındaki `Freeze Position X` ve `Freeze Rotation Z` seçeneklerini işaretleyerek sadece dikey hareket etmelerini sağlayın. Ayrıca, sahneye üst ve alt sınırlar ekleyerek raketlerin bu sınırları geçmesini engelleyebilirsiniz.


Performans ve Optimizasyon Notları


Basit bir Unity Pong Oyunu için performans genellikle büyük bir sorun teşkil etmez. Ancak yine de bazı temel prensiplere dikkat etmek önemlidir:

  • `FixedUpdate` Kullanımı: Fizik tabanlı hareketler ve çarpışmalar için `Update` yerine `FixedUpdate` kullanın. Bu, fizik motorunun daha tutarlı çalışmasını sağlar.

  • Gereksiz Hesaplamalardan Kaçınma: `Update` döngüsünde her karede gereksiz `GetComponent` çağrılarından veya karmaşık matematiksel işlemlerden kaçının. Referansları `Start` metodunda önbelleğe alın.

  • UI Güncellemeleri: Skor gibi UI elemanlarını yalnızca değiştiğinde güncelleyin. Her `Update` döngüsünde `text` değerini atamak, küçük olsa da gereksiz bir yüktür.


Sonuç


Tebrikler! Bu rehberle kendi temel Unity Pong Oyunu'nuzu başarıyla oluşturdunuz. Topun hareketinden raket kontrollerine, basit yapay zekadan skor sistemine kadar bir oyunun temel bileşenlerini Unity'de nasıl bir araya getireceğinizi öğrendiniz. Bu proje, daha karmaşık oyunlar geliştirmek için sağlam bir temel oluşturacaktır.

Bu temel üzerine daha fazla özellik ekleyerek oyununuzu geliştirebilirsiniz: menüler, farklı zorluk seviyeleri, güçlendirmeler (power-ups), çok oyunculu mod veya daha gelişmiş AI algoritmaları gibi. Unutmayın, oyun geliştirme sürekli bir öğrenme ve deneme sürecidir. İyi eğlenceler!

🧠 Ders Sonu Değerlendirme Testi

Dersi tamamladıktan sonra bilgilerinizi test edin ve ekstra puanlar kazanın.

🔥 +50 XP Ödül
🔒

Sınava Katılmak İçin Giriş Yapın

Bu ders sonu testini çözebilmek, bilginizi test edip **+50 XP** kazanmak ve **Sınav Şampiyonu** rozetinin kilidini açmak için üye girişi yapmalısınız.

Yorumlar (0)

Yorum yazabilmek ve derslere katkıda bulunabilmek için giriş yapmalısınız.

İlk yorumu siz yapın!