Birlikte öğreniyoruz...

Oyunlarımız için çok önemli bir konu olan unity animasyonlar konusunu inceleyeceğiz. Oyunumuzun gerçekçiliği ve oynanabilirliği için tıpkı efektler gibi animasyonlarda olmazsa olmazlardandır.

Oyununuzdaki bir karakterin yürümesi, koşması, zıplaması, ateş etmesi gibi bir çok eylem için animasyon yapmamız gerekmektedir. Sahnemizde gerçekçilik vermek istediğimiz ya da oyun senaryomuza göre belirli bir hareket yapması gereken çoğu nesne için animasyon yapabiliriz. Unity üzerinde animasyon yapabiliyoruz ya da Asset Store üzerinden belirli animasyonları indirerek sistemimize aktarabiliriz.

Fakat işin aslı bir animasyon yapabilmek için bize bir modelleme gerekiyor. Şöyle düşünün oyununuzun bir karakteri var ve sadece yürüme özelliğine sahip. Bizim karakterimizi sahnemizde göstererek, yürütebilmemiz için karakterimizin yürüme sırasındaki modellerine ihtiyacımız olacak.

Tabi ki ilk başta karakterimizin bir modeli. Sonrasında karakter yürümeye başladığı anda ilk ayağını yani adımını attığındaki hali, diğer ayağını yanına çektiği zamanki hali, yürümenin bitmesi gibi birçok durumun modelinin Unity üzerinde olması gerekiyor ki bizde bunları birleştirerek bir yapı haline getirebilelim.

Bunun için karakterin her pozisyonu için modelleme yapılması gerekiyor. Unity üzerinde basit modellemeler yapabilirsiniz ama 3D bir oyun yapacaksanız ve gerçekçi bir oyun yapmak istiyorsanız, karakter modelleme kısmı devreye giriyor. Bu sebeple Maya, 3ds Max, Blender gibi modelleme programları ile kendi modelinizi çıkartıp Unity üzerine aktarmanız gerekecek.

Efektlerde olduğu gibi karakter modelleme kısmı da ayrı bir iş kolu olarak düşünebilirsiniz. Bu sebeple oyun firmaları bünyesinde modelleme için ayrı kişiler ya da ekipler bulunuyor. Tabi ki modelleme yapabilme yeteneğiniz varsa kodlama ve modelleme kısmının ikisini birden yapabilirsiniz. Bu şekilde çalışan birçok kişi biliyorum.

Fakat sitemizdeki dersleri inceleyerek yeni yeni oyun yapmayı öğrenmeye çalışıyorsanız, önceliğiniz hazır modellemeleri ve animasyonları kullanarak oyununuza bunları entegre etmek olmalı. Çünkü bu aşamada modelleme işine girerseniz her şey yarım kalacak hatta bildiklerinizi bile unutabilirsiniz.

Peki bu derste neleri inceleyeceğiz.

  • Asset Store üzerinde hazır ve ücretsiz bir karakter animasyonunu indireceğiz.
  • İndirdiğimiz karaktere ait durma, yürüme, koşma ve zıplama animasyonları ekleyeceğiz.
  • Karakterimize eklediğimiz animasyonları oyunumuza göre şekillendireceğiz. Örneğin klavyeden bir tuşa basınca koşması, zıplaması vb gibi.

Tabi tüm bunları yaparken Unity Animator ve Animation pencerelerini detaylı olarak inceleyerek tüm ayarlarına değinmeye çalışacağız.

Animasyon Paketi İndirme ve İnceleme

Unity üzerinde “CTRL+F9” ya da “Window/Asset Store” kısmından Asset Store penceremizi açıyoruz. Asset Store penceresinde arama kısmına “Basic Motions FREE Pack” yazarak aradıktan sonra “Kevin Iglesias” tarafından hazırlanan ücretsiz paketi göreceksiniz. Bu paketi “Download” butonuna basıp indirme işleminden sonra “Import” butonuna basarak Unity oyun motoruna aktarmış oluyoruz.

İndirme işleminden sonra “Project” menüsünde “Assets” içinde aşağıdaki gibi yapının import edildiğini göreceksiniz.

Basic Motions FREE Pack Klasör Yapısı
Basic Motions FREE Pack Klasör Yapısı

