Unity ile Oyun Programlama 2

Spac

Taş Madencisi
Mesajlar
68
En iyi cevaplar
0
Beğeniler
75
Puanları
570
Ruh hali


5454568.jpg


Unity ile Oyun Programlama 2

Bir önceki yazımızda Unity'de kullanacağımız kodlama dili olan C# hakkında temel bilgileri anlattık. Bu yazımızda oyun programlamaya ufak bir giriş yapacağız.
Herkese selamlar ben Spac.


Kurgu

Bir oyun yapmak için önce nasıl bir şey yapacağınızı düşünmeniz gerekiyor. Senaryo, karakter, düşman gibi her detayı planlamalısınız. Olay sadece kod yazmaktan ibaret değil arkadaşlar. Yapacağımız oyunda bir karakteri yönetiyor olacağız. Bu karakter bir bölgede kapalı kalmış ve çıkmaya çalışacak. Çıkış için bir kapı mevcut ama anahtarı bulmak için altın toplaması gerekiyor. Yeterli sayıda altın topladığı zaman, anahtar ortaya çıkacak ve bu anahtarı kullanarak kapıyı açacağız. Bu oyun ile oyun mantığının temelini öğrenmeye çalışacağız. Karakterin sağa-sola ilerlemesi, zıplaması, altınları toplama ve kapıyı sadece anahtar ile açma gibi durumların nasıl gerçekleştiğini öğrendiğiniz zaman sadece bunları kullanarak bile kendi oyununuzu yazabileceksiniz.


Yeni Proje Oluşturmak

Unity'yi nasıl indirip kuracağımızdan bahsetmiştik indirdiğinizi varsayarak devam ediyorum. İlk çalıştırışımızda karşımıza böyle bir ekran gelecek :
U1.png

Gelen ekranda "New Project" butonuna basarak yeni projemiz için gerekli ayarlamaları yapacağımız bölüme geçiyoruz:
U2.png

Projemizin adını yazıp çalışma dosyalarının nereye kaydedileceğini belirliyoruz. İmkanınız varsa dosyalarınızı SSD'ye kaydetmenizi öneririm. Template bölümü
oyun tipini belirlememiz gereken yerdir. 2D, 3D, VR ve benzeri seçeneklerden bizim kullanacağımız olan 2D. Karakterimizi sadece yukarı-aşağı ve ileri-geri yönlerinde kullanacağımız için 2D yapmamız yeterli olacaktır. Eğer bilgisayarınızda yüklü Asset bulunuyorsa "Add Asset Package" diyerek projeye dahil edebilirsiniz. Burada yapmanız şart değil projeyi oluşturduktan sonra her zaman müdahale edebilir, istediğiniz Asset'i ekleyip çıkarabilirsiniz. Gerekli ayarları yaptıktan sonra "Create project" diyerek projemizi oluşturuyoruz.


Unity Arayüzü

Projemizi oluşturduktan sonra nihayet Unity açılıyor ve karşımıza bu ekran geliyor :
U3.png
Arayüzde bulunan her aracı açıklamak gereksiz olur ve boşa zaman harcamış oluruz. Bunun yerine en önemlilerine değinip kısaca açıklayacağım. Öncelikle bu ekranı kendi zevkinize göre özelleştirebilirsiniz. Sekmeleri tutup sürükleyerek istediğiniz görünümü elde ettikten sonra bunu kaydedip Unity'yi her açışınızda aynı şekilde kullanmanız mümkün. Hazır görünümleri kullanmak için Windows > Layouts sekmesine bakıp orada bulunan seçenekleri deneyebilirsiniz.

Sol tarafta bulunan "Hierarchy" bölümünde proje içerisinde kullandığımız objelerin alt-üst ilişkisini kontrol edebiliyoruz. Sahneye eklenilen bütün objeler buraya gelir ve gerekirse bunları gruplandırıp sadece grup özelliğini düzenleyerek gruptaki bütün objelerin ayarlarını değiştirebilirsiniz.

Alt tarafta bulunan "Project" bölümünde projenizde kullandığınız ya da kullanacağınız bütün assetleri görebilirsiniz. Eklemek istediğiniz zaman yine buraya eklemeniz gerekiyor. Kullanmak için de buradan sahneye ya da Hierarchy bölümüne sürükleyebilirsiniz.

