Unity ile oyun yapma serimizin 6. bölümünde Tower Defence oyunumuzdaki düşmanlar için karakter animasyonu ekleyeceğiz. Şuan için planımızda dört farklı durum için animasyon ekleme işlemi bulunuyor.
- Yürüme Animasyonu: Karakterlerimiz haritada hedefe doğru yürürken ki animasyonları.
- Vurulma Animasyonu: Karakterlerimize kulelerden çıkan mermiler isabet ettiğinde oluşan animasyon.
- Ölme Animasyonu: Karakterlerimizin canları bittiği zamanki ölme animasyonu.
- Bitiş Animasyonu: Karakterlerimiz bitiş noktasına ulaştığı zamanki animasyonlar.
Düşman karakteri için kullanacağımız şablonları Asset Store üzerinden ücretsiz olarak indirmiştik. Zaten bizim için uygun bir asset ararken içerisinde karakter animasyonu olmasına dikkat etmiştik. Şimdi bizim burada yapacağımız uygun zamanda uygun animasyonu çalıştırabilmek olacak. Biz yine de emeğe saygı olması için indirdiğimiz assetlerin linkleri tekrar aşağıda belirtelim.
Karakter Animasyonu için Animator Yapısı
İlk olarak animasyonlarımızın bir yapısı yani hangi durumlarda devreye gireceğini ya da diğer karakter animasyonu durumuna geçeceğini ayarlamamız gerekecek. Bu bölüm sonrasında aşağıdaki gibi bir yapı oluşturmuş olacağız.
Tabi bu derse başlamadan önce Unity Animasyon Dersleri konumuza göz atmanızı tavsiye ederim.
İlk olarak “Assets/Animation” klasörünü açalım ve içerisinde “Create/Animator Controller” ile yeni bir Animator Controller oluşturarak ismini “DusmanAnimasyonKontrol” olarak değiştirelim.
“Animator Controller” dosyasına çift tıkladığınızda yönetim ekranı açılacaktır. Eğer açılmazsa “Window/Animation/Animator” üzerinden “Animator” penceresini açabilirsiniz.
İlk ekranda karşınızda “Any State”, “Entry” ve “Exit” isminde 3 adet “State” göreceksiniz. Ekranda siyah alanda boş bir yere sağ tıklayarak “CreateState/Empty” seçeneğine tıkladığınızda sahnede turuncu bir state oluşturacaktır. Üzerine tıklayarak sağ taraftaki “Inspector” penceresinden ismini “Baslangic” olarak değiştirin.
Şimdi ise yine aynı şekilde “CreateState/Empty” diyerek yeni stateleri oluşturacağız. Bu sefer renkleri gri olacaktır.
Aslında şuana kadar sadece animasyonlarımızın basamaklarını, durumlarını oluşturduk. Şimdi “Transition” yani durumlarımız arasındaki okları oluşturacağız. Bu oklar x durumunda y durumuna geçeceğini belirtiyor olacak. Tabi biz bu durumlar arasına bazı parametreler ekleyerek belirli koşullarda geçmesini sağlayacağız.
Şimdi “Baslangic” durumunun üzerine sağ tıklayarak “Make Transition” seçeneğini işaretleyerek “Yurume” durumuna tıklayalım. Böylece iki durum arasında bir geçiş oluşturmuş oluyoruz. Tüm geçişleri aşağıdaki gibi yapabilirsiniz.
Geçişleri ayarladıktan sonra geçişlerimizin hangi parametrelerle olacağını ayarlayacağımız kısma geldik. Bu işlem için sol tarafta yer alan “Parameters” sekmesinin altındaki + simgesine tıklıyoruz. İhtiyacımız olan iki adet “Bool” ve iki adet “Trigger” türünde parametre olmak üzere toplamda dört adet parametre olacak. İsimleri ve türlerini aşağıda belirtiyorum.
- Bool – Yurume
- Bool – Olme
- Trigger – HasarAlma
- Trigger – Ziplama
Parametrelerimizi oluşturduktan sonra daha önceden oluşturduğumuz transition yani geçişlere parametrelerimizi ekliyoruz.
Evet şuana kadar state, transition ve parametreleri ekledik. Fakat elimizde daha bir animasyon mevcut değil. Hangi duruma gelince hangi animasyonun gösterileceğini belirlememiz gerekiyor. Bunun için indirdiğiniz asset içerisindeki animasyonları belirleyerek isimlerini değiştirmeniz lazım. Fakat uğraşmamak için aşağıdaki bağlantıdan animasyonları indirerek “Assets/Animation” klasörünün içerisine atabilirsiniz.
İndirdiğiniz rar dosyasındaki animasyonları çıkartıp “Assets/Animation” klasörüne attıktan sonra her bir state üzerine gelerek “Inspector” penceresindeki “Motion” kısmından seçme işlemlerini yapabilirsiniz.
C# ile Animasyon Kontrolü
“Animator Controller” yapısını oluşturduktan sonra animator içindeki geçişleri C# script üzerinden kontrol edeceğiz. Bunun için daha önceden oluşturduğumuz “Dusmanlar” C# script dosyasını kullanacağız.
Animator ataması yapabilmek için değişkenleri eklediğimiz kısma aşağıdaki gibi bir Animator türünde obje ekliyoruz.
[SerializeField]public Animator animasyon;
Karakterin Yürüme Animasyonu
“Dusmanlar” script dosyasını daha önceden düşman karakterlerine atamasını yapmıştık. Bu sebeple ilk olarak “Start” metodunun içerisinden “Yurume” parametresini çağıracağız. Böylece sahnemizde bir düşman karakteri oluştuğunda “Dusmanlar” scripti içerisindeki “Start” metodu otomatik olarak başlayacak ve dolayısıyla karakter animasyonu arasından yürüme animasyonu başlayacaktır.
void Start() { saglik = baslangicSaglik; if (!saglikCanvas.activeSelf) saglikCanvas.SetActive(true); animasyon.SetBool("Yurume", true); }
Burada oluşturduğumuz “animasyon” objesi üzerinden “SetBool” ile “Yurume” parametresine “True” değeri gönderiyoruz. Hatırlarsanız “Başlangıç” ve “Yurume” durumları arasındaki “Transition” yani geçiş okuma “Yurume” parametresi “True” olursa diye belirtmiştik. Böylece animasyon.SetBool("Yurume", true);
yazarak yürüme animasyonun devreye girmesini sağlamış oluyoruz.
Karakterin Hasar Alma Animasyonu
Sonraki aşamamız ise karakterimize mermi isabet ettiği zaman oluşacak olan animasyon olacak. Hasar alma işlemi için daha önceki bölümlerimizde “HasarAlma” metodu oluşturmuştuk. Bu metodun içerisine bu sefer animasyon.SetTrigger("HasarAlma");
yazacağız. Böylece bu metot her çağrıldığında “SetTrigger” üzerinden karakter animasyonu içerisinden yürüme animasyonuna geçişini yapmış olacağız.
public void HasarAlma(float miktar) { animasyon.SetTrigger("HasarAlma"); saglik -= miktar; saglikBari.fillAmount = saglik / baslangicSaglik; if (saglik <= 0) DusmaniOldur(); }
Karakterin Ölme Animasyonu
Düşman karakterimizin canı bittiğinde Destroy metodu ile sahneden otomatik olarak siliyorduk. Fakat bu biraz basit gözüktüğü için bu kısmada bir animasyon ekliyoruz. Daha önceden eklediğimiz “DusmaniOldur” metodu üzerinden karakter sahneden silinmeden önce karakter animasyonu durumunu eklemiş olacağız.
void DusmaniOldur() { animasyon.SetBool("Olme", true); Destroy(GetComponent<NavMeshAgent>()); saglikCanvas.SetActive(false); Destroy(gameObject, 1.75f); }
Burada animasyonun devreye girmesi için animasyon.SetBool("Olme", true);
komutunu kullandık. Diğer eklediğimiz Destroy(GetComponent());
ise düşman karakterinin ölme animasyonundan sonra yerde yatarken hedefe doğru gitmeye devam etmesini engellemeye çalışmamız. Karakter üzerindeki “NavMeshAgent” bileşenine “GetComponent” ile erişerek “Destroy” metodu ile siliyoruz.
Karakterin Hedefe Ulaşma Animasyonu
Son olarak ise düşmanlarımız bitiş noktasına geldiği zaman yapacağı animasyonu eklememiz olacak. Burada sanki bitiş noktasının içerisine zıplıyormuş gibi bir durum yaratmaya çalıştık. Fakat “Dusmanlar” script dosyamızda bu tarz bir metodu daha eklemedik.
Bu işlem için en pratik yöntem “OnTriggerEnter” metodunu kullanmak olacaktır. Eğer bitiş noktasının “Collider” için belirlenen alanına bir obje girdiğinde “OnTriggerEnter” otomatik olarak tespit edecektir. Aşağıdaki kodu scriptimizin en alt kısmına ekleyebilirsiniz.
private void OnTriggerEnter(Collider other) { if (other.gameObject.layer == 8) { saglikCanvas.SetActive(false); animasyon.SetTrigger("Ziplama"); Destroy(gameObject, 1f); } }
Burada kullandığımız if (other.gameObject.layer == 8)
ile sadece 8 numaralı layer için işlemlerin yapılması istemiş olduk. Hatırlamadıysanız kırmızı ve mavi bitiş noktalarının layer bilgisini “BitisNoktalari” olarak değiştirmiştik ve 8. sıradaydılar.
Sonrasında ise animasyon.SetTrigger("Ziplama");
ile “Ziplama” tetikleyicisini çağırdık ve animasyonun oynamasını sağladık. Son olarak ise Destroy(gameObject, 1f);
yazarak düşman karakterinin 1 saniye sonra sahneden silinmesini istedik.
Burada önemli bir kısmınız var. “OnTriggerEnter” metodunun devreye girmesi için düşman ya da bitiş noktalarından sadece birinin “Collider” bileşeninde “Is Trigger” özelliğinin açık olması ve “Rigidbody” bileşenin ekli olması gerekmektedir. Aşağıdaki videodaki gibi işlemleri gerçekleştirebilirsiniz.
Animator Bileşeninin Eklenmesi
Bu işlemlerimizden sonra oyunumuzu çalıştırdığınızda herhangi bir değişiklik göremeyeceksiniz. Çünkü daha animator bileşenini ekleyerek script dosyamıza atama işlemini gerçekleştirmedik.
Bu işlem için her iki düşman karakterimizi de açarak “Animator” bileşenini eklemeli ve “Controller” kısmından oluşturduğumuz “DusmanAnimasyonKontrol” isimli “Animator Controller” dosyamızı seçmemiz gerekiyor. Ayrıca “Avatar” kısmından da indirmeniz için verdiğim Karakter-Animation.rar dosyasının içerisinde yer alan “DusmanAnimasyonlarıRigAvatar” dosyasını seçmeniz gerekiyor.
Son olarak ise script dosyamıza direk bileşenimizi sürükleyerek bırakırsanız tüm işlemleri tamamlamış olacağız.
Karakter Animasyonlarının Son Durumları
Unity Karakter Animasyonu – Karakterin Yürüme Animasyonu
Unity Karakter Animasyonu – Karakterin Yürüme Animasyonu
Unity Karakter Animasyonu -Karakterin Ölme Animasyonu
Unity Karakter Animasyonu – Karakterlerin Bitiş Noktasına Varma Animasyonu
“Düsmanlar” Script Dosyasının Tamamı
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.AI; public class Dusmanlar : MonoBehaviour { [SerializeField]public float baslangicSaglik = 100; [SerializeField]public float saglik; [SerializeField]public Image saglikBari; [SerializeField]public Animator animasyon; [SerializeField]public GameObject saglikCanvas; void Start() { saglik = baslangicSaglik; if (!saglikCanvas.activeSelf) saglikCanvas.SetActive(true); animasyon.SetBool("Yurume", true); } public void HasarAlma(float miktar) { animasyon.SetTrigger("HasarAlma"); saglik -= miktar; saglikBari.fillAmount = saglik / baslangicSaglik; if (saglik <= 0) DusmaniOldur(); } void DusmaniOldur() { animasyon.SetBool("Olme", true); Destroy(GetComponent<NavMeshAgent>()); saglikCanvas.SetActive(false); Destroy(gameObject,1.75f); } private void OnTriggerEnter(Collider other) { if (other.gameObject.layer == 8) { saglikCanvas.SetActive(false); animasyon.SetTrigger("Ziplama"); Destroy(gameObject,1f); } } }
Hocam bu proje bittiğinde Fps oyunu yapıyoruz Gelecek mi ? (Gelmeyecekse yapabilirmisiniz)
sağoluns s s s
Devamı ne zaman?