Bu pakette yer alan tüm klasörler animasyonumuzu oluşturmak için gerekli olan yapılar. Klasörlerde neler olduğuna ufaktan değineceğim çünkü herhangi bir paket indirdiğinizde benzer bir yapı göreceksiniz. En azından elimizin yatkınlığı artacaktır ama ileride bunları detaylı inceleyeceğiz.

Animation Controllers: Animasyon paketi içerisinde yer alan zıplama, koşma, yürüme benzeri yapıların kontrolünü sağlayan “Animator” dosyaları bulunur.

Animations: Karakterinin hareketlerinin modelleme programları ile yapıldıktan sonra, Unity oyun motoruna aktarılması sonucunda oluşan animasyonların yer aldığı klasördür. Şöyle düşünün örneğin yürüme işlemi sırasında bacağın, bileğin ve bel kısmının gibi tüm eklem yerlerinin animasyonu bu alanda hazır olarak bulunmaktadır.

Materials: Karakter için pakete eklenen hazır kaplaması diye düşünebilirsiniz. Unity Material konusunda basitçe materyallerin ne olduğuna değinmiştik.

Prefabs: Unity oyun motoru üzerinde hazır yapılar için “Prefabs” terimi kullanılmaktadır. Bu klasör içinde modele oturtulmuş hazır koşma, zıplama, yürüme gibi hazır yapıları görebilirsiniz. Prefabs hakkında detaylı bilgi için Prefabs Kullanımı hakkında dersimize göz atabilirsiniz.

Textures: Dokular olarak düşünebilirsiniz yani bir karakterin kıyafeti olarak düşünebilirsiniz.

Animasyonları Sahneye Aktarma ve İnceleme

Şimdi hazır yapıların bulunduğu “Prefabs” klasörünün içinde karakterin ilk pozisyon(Idle), zıplama(Jump), geriye doğru koşma(Run Backwards), koşma(Run), hızlı koşma(Sprint) ve yürüme(Walk) hazır animasyonları bulunuyor.

Tüm prefabs yapılarını sahneye yan yana koyarak oyunumuzu başlattığımızda animasyonlarını aşağıdaki gibi görebilirsiniz.

Hazır karakter animasyonları

Sahneye eklemiş olduğunuz “Prefabs” hazır yapılarından birini incelerseniz karakterin iskelet yapısı için aşağıdaki gibi bir çok objenin olduğunu görebilirsiniz. Aslında sadece bu ekrana bakarak Unity için 3D bir modelleme yapmanın ne kadar detaylı olduğunu görebilirsiniz.

Animasyon iskelet yapısı
Animasyon iskelet yapısı

Hazır yapılarda yer alan duruş, yürüme, koşma ve zıplama animasyonlarını birleştirerek kontrol edeceğimiz bir yapı oluşturacağız. Bunun için “Unity Animator Controller” yapısını kullanmamız gerekiyor.

Unity Animator Controller Kullanımı

Unity Animator Controller” ile istediğimiz animasyonları, istediğimiz durumlarda çalışmasını sağlayabiliyoruz. Örneğin klavyeden “W” tuşuna basıldığı zaman yürüme animasyonu çalışsın ve “Boşluk” tuşuna basıldığı zaman zıplama işlemi yapsın gibi ayarları yaptığımız ekran olarak düşünebilirsiniz. Ama merak etmeyin tüm detaylarıyla inceleyeceğiz.

İlk olarak sahnemizde sadece “Idle” yani ilk duruş animasyonunu bırakarak diğerlerini silelim ve sahnede kalan tek objemize “Karakter” ismini verelim.

Unity Animator Controller için Hazırlık
Unity Animator Controller için Hazırlık

Şimdi “Hierarchy” ekranında kalan karakter objemizin renginin mavi olduğunu görmüşsünüzdür. Şuan prefabs olduğu için bu şekilde gözüküyor. Biz üzerinde sağ tıklayarak “Unpack Prefab” diyerek hazır yapıdan çıkaralım.

Unpack Prefab ile hazır yapıyı iptal etme
Unpack Prefab ile hazır yapıyı iptal etme

Evet artık sahnemizde bir karakterimiz hazır olarak bekliyor. Şimdi indirdiğimiz animasyonları uygulayabilmemiz için “Animator Controller” yapısını kullanmaya başlayabiliriz.

Window / Animation / Animator” yolunu takip ederek penceremizi “Animator Controller” penceremizi açalım. “Animator Controller” penceresini açtığınızda karakterin ilk duruşu için tanımlı olan unity animator yapısını göreceksiniz.