Projenin sağında bulunan "Console" sekmesi oyunumuzu yaparken en fazla kullanacağımız bölümlerden birisidir. Aldığımız hatalar buraya yazılacak ve kendi yazdığımız Script dosyalarındaki kontrolleri buradan gerçekleştireceğiz. Kullanmaya başladığımız zaman ne kadar önemli olduğunu göreceksiniz.

Sağ taraftaki "Inspector" bölümü oyundaki objelerin bütün ayarlarını düzenlememize fayda sağlıyor. Konumlar, Scriptler, fizik özellikleri gibi bütün ayarları buradan düzenleyeceğiz.

Tam karşımızda bulunan karelere ayrılmış bölüm bizim sahnemizdir (Scene). Bu sahneye sürükle bırak ile objelerimizi bırakıp yerlerini düzenleyebiliyoruz. Görsel olarak bütün işlemlerimizi buradan yapacağız. Hemen yanında bulunan "Game" sekmesi oyunun nasıl göründüğünü gösteriyor. Yani sahnede hazırladığımız objelerin oyunda nasıl görüneceğini Game sekmesinden öğreniyoruz. Oyunlarımızı test etmek için Play tuşuna basıp çalıştırdığımız zaman otomatik olarak karşımıza Game sekmesi gelecektir.


Projeye Asset Eklemek

Artık oyunu tasarlamaya başlıyoruz arkadaşlar. Oyunumuz grafik ve Script dosyalarından oluşuyor. Scriptleri kendimiz yazacağız grafikleri de hazır olarak temin edeceğiz. Kendi oyunlarınızda da grafikleri hazır kullanabilirsiniz, bunları ücretsiz olarak bulabileceğiniz siteler ve tabii ki Unity Asset Store mevcut. Asset Store'da bulunan hazır oyun dosyalarını indirip kendiniz birleştirerek işleyişi kavrayabilirsiniz. Yüklediğiniz Assetleri tutup Project bölümüne sürükleyerek Unity'ye dahil edebilirsiniz.
gameart2d.com/ninja-adventure---free-sprites.html
gameart2d.com/free-sci-fi-platformer-tileset.html
Verilen linklerden kullanacağımız grafikleri indirebilirsiniz. İndirdiğiniz dosyaları tutup sürükleyerek Unity'ye ekleyin. Düzenli bir çalışma alanı için Projects bölümüne sağ tık yapıp Create >Folder diyerek yeni klasör açıp adını Sprites olarak değiştirebilirsiniz. Tabii ki klasör ismini kendinize göre değiştirmeniz mümkün ama mevzu kod olunca genelde İngilizce terimler kullanılır o yüzden Türkçeleştirme gereği duymuyorum.


Karakter Hareketleri

Şimdiki hedefimiz karakterimizi sağa ve sola hareket ettirmek. Bunun için indirdiğimiz karakter Spritelarından birini tutup sahneye sürüklüyoruz. Hangisini seçtiğimiz hiç fark etmiyor çünkü bir Script yazacağız ve bu Scripti istediğimiz bütün karakterlerde kullanabileceğiz. Animasyon işlemlerini bir sonraki yazımızda anlatacağım. Attack_000 karakterini tutup sahneye sürüklüyoruz ve x, y ve z konumlarını 0 yapıyoruz. Daha sonra sağ tarafta bulunan Inspector alanındaki Add Component butonuna tıklayarak, karşımıza çıkan menüden Physics 2D'yi seçelim ve alt menüden gelen seçenekler arasında bulunan Rigidbody 2D'yi seçelim.
Inspector > AddComponent > Physics 2D > Rigidbody 2D Rigidbody objeye belirli fiziksel özellikler vermemize olanak sağlar.

Örneğin Rigidbody 2D'nin mass ayarı ile cisme kütle verebiliriz. Gravity Scale ile yer çekimi ivmesi kazandırabiliriz. -1 ile 1 arasında değer alır ve tahmin edeceğiniz gibi 0 olduğu zaman yer çekimine maruz kalmaz. Karakterimizin sadece sağa ve sola hareket etmesini istiyoruz. şu an Play tuşuna bastığınız zaman sonsuza kadar aşağı doğru hareket ettiğini göreceksiniz. Gravity Scale değerini 0 yaparak karakterimizin olduğu yerde sabit durmasını sağlayalım.

Şimdi Project bölümüne yeni bir dosya oluşturalım ve adını Scripts koyalım. Klasörün içine girdikten sonra sağ tık Create > C# Script yolunu izleyerek yeni bir Script dosyası oluşturalım ve adı Player olsun. Çift Tıklayarak Script dosyamızı Visual Studio ile açalım. Karşımıza bu ekran gelecektir:
U4.png

