Bir durum makinesi, animasyon düğümlerini Idle, Walk, Run ve Jump gibi adlandırılmış durumlara birleştirir. Aktif durumu oynatır ve bir geçiş koşulu true olarak değerlendiğinde başka bir duruma geçiş yapar. Geçiş mantığı yazmadan hangi animasyonların birbirini takip edebileceğini tanımlamak için bir durum makinesi kullanın.
Her durum, durum makinesinin bir girişine bağlanır. Bir durum, bir klip, bir karışım düğümü veya başka bir durum makinesi olabilir. Durum makinesi, aktif animasyon pozunu veya geçiş yaparken iki poz arasında bir karışımı çıkış olarak verir; bunu grafikteki bir sonraki düğüme bağlarsınız.
Ön koşullar
Bir durum makinesi oluşturmadan önce, Animasyon Grafik Editörü ile tanışın, nasıl açılacağını ve bir animasyon grafiği oluşturulacağını öğrenin.
Bir durum makinesi oluşturun
Aşağıdaki örnek, JumpFallLandRunExample'dan üç durumu kullanır: Locomotion, Fall ve LandIdle. Karakter normal bir şekilde hareket eder, havadayken düşme animasyonuna geçer ve yere inmeden önce bir iniş animasyonu oynatır. Bu adımlar, durum makinesine odaklanır; lokomasyon, düşme ve iniş için animasyon düğümleri ile başlayın.
Grafik Editörü'nde sağ tıklayın ve Düğüm Ekle ⟩ Durum Makinesi'ni seçin.

Durum makinesi düğümünde Aç'a tıklayın. Durum Makinesi görünümünde, Durum Oluştur'u kullanarak Locomotion, Fall ve LandIdle adında üç durum ekleyin.

Grafiğe Geri Dön'e tıklayın ve animasyon düğümlerinizi ilgili durum makinesi girişlerine bağlayın:
- Locomotion: Lokomasyon animasyonunuzu bağlayın. Referans grafiği, Speed'e göre idle ve koşu animasyonlarını karıştırmak için IdleRunBlend adında bir Blend1DNode kullanır.
- Fall: Düşme ClipNode'unu bağlayın ve Oynatma Modu'nu Enum.AnimationNodePlayMode|OnceAndHold olarak ayarlayın, böylece karakter yere inene kadar son pozunu korur.
- LandIdle: Bir iniş klibi bağlayın ve Oynatma Modu'nu Enum.AnimationNodePlayMode|OnceAndHold olarak ayarlayın, böylece tamamlanabilir ve lokomasyona geçiş yapabilir.
Durum makinesi çıkışını Grafik Çıkışı'nın Poz girişine bağlayın.

Durum Makinesi görünümünü tekrar açın ve (Giriş)'ten Locomotion'a bir geçiş sürükleyin. Durum makinesi, grafik başladığında bu durumda başlar.

Grounded adında bir Boolean grafik parametresi ekleyin ve true olarak ayarlayın. Bu parametre, karakterin yerde olup olmadığını gösterir.
Aşağıdaki geçişleri ekleyin; kaynak durumdan hedef duruma bir bağlantı sürükleyin, ardından her geçişi yapılandırın:
- Locomotion'dan Fall'a: Bekle'yi İfade olarak ayarlayın, İfade'yi not Grounded olarak ayarlayın ve Uzunluk'u 0.2 saniye olarak ayarlayın. Düşme animasyonu, karakter yerden ayrıldığında başlar.
- Fall'dan LandIdle'a: Bekle'yi İfade olarak ayarlayın, İfade'yi Grounded olarak ayarlayın ve Uzunluk'u 0.1 saniye olarak ayarlayın. İniş animasyonu, karakter yere değdiğinde başlar.
- LandIdle'dan Locomotion'a: Bekle'yi Tamamlandı olarak ayarlayın, Ne Zaman'ı Enum.AnimationNodeTransitionWhen|BeforeFinished olarak ayarlayın ve Uzunluk'u 0.2 saniye olarak ayarlayın. Durum makinesi, iniş animasyonunun son 0.2 saniyesinde lokomasyona geri karışmaya başlar.