Unity Animator Controller Yapısı
Unity Animator Controller Yapısı

Fakat bir kendimiz bir Unity Animator Controller oluşturacağımız için “Project” penceresinde “Assets” klasörü altındayken yeni bir klasör oluşturarak içerisindeyken “Sağ Tık / Create / Animator Controller” yolunu takip ederek yeni bir tane Animator Controller oluşturuyoruz.

Animation Controller Oluşturma
Animation Controller Oluşturma

Oluşturduğumuz Animator Controller dosyasına bir isim(KarakterKontrolu) verip tıklayarak açıyoruz. Bu sefer karşımıza henüz bir tanımlama yapılmamış olan bir pencere gelecektir.

Animator Controller Penceresi
Animator Controller Penceresi

Bu ekranda animasyonların geçişlerini ayarlayacağız ama öncesinde anlamanızın daha kolay olması için sahnemize geçişler için kliplerimizi ekleyelim. Sonrasında detaylı bir şekilde inceleyeceğiz.

Aşağıdaki videoda olduğu gibi karakterin her durumu için bir “State” ekleyeceğiz. “Create State / Empty” ile yolunu takip ederek her durum için bir boş “State” ekledik ve “Inspector” içinden isim verdik.

Karakter Durumlarını Ekleme

Videoda fark ettiyseniz ilk eklediğimiz durum otomatik olarak “Entry” durumuyla bağlanarak aralarında bir ok çizilerek, rengi turuncu olarak değişti.

Animator Controller ekranında Entry ile ilk bağlantısı olan yani animasyona başlandığı zaman ilk oynayacak olan klip seçimini yapmış oluyoruz. Bizim senaryomuza göre karakterin duruşu başlangıç olacak. Sonuçta oyun ilk başladığında karakterimiz sabit bir pozisyonda olacak. Fakat burada sabit kelimesini yanlış anlamayın indirdiğiniz paketi incelerseniz “Idle” yani ilk duruş pozisyonunda da bir animasyon vardır. Yani karakterin hareket etmeden nefes alması olarak düşünebilirsiniz.

Eğer eklediğiniz farklı bir durumu başlangıç olarak belirlemek isterseniz ilgili state üzerine gelerek “Set as Layer Default State” seçeneğini işaretleyebilirsiniz.

Set as Layer Default State Seçimi

Ekranda yer alan diğer durumların ne olduğunu inceleyelim.

Any State: Oluşturduğumuz animasyon döngüsü haricinde kod tarafından erişebileceğimiz farklı, yedek bir state yani durum oluşturmamıza imkan sağlar. Yapısı gereği sadece çıkış işlemi yapılabilmektedir.

Entry: Animasyonun başlangıç state öğesidir. Otomatik olarak eklenir ve yeşil renk alır.

Exit: Animasyonu bitiş state öğesidir. Otomatik olarak eklenir ve kırmızı renk alır.

Şimdi sırada hazır animasyonları eklediğimiz durumlara aktaralım. Bunun için eklediğimiz durumu seçtikten sonra “Inspector” penceresinde yer alan “Motion” penceresinden ilgili animasyonu seçmemiz gerekiyor.

Animasyonları Aktarma

Böylece hangi durumda hangi animasyonun çalışacağını seçmiş olduk. Seçim ekranında bazı animasyon isimlerinin sonunda “Root Motion” yazdığını görmüşsünüzdür. “Root Motion” olanlar karakterin animasyonunun sahnede hareket etmesi için hazırlanan animasyonlardır. Sahnede olduğu yerde yani mevcut pozisyonunda koşma işlemini gerçekleştirmek yerine sahne üzerinde hareket ederek animasyonu gerçekleştirir. Her pakette yer almayabilir ama profesyonel olarak hazırlanmış paketlerde genellikle bulunur.

Animasyonlar arasında geçişini henüz gerçekleştirmedik. Şimdi “Make Transition” yani animasyonlar arasında geçiş işlemini gerçekleştirelim.

Bu işlem için aşağıdaki örnekte olduğu gibi istediğimiz “State” üzerine tıklayarak “Make Transition” seçip, geçiş yapmasını istediğimiz animasyonu seçiyoruz.

Animasyon geçişlerini ayarlama