Burada Start ve Update olmak üzere iki fonksiyon görüyoruz. Start, oyunu ilk başlattığınızda çalışacak kodları içerir. Oyunu her açtığınızda sadece başlangıçta bir kez çalışır. Update ise sürekli çalışması gereken kodları barındırır. Örneğin Karakterimizin hareketi için klavyeden bir tuşa basmamız gerekiyor, her bastığımızda karakter hareket edecek. Bunu Update içerisinde belirtmemiz gerekiyor çünkü bu hareket etme işlemi sürekli olarak yapılan bir işlemdir. Unity'de bulunan objeler "GameObject" olarak adlandırılıyor. Kodlarımızda objelere bu şekilde erişeceğiz. Rigidbody 2D fizik özelliklerini Ninja karakterimize ekledik. Artık bu karaktere GameObject diyelim. GameObject'imizin fizik özelliklerine kod üzerinden erişebilmek için bir tanımlama işlemi yapmamız gerekiyor.

İki boyutlu bir oyun yaptığımızdan dolayı karakterimiz x ve y yönlerinde hareket edecek. Yani sadece sağa-sola ve yukarı-aşağı hareket etmesi gerekiyor.
private Rigidbody2D myRigidbody; şeklinde tanımlamamızı yapıyoruz. Tanımlamayı yaptık şimdi de oyun başladığında bu fizik özelliğini oluşturmamız gerekiyor. Hatırlarsanız oluşturma işlemlerini Start fonksiyonu içerisinde yapıyorduk: myRigidbody = GetComponent<Rigidbody2D>(); Bu şekilde oluşturduğumuz fiziği kod üzerinden düzenleyebiliyoruz. Şimdi bir tuşa bastığımızda sağa ve sola ilerleme işlemine geçelim, bu işlemi Update fonksiyonu içerisinde gerçekleştiriyoruz: float yatay = Input.GetAxis ("Horizontal"); Burada Horizontal ile tanımlanan yerden x ve y koordinatlarını alıp float olarak oluşturduğumuz yatay değişkenine aktarıyoruz. Horizontal yatay demek oluyor ve Unity varsayılan olarak yön tuşları ile bağdaştırmış. Yani sağ ve sol ok tuşlarını kullandığımız zaman bunu anlayıp yatay değişkenine bu değeri aktarıyor. Şimdi bir Hareket fonksiyonu oluşturup bunu Update içerisinde çalıştırmamız gerekiyor. Hareket fonksiyonu içerisinde objemize hız kazandıracağız. myRigidbody.velocity = new Vector2 (yatay*5, myRigidbody.velocity.y); Burada velocity hız demek oluyor. Fiziğimizin hızını az önce oluşturduğumuz yatay değişkeninden gelen değer ile kendi belirlediğimiz değeri çarparak oluşturuyoruz. velocity.y şeklinde kullanmamızın sebebi ise sadece yatay alandaki değeri değiştirmemiz gerekmesidir. x ve y koordinat sisteminde yatay alanı y ile gösterdiğimiz için Unity'de de bu şekilde kullanıyoruz.
C#:
using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

    private Rigidbody2D myRigidbody;

    void Start () {
        myRigidbody = GetComonent<Rigidbody2D> ();
    }
    void Update () {
        float yatay = Input.GetAxis ("Horizontal");
        Hareket(yatay);
    }
    private void Hareket (float yatay) {
        myRigidbody.velocity = new Vector2 (yatay*5, myRigidbody.velocity.y);
    }
}
Yazdığımız bu Scripti GameObject ile ilişkilendirmemiz gerekiyor. Bunun için Scripti tutup GameObject'in Inspector paneline sürüklemeniz yeterli olacaktır. Şimdi yapmamız gereken bu kodu test etmek. Play tuşuna bastıktan sonra ok tuşları ile sağa ve sola hareket etmeye çalıştığınızda başarılı bir şekilde hareket ettiğini göreceksiniz. Burada hareketimiz sabit bir hızla gerçekleşiyor. Bunu değiştirmek için velocity değerini arttırmak ya da azaltmak gerekiyor. myRigidbody.velocity = new Vector2 (yatay*5, myRigidbody.velocity.y); burada farkettiyseniz sabit bir değer olan 5 değeri mevcut. Bu değeri arttırıp azaltarak hızımızı değiştirebiliriz. Bunu yapmak için float bir değişken tanımlayıp bu değişkene değerler atamamız gerekiyor. Az önceki kodumuza ek olarak private float hiz; değişkenini tanımlayıp 5 rakamı ile yer değiştirmeliyiz. yani yeni kodumuz :
C#:
using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

    private Rigidbody2D myRigidbody;
   
    [SerializeField]
    private float hiz;

    void Start () {
        myRigidbody = GetComonent<Rigidbody2D> ();
    }
    void Update () {
        float yatay = Input.GetAxis ("Horizontal");
        Hareket(yatay);
    }
    private void Hareket (float yatay) {
        myRigidbody.velocity = new Vector2 (yatay*hiz, myRigidbody.velocity.y);
    }
}
şeklinde olacaktır. [SerializeField] ne işe yarıyor diyecek olursanız; private olarak tanımladığımız hiz değişkenine class dışından erişmemize olanak sağlıyor. şu an Inspector paneline baktığımızda Player Scriptinin hemen altında bir hiz alanı geldiğini görüyoruz. Play tuşuna basarsanız yön tuşları ile karakterinizi hareket ettiremediğinizi göreceksiniz. Bunun sebebi ise hiz değişkenine henüz bir değer atamadık varsayılan olarak 0 değeri geldi ve 0 ile mevcut hızı çarptığınızda sonuç yine 0 olduğu için karakterimiz hareket etmiyor. Bu değeri Inspector panelinden değiştirip istediğiniz sayıyı yazabilirsiniz.