Üç geçiş için Eğri'yi varsayılan (Linear) olarak bırakın. Grafiği önizleyin ve Grounded'ı false olarak değiştirin, böylece Fall'a geçin, ardından tekrar true yaparak LandIdle'ı oynatın ve Locomotion'a geri dönün.
Karakter yerden ayrıldığında ve yere değdiğinde Grounded'ı oyun kodunuzdan güncelleyin. Lokomasyon karışımınız Speed kullanıyorsa, karakter hareket ettikçe o parametreyi güncelleyin. Parametre iş akışı için API entegrasyonu kısmına bakın.
Durum makinesini zıplama ve ek iniş durumları ile genişleterek tam hareket grafiğini oluşturun. JumpFallLandRunExample, duruma göre farklı zıplamalar ve inişler içerir.
Durum makinesi özellikleri
Durum makinesi düğüm özellikleri
- Girişler
- State1...StateN: Her durumu tanımlayan animasyon düğümleri. Durumun adı, durum makinesi düğümündeki girişin adıyla eşleşmelidir.
- Özellikler
Özellik Tür Açıklama EntryState ObjectValue Grafik başladığında aktif olan duruma işaret eden bir ObjectValue. - Olay verisi
- Olay Yönetimi: Aktif durumdan gelen olaylar, ağırlıkları değişmeden geçer.
- Olay Yayılımı: Sadece aktif durumdan gelen olayları geçirir. Bir geçiş sırasında, olay yayılımı küresel olay kurallarını takip eder.
Geçiş özellikleri
Bir geçiş, bir veya daha fazla kaynak durumu, bir hedef durumu ve bir koşul içerir. Aktif durum bir kaynak durumu ile eşleştiğinde, durum makinesi koşulu kontrol eder. Koşul true olarak değerlendiğinde hedef duruma geçiş yapar.
Bekle, geçiş koşulu UI'sini belirler. İfade (Enum.AnimationNodeWaitFor|Trigger) seçildiğinde bir İfade kutusu görüntülenir. Bir İfade, doğrudan bir boolean grafik parametresine, örneğin ShouldJump, veya Speed >= 12 gibi bir koşulu değerlendirebilir. Tamamlandı (Enum.AnimationNodeWaitFor|Finished) seçildiğinde Ne Zaman açılır.
Birden fazla geçişin İfade'si doğru olduğunda, durum makinesi önce en yüksek Öncelik değerine sahip geçişi değerlendirir. Öncelikler aynı olduğunda, rastgele bir geçiş seçer. Sonucu öngörülebilir hale getirmek için rekabet eden geçişlere farklı öncelikler atayın.
| Özellik | Tür | Açıklama |
|---|---|---|
| From | ObjectValue | Geçişi başlatabilecek duruma işaret eden bir ObjectValue. (Herhangi bir) geçiş için bu özelliği ayarlamayın. |
| To | ObjectValue | Hedef duruma işaret eden bir ObjectValue. |
| WaitFor | Enum.AnimationNodeWaitFor | Hangi geçiş koşulu UI'sinin görüneceğini belirler. Enum.AnimationNodeWaitFor|Trigger, İfade kutusunu görüntüler. Enum.AnimationNodeWaitFor|Finished, Ne Zaman açılır. |
| When | Enum.AnimationNodeTransitionWhen | Bekle Tamamlandı olduğunda kullanılabilir. Kaynak durum tamamlandığında başlamak için Enum.AnimationNodeTransitionWhen|Finished'ı veya kaynak durum tamamlanmadan bir Süre önce karışmaya başlamak için Enum.AnimationNodeTransitionWhen|BeforeFinished'ı seçin. |
| Expression | String | Bekle İfade olduğunda kullanılabilir. true olarak değerlendiğinde geçişi başlatan bir boolean grafik parametresi veya ifadesidir. Desteklenenler için İfade kısmına bakın. |
| Priority | Number | Birden fazla İfade doğru olduğunda kullanılan sıralama. Daha yüksek değerler önceliklidir. Geçerli değerler 0 ile 65,535 arasında değişir. |
| Duration | Number | Hedef duruma karışmak için geçen süre, saniye cinsinden. Varsayılan 0.15 saniyedir. |
| Curve | Enum.PoseEasingStyle | Karışım sırasında kullanılan easing. Sadece Linear ve CubicV2 desteklenir. Varsayılan Linear'dır. |