Böylece oyun başladıktan sonra ilk duruş animasyonu, sonra yürüme, sonra koşma ve en son zıplama ile animasyonu bitirmesi gerekiyor. Fakat siz oyunu başlatıp test ettiğinizde sadece ilk duruş pozisyonunu yaptığını göreceksiniz. Çünkü daha bu oluşturduğumuz “Animator Controler” yapımızı objemize atamadık.

Bunun için sahnede yer alan karakterimizi seçtikten sonra “Inspector” penceresinden “Animator” bileşenin içinde yer alan “Controller” alanından bizim oluşturduğumuz “KarakterKontrolu” seçimini yapmamız gerekiyor.

Controller Ekleme
Controller Ekleme

Burada animasyon işlemleri için “Animator” objesinin eklenmiş olduğunu fark etmiş olmanızı umuyorum. Eğer bileşenlerin ne olduğunu bilmiyorsanız yani eski dersleri atlayarak geldiyseniz kısa bir özet için Unity Bileşenler konusuna göz atabilirsiniz.

Oluşturduğumuz controller yapısını karakterimize tanımladıktan sonra aşağıdaki gibi bir görüntü ortaya çıkacaktır.

Animasyonların Arka Arkaya Çalışması

Evet animasyonlarımızı “Animator Controller” yapısına aktardık ve çalıştığını gördük. Şimdi nasıl parametre vererek istediğimiz zaman çalıştırabileceğimizi öğrenelim.

Animasyonu Klavye İle Yönetme

Şöyle bir yapı oluşturmayı düşündüm. Klavyemizden “W” tuşuna basınca karakterimiz yürüyecek ve “E” tuşuna basınca koşacak, “Q” tuşuna basınca duracak ve son olarak “Space” tuşuna basınca ise zıplayacak şekilde yapılandırmaya başlayalım. Sizde aynısını uygulayabilir ve sonrasında istediğiniz gibi değişiklik yapabilirsiniz.

İlk olarak “IlkDurus” durumundan “Yurume” durumuna klavyeden “W” tuşuna basarak geçmesini sağlayacağız. Fakat bu tarz geçişler için önce “Parameters” ve “Conditions” kavramlarını anlamanız gerekiyor.

Animatör Parametreleri

Animatör penceresinde yer alan geçiş işlemlerinde yani ekranda gördüğünüz oklarda(Transition), parametreler kullanarak bir durum animasyonundan farklı bir durum animasyonuna geçebilmek için kurallar oluşturabiliriz.

animator parametreleri
Unity Animatör Parametreleri

“Animator” penceresinde yer alan “Parameters” sekmesinin altında yer alan “+” simgesine bastığınızda karşımıza yukarıdaki gibi dört seçenek gelecektir.

Float: Farklı bir animasyona geçişte C# tarafında Float bir değer yani ondalık bir sayı verildikten sonra geçilmesini sağlayabiliriz.

Int: Farklı bir animasyona geçişte C# tarafında Integer bir değer verildikten sonra yani tam bir sayı verildikten sonra geçilmesini sağlayabiliriz.

Bool: Farklı bir animasyona geçişte C# tarafında Boolean bir değer yani True-False değeri verildikten sonra geçilmesini sağlayabiliriz.

Trigger: Farklı bir animasyona geçişte bir tetikleyici oluşturabiliriz.

Float, Integer ve Boolean değişken türlerine yabancıysanız temel konuları işlediğimiz C# Dersleri konusuna göz atabilirsiniz.

İlk örneğimizi şu ana kadar görmediğimiz “Trigger” ile başlayalım ama merak etmeyin diğerlerini de çalışmamıza ekleyeceğiz.

Animasyonlar Arasında Geçişi Sağlamak

Şimdi parametre olarak “Trigger” ekleyelim ve tetikleyicimize isim olarak “YurumeyeBasla” yapalım. Böylece “YurumeyeBasla” isminde bir tetikleyicimiz oldu. Peki bu tetikleyiciyi nasıl kullanacağız?

Bunun içinse “IlkDurus” ve “Yurume” arasında yer alan aradaki bağlantıya tıklayarak “Inspector” penceresinde yer alan “Conditions” alanına oluşturduğumuz tetikleyiciyi eklememiz gerekiyor. Aşağıdaki videoyu izleyerek aşamaları görebilirsiniz.

Animasyona Trigger Ekleme

Evet karakterimizi duruş pozisyonundan yürüme pozisyonuna geçmesi için bir tetikleyici ekledik. Şimdi bu tetikleyiciye C# tarafından müdahale ederek klavyemizin “W” tuşuna basınca hareket etmesini sağlayacağız.