şu an ufak bir sorunumuz var. Karakter hangi yöne giderse gitsin sadece bir yöne bakıyor. Sağa da gitse sola da gitse her zaman sağ tarafa dönük bir şekilde hareket ediyor. Bunu düzeltmek çok basit sadece karakterin yönünü değiştireceğiz. Ama bu işlemi yapmak için bir şart var; karakter sağa giderken y değeri pozitif sola giderken negatif olduğunu biliyoruz. Sağ tuşa bastığımızda sağa bakmıyorsa veya sol tuşa bastığımızda sola bakmıyorsa bu işlemi yapması gerekiyor. Kod üstünde gösterelim.
C#:
using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

    private Rigidbody2D myRigidbody;
   
    [SerializeField]
    private float hiz;
    private bool sagaBak;
// Boolean değişken tipini anlatmıştık. Burada bir örneğini görüyorsunuz. Karakterin sağ tarafa bakıp bakmadığını
// kontrol etmek için bu değişkeni oluşturuyoruz.
    void Start () {
        sagaBak = True;
// Başlangıçta karakter sağa bakıyor. Bu nedenle sagaBak değişkenine True değeri veriyoruz.
        myRigidbody = GetComonent<Rigidbody2D> ();
    }
    void Update () {
        float yatay = Input.GetAxis ("Horizontal");
        Hareket(yatay);
        YonCevir (yatay);
    //Bu kod ile yön tuşlarına her basışımızda yön kontrolü tetiklenir.
    }
    private void Hareket (float yatay) {
        myRigidbody.velocity = new Vector2 (yatay*hiz, myRigidbody.velocity.y);
    }
    private void YonCevir (float yatay) {
        if (yatay > 0 && !sagaBak || yatay < 0 && sagaBak)
        {
            sagaBak = !sagaBak;
            Vector3 yon = transform.localScale;
            yon.x *= -1;
            transform.localScale = yon;
// Burada yaptığımız işlem karakterin yönünü alığ ters çevirip tekrar karaktere göndermek. Kafanız karıştıysa sorabilirsiniz.
        }
    }
}
Bu kodu alıp hiz değişkenine sıfırdan farklı bir değer verdiğiniz takdirde sıkıntısız bir şekilde çalıştığını göreceksiniz. Bir sonraki yazımızda karaktere animasyon ekleyip sağa sola hareket ederken adım atma gibi görsel durumlarını ayarlayacağız buna ek olarak oyunumuzun platformunu hazırlamaya başlayacağız. Anlamadığınız yer varsa çekinmeden yoruma yazabilirsiniz elimden geldiğince cevaplamaya çalışacağım. Bazı yerlerin detayını vermedim zamanla anlayacağınızı umuyorum.

Bir başka yazıda görüşmek üzere sağlıcakla kalın, selamlar.
 


Moderatör tarafından düzenlendi:

Üst