“KarakterKontrolu” isminde bir C# dosyası oluşturarak sahnede yer alan “Karakter” objemize atamasını gerçekleştirerek içerisine aşağıdaki kodları yazıyoruz.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class KarakterKontrolu : MonoBehaviour
{
    Animator kontrol;
    void Start()
    {
        kontrol = GetComponent<Animator>();
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            kontrol.SetTrigger("YurumeyeBasla");
        }       
    }
}

Yazdığımız kodu biraz inceleyelim. Animator kontrol; yazarak “Animator” türünde bir nesne oluşturduk ve void Start() fonksiyonu içerisinde yani oyun başladığında objemizi yakalaması için kontrol = GetComponent<Animator>(); yazdık.

Böylece scriptin bağlı olduğu objenin “Animator” bileşenine eriştik. Şimdi klavyeden “W” tuşuna basılı olduğu sürece if bloğunun çalışması için Input.GetKeyDown(KeyCode.W) yazdık.

Artık “W” tuşuna bastığımızda if bloğu aktif duruma gelecek. Son aşamamız ise tetikleyiciye erişmek olacak bunun içinse SetTrigger metodunu kullanacağız yani kontrol.SetTrigger("YurumeyeBasla"); yazarak oluşturduğumuz tetikleyiciye erişiyoruz.

Oyunumuzu test ettiğinizde aşağıdaki sonucu alacağız fakat şuan “W” tuşuna basıp elimizi çeksek bile yürümeye devam edecektir çünkü bir geri dönüş yapmadık.

Yürüme Animasyonu

O zaman yeni bir tetikleyici daha ekleyip ismini “YurumeyiBitir” yapalım ve tam tersi şekilde dönüş işlemine ekleyelim.

Yürümeden Duruş Aşamasına Geçiş İçin Trigger Ekleme

Kodumuzun Update fonksiyonu içerisine yeni bir if bloğu ekleyerek bu sefer kontrol.SetTrigger("YurumeyiBitir"); komutunu ekledik.

 void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            kontrol.SetTrigger("YurumeyeBasla");
        }

        if (Input.GetKeyUp(KeyCode.W))
        {
            kontrol.SetTrigger("YurumeyiBitir");
        }
    }

Burada Input.GetKeyDown ile klavyeden W tuşuna basılı tuttuğumuz sürece yürümesi için gerekli olan tetikleyiciyi ve Input.GetKeyUp yazarak ise elimizi W tuşundan çektiğimizde yapacağı işlemi belirtmiş oluyoruz.

Oyunu çalıştırdığımızda aşağıdaki gibi istediğimiz bir sonuç almış olacağız.

Animasyonlar arası geçiş işlemi

Şimdi ise Boolean ve Integer parametrelerini kullanarak bir animasyon döngüsü oluşturalım. Fakat bu sefer tetikleyici kadar detaylı anlatmayacağım mantığını anladığınızı düşünüyorum.

Animation Controller üzerinde aşağıdaki gibi bir kontrol yapısı oluşturdum.

Animasyon Geçişleri Controller Yapısı
Animasyon Geçişleri Controller Yapısı

Buradaki görselde gördünüz yapının detaylarını vereyim. 1. ve 2. maddeyi yukarıdaki örnekte yapmıştık.

  1. Duruş animasyonundan yürüme animasyonuna geçebiliyoruz ve “YurumeyeBasla – Trigger” parametresi ekli ve “W” tuşuna bastığımız süre boyunca karakterimiz yürüyor
  2. Yürüme animasyonundan duruş animasyonuna geçebiliyoruz ve “YurumeyiBitir – Triggers” parametresi ekli ve “W” tuşundan elimizi çektiğimizde karakterimiz yürümeyi bırakıyor.
  3. Yürüme animasyonundan koşma animasyonuna geçebiliyoruz ve “Kosma-Bool” parametresi ekli. Değer True olduğu zaman yani “E” tuşuna basılı tutulduğunda karakterimiz yürümeden koşmaya geçebiliyor.
  4. Koşma animasyonundan duruş animasyonuna geçebiliyoruz ve “Kosma-Bool” parametresi ekli. Değer False olduğu zaman yani “E” tuşundan elimizi çektiğimiz zaman karakterimiz koşmadan ilk duruş animasyonuna geçebiliyor.
  5. Duruş animasyonundan koşma animasyonuna geçebiliyoruz ve “Kosma-Bool” parametresi ekli. Değer True olduğu zaman yani “E” tuşuna basılı tuttuğumuz zaman karakterimiz duruş animasyonundan koşma animasyonuna geçebiliyor.
  6. Duruş animasyonundan zıplama animasyonuna geçebiliyoruz ve “Ziplama-Int” parametresi ekli ayrıca animasyona geçmesi için C# üzerinden 10 sayısından büyük bir sayı gelmesi gerekiyor. Eğer “Boşluk tuşuna basarsak C# script üzerinden 15 sayısı geliyor ve duruş animasyonundan zıplama animasyonuna geçebiliyor.
  7. Zıplama animasyonundan duruş animasyonuna geçebiliyoruz ve “Ziplama-Int” parametresi ekli ayrıca animasyona geçmesi için C# üzerinden 10 sayısından küçük bir sayı gelmesi gerekiyor. Eğer “Boşluk” tuşundan elimizi çekersek C# script üzerinden 5 sayısı geliyor ve zıplama animasyonundan duruş animasyonuna geçebiliyor.

C# üzerindeki kodlarımız ise aşağıdaki şekilde.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class KarakterKontrolu : MonoBehaviour
{
    Animator kontrol;
    void Start()
    {
        kontrol = GetComponent<Animator>();
       
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            kontrol.SetTrigger("YurumeyeBasla");
        }

        if (Input.GetKeyUp(KeyCode.W))
        {
            kontrol.SetTrigger("YurumeyiBitir");
        }

        if (Input.GetKeyDown(KeyCode.E))
        {
            kontrol.SetBool("Kosma", true);
        }

        if (Input.GetKeyUp(KeyCode.E))
        {
            kontrol.SetBool("Kosma", false);
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            kontrol.SetInteger("Ziplama", 15);
        }

        if (Input.GetKeyUp(KeyCode.Space))
        {
            kontrol.SetInteger("Ziplama", 5);
        }

    }
}
  • kontrol.SetBool("Kosma", true); – Burada Animatör içerisindeki “Koşma” ismindeki Boolean parametresine “True” değeri gönderiyoruz.
  • kontrol.SetBool("Kosma", false); – Burada Animatör içerisindeki “Koşma” ismindeki Boolean parametresine “False” değeri gönderiyoruz.
  • kontrol.SetInteger("Ziplama", 15); – Burada Animatör içerisindeki “Ziplama” ismindeki Integer parametresine “15” değerini gönderiyoruz.
  • kontrol.SetInteger("Ziplama", 5); – Burada Animatör içerisindeki “Ziplama” ismindeki Integer parametresine “5” değerini gönderiyoruz.

Çalışmanın son hali aşağıdaki gibidir.

Geçiş animasyonlarının tamamlanmış hali

Dersimizin başlarında “Root Motion” animasyonlardan bahsetmiştik. “Root Motion” animasyonlar seçildiğinde ise aşağıdaki gibi bir görüntü olacaktır.

Root Motion animasyon geçiş

Şimdi animasyonları kullanırken karşılaştığımız ayarları biraz daha detaylı inceleyelim.

Animator Component Ayarları

Unity Animator Objesi Ayarları
Unity Animator Objesi Ayarları

Sahnemizde yer alan bir objeye animasyon eklemek için kullanılan bileşendir. Eğer herhangi bir objede animasyon olmasını istiyorsak “Animator Controller” yapısının mutlaka olması ve “Animator” bileşeni üzerinden seçilmesi gerekmektedir.

Controller: Objenin animasyonlarını kontrol edecek olan “Animator Controller” dosyasını seçildiği bölümdür.

Avatar: İnsansı bir karakter üzerinde animasyon işlemi gerçekleştirileceği zaman iskelet yapısının tanımlanası için kullanılan bölümdür.

Apply Root Motion: Animasyon eklenen objenin pozisyonu ve rotasyonunun nasıl hesaplanacağının belirlendiği kısımdır. Eğer işaretli olarak bırakılırsa karakter pozisyon bilgisini oyunun genelinden alır ve işaretlenmezse script dosyasından bilgi bekler.

Şöyle düşünebilirsiniz yürüyen bir karakteriniz var ve eğer “Apply Root Motion” kutucuğunu işaretlemezseniz olduğu yerde durarak yürüme animasyonunu sergileyecektir. İşaretlerseniz oyunun pozisyon bilgilerini baz alarak sahne üzerinde ilerleyecektir.

Update Mode: Animasyonun hangi zaman ölçeğini ve ne zaman güncelleneceğinin belirlendiği kısımdır. “Normal”, “Animate Physics” ve “Unscaled Time” şeklinde üç farklı ayarı bulunmaktadır.

  • Normal: Zaman ölçeğinin animatör hızının zaman ölçüsüyle eşit olarak davranması için seçilir. Zaman ölçeği yavaşlatıldığı zaman animasyonlarda yavaşlayacaktır.
  • Animate Physics: FixedUpdate metodu ile senkronize çalışacaktır. Eğer animasyon uygulanacak obje oyundaki diğer fiziksel etkileşime girebileceği objelerle sürekli iletişim halindeyse, daha gerçekçi olması için kullanılan ayardır.
  • Unscaled Time: Normal zaman ölçeğinde çalışacaktır fakat zaman ölçeğinin yavaşlaması ya da hızlanması durumunda animasyon hızında değişiklik olmayacaktır. Örneğin oyun durdurulduğunda da bazı animasyonların oynamaya devam etmesini istiyorsanız bu seçeneği kullanabilirsiniz.

Culling Mode: Animasyonun hangi durumlarda çalışmaya devam edeceğinin ayarlandığı kısımdır.

Buradaki mantığı anlamanız için 10 saniyelik bir animasyonunuzun olduğunu ve 5. saniyesinde animasyonunuzun kamera açısının dışında kaldığını düşünün. Kamera açısı aynı animasyonu göstermeye devam ettiğinde animasyonun hangi süreden devam edeceğinin belirlendiği kısım gibi düşünebilirsiniz.

  • Always Animate: Sahnede yer alan bir animasyon kamera açısının dışında bile kalsa çalışmaya devam edecektir.
  • Cull Update Transforms: Animasyon görünür durumdan çıktığı sırada çalışmayı durdurur ama kaldığı son durum hafızaya alınır ve tekrar görünür olduğunda kaldığı yerden devam eder.
  • Cull Completely: Sahnede yer alan animasyon görünür olmadığında otomatik olarak animasyonu devre dışı bırakacaktır. Animasyon tekrar gösterildiğinde kaldığı yerden başlamak yerine sıfırdan başlayacaktır.

Animator State Ayarları

Animator State Ayarları
Animator State Ayarları

Konumuzdaki örneğimizde animasyonlarımızı istediğimiz durumlarda çalışması için düzenlediğimiz ekranda yani “Animator” ekranında yer alan “State” şekillerinin “Inspector” ayarlarını inceleyeceğiz.

Diğer “Inspector” pencerelerine göre “Parameter” isminde bir özellik göreceksiniz. Bu özellik seçildiği zaman oluşturulmuş olan Float parametreleri bu alandan seçerek sonrasında C# üzerinden değiştirerek yeni değerler atayabilirsiniz. Sadece Float parametre almaktadır.

Motion: İlgili durumda hangi animasyonun yer alacağının seçildiği kısımdır.

Speed: Animasyonun hızının seçildiği kısımdır.

Mirror: Mevcut animasyona ayna etkisi yaratarak tam tersi şekilde işlemesini sağlar. Genellikle karakter animasyonlarında kullanılır.

Foot IK: İnsansı animasyonlarda fizik işlemlerinin aktif olması için işaretlenen alandır.

Write Defaults: Motion tarafında belirtilen animasyonun değerlerinin yansımayanlarının yazılıp yazılmayacağının belirlendiği kısımdır.

Transition: İlgili duruma gelen bağlantı yollarının belirtildiği kısımdır. Seçilmiş olan durumdan hangi durumlara geçtiğini bu alandan görebilirsiniz.

  • Mute: Belirtilmiş olan state yani duruma geçişi pasif duruma getirmek için kullanılan alandır. İşaretlendiği zaman ilgili geçiş gerçekleşmeyecektir.
  • Solo: Eğer bir durumdan farklı birkaç duruma geçiş varsa aralarında seçim yapmak için kullanılır. Birden fazla bağlantı varsa ve bir geçişi “Solo” olarak belirlediyseniz her zaman o duruma yönelecektir. Bu durumda diğer bağlantılar çalışmayacaktır.

Add Behaviour: Bu alandan “State” yapısının durumlarını alabileceğimiz bir C# Script ekleyebiliriz.

“Add Behaviour” botununa tıklandığında sizden bir script ismi vermenizi isteyecektir. İsim verme işleminden sonra script dostasını açarsanız hazır tanımlı metotların yazıldığı ama yorum satırı haline getirilmiş bir hazır script dosyası göreceksiniz.

Burada “State” üzerinde yer alan animasyon başladığında, devam ettiğinde ve bittiğinde bilgi alarak, müdahale etme gibi işlemler yapabiliriz. OnUpdate OnStart metotları gibi düşünebilirsiniz fakat start için geçerli gibi.

  • OnStateEnter: Animatör penceresinde ilgili duruma(state) geçildiğinde çalışır.
  • OnStateUpdate: Animatör penceresinde ilgili durum(state) devam ederken çalışır.
  • OnStateExit: Animatör penceresinde ilgili durumdan(state) çıkarken çalışır.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class stateDurumlari : StateMachineBehaviour
{
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("Animasyon Başladı");
    }

    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("Animasyon Devam Ediyor");
    }

    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("Animasyon Bitti");
    }

}

Animator Transition Ayarları

animator transition ayarlari 1
Animator Transition Ayarları

Animatör penceresinde yer alan durumlar arasında geçişleri yapmamızı sağlayan “Transition” ayarlarını inceleyeceğiz.

Has Exit Time: Bir durumdaki animasyondan diğer durumdaki animasyona geçiş sırasında mevcut animasyonun bitme süresinin bekleyip, beklememesinin ayarlandığı kısımdır.

Şöyle düşünebilirsiniz, örneğin bir karakteriniz üzerinde 3 saniye süren bir animasyonunuz mevcut ve sonrasında farklı bir animasyon göstereceksiniz. Eğer “Has Exit Time” alanı işaretli olursa ilk animasyonunuzun yani 3 saniyelik animasyonun bitmesini beklemeniz gerekecektir. Eğer işareti kaldırırsanız diğer animasyona geçmek için bir parametre aldığında ilk animasyonun bitmesini beklemeyerek direk diğer animasyona geçecektir.

Settings: “Has Exit Time” alanı seçildikten sonra etkin olan ayarları barındırmaktadır.

  • Exit Time: Mevcut bir durumdaki animasyondan geçiş yapacağı diğer durumdaki animasyona geçmesi için animasyonunun ne kadar tamamlaması gerektiğinin belirlendiği kısımdır. Örneğin yine 3 saniyelik bir animasyonunuz varsa ve bu ayarı “0.50” olarak ayarlarsanız 1.5 saniye sonra diğer durumdaki animasyona geçecektir. 0-1 arasında değer almaktadır.
  • Fixed Duration: İşaretlenmesi durumunda geçiş süresi saniye olarak hesaplanacaktır.
  • Transition Duration: Animasyonlar arasındaki geçişin işlemlerinde geçiş sertliğinin ayarlandığı kısımdır. Ne kadar küçük bir değer verilirse iki animasyon arasında keskin bir geçiş olur.
  • Transition Offset: Geçiş yapılan animasyonun ne kadarının oynamaya başlanmış olacağının belirlendiği alandır. “0.50” değeri verilirse yarısından başlayacaktır. 0-1 arasında değer almaktadır.
  • Interruption Source: Durum yani state geçişleri sırasında olası problemlerde nasıl davranması gerektiğinin belirlendiği kısımdır.
    State üzerindeki tüm geçişler sıraya alınarak işlem yapılmaktadır.
    • None: Herhangi bir işlem yapmayacaktır.
    • Current State: Sorun olması durumunda mevcut durumdan tekrar sıraya koyarak işlem yapacaktır.
    • Next State: Sorun olması durumunda mevcut durumu atlayarak sonraki durumdan tekrar sıraya koyarak işlem yapacaktır.
    • Current State then Next State: Sorun olması durumunda, mevcut durumda ki geçişleri sıraya koyar ve sonrasında geçiş yapacağı durumdaki geçişleri sıraya koyar.
    • Next State then Current State: Sorun olması durumunda, bir sonraki durumdaki geçişleri sıraya koyar ve sonrasında mevcut durumdaki geçişleri tekrar sıraya koyar.

Şimdilik dersimiz buraya kadar ama ilerleyen derslerde buraya karakterimizi giydirerek kendi yaptığımız bir animasyonu eklemeyi planlıyorum