Bu özellik Erken Erişim kapsamındadır. Bu özelliği içeren bir adayı yayınlayabilirsin ancak Erken Erişim dönemi boyunca olabilecek değişikliklerin adanı bozabileceğini ve aktif olarak müdahale etmeni gerektirebileceğini göz önünde bulundur.
NPC Çıkma Yerleri, Sequencer’da bir bağlama yaşam süresi parçası gerektirir. Bu parça, 31.00 sürümünden önce oluşturulmuş mevcut sekanslara geriye dönük olarak eklenemez. Bir sekans içinde NPC çıkma yeri kullanan herhangi bir adayı, bağlama yaşam süresi parçasını ekledikten sonra yeniden yayınlaman gerekir.
Bağlama yaşam süresi parçası eklemek için:
-
Parça listesinde NPC Çıkma Yeri’nin yanındaki + simgesine tıkla.
-
Açılır menüden Bağlama yaşam süresi'ni seç.
Çeşitli şekillerde ve NPC Çıkma Yeri cihazı da dahil olmak üzere birden fazla cihazda oynatılabilecek özel karakter animasyonları oluşturmak için Sequencer’ı kullan. Yapay Zekâ Devriye Yolu üzerinde seçili noktalar boyunca, kalıplandırılmış davranışlara sahip animasyonlar ayarlamak ve oynatmak için olayları veya Sinematik Sekans ile eşleştirilmiş Sequencer’ı kullan.
Unreal Engine’dan (UE) MetaHumans da dahil olmak üzere özel animasyonlar içe aktarabilir ve geçirebilirsin. Bunu yapabilmek için, iskelet örgüyü NPC karakterlerine uyacak şekilde yeniden hedeflemen gerekebilir çünkü Fortnite karakterleri kendi iskelet yapılarına sahiptir.
MetaHuman karakterler bellek açısından yoğundur. Kullanacağın MetaHuman öğelerinin sayısını sınırlandırman doğru olacaktır.
Sequencer’da NPC’leri Animasyonlu Hale Getirme
NPC çıkma yeri cihazı projen için, etkileşimli karakterlerden bilgilendirici ara sahnelere kadar çeşitli oyun yaratıcılığı fırsatlarının kapısını açar. NPC çıkma yeri için Control Rig ile özel animasyonlar oluşturabilir veya satın aldığın ya da başka bir yazılımda oluşturduğun animasyonları içe aktarabilirsin.
NPC’leri yeniden hedeflenmiş bir animasyon veya ifade ile animasyonlu hale getirmek için FK Control Rig’i de kullanabilirsin.
UE dokümantasyonunda FK Control Rig animasyon iş akışları hakkında daha fazla bilgi edin.
NPC karakterleri içeren animasyonlar çekmek için aşağıdaki adımları izle.
-
Bir Bölüm Sekansı oluşturmak için İçerik Tarayıcısı’nda sağ tıkla.
-
Bölüm Sekansı küçük resmini yeniden adlandır.
-
Sekans Editörü’nü açmak için Bölüm Sekansı küçük resmine çift tıkla.
-
+Parça’ya tıkla, ardından Aktörden Sequencer’a > NPC Çıkma Yeri’ni seç. Bunun sonucunda NPC çıkma yeri cihazı Bölüm Sekansı parçasına eklenmiş olacaktır.
NPC çıkma yeri cihazını Bölüm Sekansına eklemek için onu Anahat Düzenleyici’den parça listesine sürükleyebilirsin.
-
Parça listesinde NPC çıkma yeri cihazının yanındaki + simgesine tıkla ve Control Rig > Control Rig Sınıfları > FK Control Rig’i seç. Böylece NPC’nin iskeleti parçaya eklenmiş olur ve iskeletin her bir kemiğini değiştirmek ve kaydetmek üzere bu kemiklere erişim elde edersin.
-
Görünüm Penceresi, Animasyon Anahat Düzenleyicisi veya Sequencer’dan taşımak istediğin kemikleri seç ve bunları animasyonun için bir başlangıç konumuna taşı.
-
Taşıdığın kemiklerin yanındaki + simgesine tıklayarak ilk anahtar kareyi ayarla.
Kendi oluşturduğun veya bir FBX animasyon sekansı dosyası olarak satın aldığın bir animasyonun varsa bu dosyaları, bir NPC çıkma yeri cihazının zaman çizelgesindeki animasyon parçasına, NPC Çıkma Yeri’nin yanındaki + simgesine tıklayıp Animasyon > Animasyon dosyası’nı seçerek ekleyebilirsin.
Animasyonun tamamlanana kadar Sequencer zaman çizelgesinde kemikleri hareket ettirmeye ve yeni anahtar kareler ayarlamaya devam et. Animasyon tamamlandıktan sonra hareketin tercihlerine uygun olduğundan emin olmak için animasyonu Sequencer’da oynat.
Bir animasyonu geriye doğru oynatmanın basit bir yolu, zaman çizelgesinde animasyon dosyasına sağ tıklayıp Özellikler > Tersine Çevir’i seçmektir.
Sonuçlardan memnun olduğunda, animasyonu iskelet örgüye ön işlemenin zamanı gelmiş demekttir. NPC Çıkma Yeri üzerinde sağ tıkla ve Animasyon Sekansını Ön İşle’yi seç.
İskelet örgünün uzuvlarının, animasyonu oynatırken iskelet örgü gövdesinin diğer kısımlarını kırpmadığından emin ol.
Davranışsal Öznitelikleri Kaydetme
Davranışsal öznitelikleri NPC çıkma yeri cihazıyla da kullanabilirsin. Davranış seçenekleri, NPC’nin Fortnite Battle Royale NPC’lerinden devraldığı temel özelliği belirler. Bu özellikler, NPC’nin bir muhafız gibi mi yoksa vahşi hayvan gibi mi davranacağını belirler.
Davranışsal özniteliklerin NPC çıkma yeri cihazıyla nasıl ayarlanacağı konusunda daha fazla bilgi için NPC Karakter Tanımı dokümanına bak.
Bu davranışsal öznitelikleri ayarladıktan sonra animasyonlar için bir Bölüm Sekansında anahtar kareler oluşturabilir ve bunları oyun sırasında bir Sinematik Sekans cihazında oynatabilirsin. Yukarıdaki adımlardan farklı olarak, performansı Control Rig’e yansıtmana gerek yoktur, çünkü davranış, NPC çıkma yeri cihazının seçeneklerinde ayarlanmıştır.
Oluşturduğun animasyonu veya Yapay Zekâ Devriye Yolu Düğümü cihazı ile devralınan davranışı da kullanabilir ve Sinema Kamera Aktörü ile oluşturduğun yolu takip ederek NPC’yi kaydedebilirsin.
Çıkarılabilir ve Değiştirilebilir NPC Bağlamaları
Artık sekanslarına NPC eklemek için iki yeni yol bulunuyor: çıkarılabilir NPC bağlama ve değiştirilebilir NPC bağlama. Bu bağlamalar NPC Karakter tanımlarından oluşturulur.
Çıkarılabilir NPC Bağlama
Bir sinematik sekans kullanarak çıkarılabilir NPC bağlama, bir NPC karakter tanımına göre dünyada bir aktör oluşturabilir. Bu NPC’nin animasyonu, herhangi bir iskelet örgüde olduğu gibi Sequencer’da oluşturulabilir.
Çıkarılabilir bir NPC bağlama oluşturmak için, NPC karakter tanımını Sequencer’a sürüklemen yeterlidir:
Büyütmek için gif’e tıkla.
Çıkarılabilir bağlama, diğer tüm iskelet örgü aktörleri gibi animasyonlu hale getirilebilir. Örneğin:
-
+ Animasyon öğesine tıkla ve NPC karakter tanımı için bir dans ifadesi seç.
Büyütmek için gif’e tıkla.
-
Oynatma çizgini daha da ileriye taşı, NPC’ni yeni bir konuma sürükle ve yeni bir anahtar kare ayarla. NPC şimdi A noktasından B noktasına hareket edecektir.
Büyütmek için gif’e tıkla.
Değiştirilebilir NPC Bağlama
Değiştirilebilir NPC bağlama, dünyaya çıkan bir NPC’nin kontrolünü devralacak ve onu sekansına yerleştirecektir. Ardından, Sequencer’da oluşturulan animasyonları gerçekleştirebilir. NPC, Sequencer’a bağlıyken tüm davranış, algılama ve yol izleme duraklatılır. Bunlar NPC’nin bağlantısı kesildiğinde devam ettirilir.
NPC, artık bağlı olmadığında ilk konumuna geri yerleştirilir.
Değiştirilebilir bir NPC bağlama oluşturmak için önce çıkarılabilir bir NPC bağlama oluştur, bağlamana sağ tıkla ve Seçilen bağlamayı dönüştür > Değiştirilebilir NPC karakteri seçimini yap.
Büyütmek için gif’e tıkla.
Dönüştürmeden sonra parça, bir bağlama yaşam süresi parçasıyla değiştirilir. Çıkarılabilir bağlamada yapılan tüm değişiklikler korunur.
Oynanış sırasında NPC’nin bulunabilmesi ve bağlanabilmesi için NPC karakter tanımına: Sequencer değiştiricisi’ni eklemen gerekir. Bunu, diğer değiştiricilerle aynı metodu kullanarak NPC karakter tanımına ekleyebilirsin. Bu değiştiriciyi eklemezsen, bir doğrulama hatası alırsın.
Büyütmek için gif’e tıkla.
Sequencer değiştiricisi bir Benzersiz Tanımlayıcı özelliğine sahiptir. Bu özellik, oyun içinde çıkan NPC’nin yerini belirlemek için kullanılır. Varsayılan değer, NPC karakter tanımının adıdır. İki farklı NPC karakter tanımı aynı benzersiz tanımlayıcıya sahipse, sekansın oyun içinde oynatıldığında her ikisi de bağlanabilir.
Oyunda Sekansları Oynatma
Sekanslarını oynatmak için, sinematik sekans cihazını normal şekilde kullan.
Çıkarılabilir bağlamanın oynatılması için başka bir ayar yapılması gerekmez.
Değiştirilebilir bağlama, dünyana NPC karakter tanımını kullanan bir NPC Çıkma Yeri eklemeni gerektirir. Değiştirilebilir bağlama, bağlanacak bir NPC bulamazsa İstemci günlüğünde aşağıdaki satırı görürsün:
LogFortNPCMovieSceneBindings: Uyarı: NPC Karakter Tanımı Muhafızı kullanılarak bir piyona bağlanılamadı. Lütfen en az bir tane çıkarıldığından emin ol.
NPC'yi sekansının oynatılmasıyla aynı anda çıkarmak istiyorsan. Çıkarılabilir bir bağlama kullanmayı veya sinematik sekans cihazındaki Oynat fonksiyonuna Çıkarıldığında olayını bağlamayı düşün.
Özel Blueprint NPC’leri
Özel Blueprint kullanan bir NPC karakter tanımı dışında çoğu NPC türü iskelet örgüleri olarak bağlanacaktır.
Bu, Blueprint’i bağlayacak ve daha sonra Sequencer’da değiştirilebilecek VFX (Görsel Efekt) gibi ek bileşenleri ortaya çıkaracaktır.
Burada, NPC’nin kafasını patlatmak için Sequencer’da bir Niagara parçacık sisteminin değiştirildiğini görebilirsin:
Büyütmek için gif’e tıkla.
Bilinen Kısıtlamalar
- Değiştirilebilir NPC bağlamaları yalnızca Görünürlük: Herkes olarak ayarlanan Sinematik Sekans cihazıyla kullanılabilir. Başka bir Görünürlük ayarının kullanılması doğrulama hatasına neden olur.
- Değiştirilebilir NPC bağlamasını, binilebilir veya evcilleştirilebilir vahşi hayvan NPC’leriyle kullanmaya çalışmak doğrulama hatasına neden olur.
- Bir NPC karakter tanımını kullanan değiştirilebilir NPC bağlamaları, Tamamlanma Durumunun Bitişini Geçersiz Kıl kullanıcı seçeneğinde Durumu Korumaya Zorla seçeneğini kullanamaz. Bu seçeneği kullanmaya çalışmak doğrulama hatası verecektir.
- Bir NPC, Sequencer tarafından bağlandığında yerine oturur. Ayrıca, gecikme sorunları NPC bağlandığında ve bağlantısı kesildiğinde çok kısa görsel hatalara neden olabilir. Bu nedenle, değiştirilebilir bir NPC bağlama kullanırken NPC’yi ekran dışında çıkarma, ekran geçişleri, VFX (Görsel Efekt) veya görünürlük izi gibi teknikleri kullanman şiddetle tavsiye edilir.
Animasyonları Verse ile Çağırma
Öğe yansıtması kullanarak animasyonları Verse’te kullanıma sunma yoluyla NPC’lerinde, animasyon modülünü kullanarak özel animasyonlar oynatabilirsin.
Animasyon Denetleyici Arayüzü
play_animation_controller arayüzü bir karakter üzerinde bir animasyon oynatmana olanak tanır ve GetPlayAnimationController() fonksiyonuyla alınabilir. Bu arayüz, animasyonlar oynatan iki fonksiyonu kullanıma sunar. Bunlar senkron Play() ve asenkron PlayAndAwait() fonksiyonlarıdır.
Her ikisi de aşağıdaki parametreleri kabul eder:
| Seçenek | Değer | Açıklama |
|---|---|---|
| Animasyon | Bir Animasyon Seç | Oynatılacak animasyon. Assets.digest.verse dosyasında bir animasyon belirtilmelidir eklenmelidir. |
| PlayRate | 1.0, Bir Oynatma Hızı Seç | Animasyonun oynatılacağı hız. 1.0 değeri, animasyonun varsayılan hızına karşılık gelir |
| BlendInTime | 0.0, Bir BlendInTime Seç | Önceki animasyondan mevcut animasyona geçiş yapma süresi. |
| BlendOutTime | 0.0, Bir BlendOutTime Seç | Geçerli animasyondan bir sonraki animasyona geçiş yapma süresi. |
| StartPositionSeconds | 0.0, Bir StartPositionSeconds Seç | Animasyonun oynatılmaya başlanacağı saniye cinsinden konum. |
Oynat ve Bekle Fonksiyonu
PlayAndAwait() fonksiyonu bir animasyonu eşzamansız olarak oynatır ve Completed, Interrupted ve Error olmak üzere üç değer içeren play_animation_result enum’ının bir örneğini döndürür. Completed tamamlanmış bir animasyonu, Interrupted kesintiye uğramış bir animasyonu, Error ise oluşan bir hatayı ifade eder. Bu enum’ı sorgulayarak animasyonunun sonucuna göre farklı kod çalıştırabilirsin.
AnimationResult := PlayAnimController.PlayAndAwait(MyAnimation)
case(AnimationResult):
play_animation_result.Completed => Print(“Animasyon Tamamlandı!”)
play_animation_result.Interrupted => Print("Animasyon Kesintiye Uğradı.")
play_animation_result.Error => (“Animasyon sırasında Hata Oluştu.”)
Oynatma Fonksiyonu
Play() fonksiyonu eşzamanlı olarak çalışır ve playing_animation_instance sınıfının bir örneğini döndürür. playing_animation_instance sınıfı, devam eden bir animasyonu sorgulamana ve değiştirmene olanak tanır ve aşağıdaki değerleri içerir:
| Değer | Açıklama |
|---|---|
| GetState() | Bu fonksiyon, bir play_animation_state enum’ındaki bir animasyon kayıttan oynatımının geçerli durumunu döndürür. |
| Stop() | Bu fonksiyon geçerli animasyonu durdurur. |
| CompletedEvent | Bu olay, bir animasyon tamamlandığında tetiklenir |
| InterruptedEvent | Bu olay, bir animasyon kesintiye uğradığında tetiklenir. |
| BlendedInEvent | Bu olay, bir animasyonun sonlandırma işlemi tamamlandığında tetiklenir. |
| BlendingOutEvent | Bu olay, bir animasyonun sonlandırma işlemi başladığında tetiklenir. |
| Await() | Bu fonksiyon animasyonun tamamlanmasını veya kesintiye uğramasını bekler. Bu, kayda değer bir şekilde bir play_animation_result enum’u döndürür ve işlevsel olarak PlayAndAwait() fonksiyonunun çağrılmasıyla aynıdır. |
Devam eden animasyonları değiştirmek veya animasyonunda belirli koşullar karşılandığında kod çalıştırmak için Play() fonksiyonunu kullanabilirsin.
# Bir animasyonu eşzamanlı olarak oynat ve onun animasyon örneğini al
AnimationInstance := PlayAnimController.Play(MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
# Animasyon tamamlandığında çalışan bir fonksiyona bağlan
AnimationInstance.CompletedEvent.Subscribe(OnAnimationComplete)
Sleep(1.0)
AnimationState := AnimationInstance.GetState()
# Animasyon bir saniye sonra hâlâ oynatılıyorsa animasyonu durdur
if(AnimationState = play_animation_state.BlendingOut):
AnimationInstance.Stop()
Animasyon Oynatma Örneği
Aşağıdaki kod, bir animasyonu oynatmak için animasyon modülünü kullanan bir NPC davranışı örneğini göstermektedir. Karakterlerinde oynatmak istediğin tüm özel animasyonların öncelikle öğe yansıtması aracılığıyla Verse’te kullanıma sunulması ve Assets.digest.verse dosyasında görünmesi gerektiğini eklenmelidir. Bu örnekte, MyAnimation animasyonu, Assets.digest.verse içindeki özel MyCharacter karakterinin Animasyonlar modülünde yer alır ve bu nedenle MyCharacter.Animations.MyCharacter aracılığıyla çağrılır.
using { /Fortnite.com/AI }
using { /Fortnite.com/Animation/PlayAnimation }
using { /Verse.org/Simulation }
using { /Fortnite.com/Characters }
basic_play_anim_example := class(npc_behavior):
# Animasyonun oynatılacağı hız.
@editable
PlayRate : float = 1.0
# Önceki animasyondan mevcut animasyona ne kadar sürede
# geçiş yapılacağını belirtir.
@editable
BlendInTime : float = 0.25
# Geçerli animasyondan sonraki animasyona ne kadar sürede
# geçiş yapılacağını belirtir.
@editable
BlendOutTime : float = 0.25
# Animasyonun oynatılmaya başlanacağı
# saniye cinsinden konum.
@editable
StartPositionSeconds : float = 0.0
# Animasyonu yeniden başlatmadan önce beklenecek süre.
@editable
SleepDuration : float = 2.0
OnBegin<override>()<suspends>:void=
if:
# NPC Karakterinin animasyon denetleyicisini al
Agent := GetAgent[]
FortCharacter := Agent.GetFortCharacter[]
PlayAnimController := FortCharacter.GetPlayAnimationController[]
then:
AnimationResult := PlayAnimController.PlayAndAwait(MyCharacter.Animations.MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
# Animasyonun çalıştırılmasının sonucunu yazdır.
case(AnimationResult):
play_animation_result.Completed => Print(“Animasyon Tamamlandı!”)
play_animation_result.Interrupted => Print("Animasyon Kesintiye Uğradı.")
play_animation_result.Error => (“Animasyon sırasında Hata Oluştu.”)
Sleep(SleepDuration)
# Bir animasyonu eşzamanlı olarak oynat ve onun animasyon örneğini al.
AnimationInstance := PlayAnimController.Play(MyCharacter.Animations.MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
Sleep(SleepDuration)
AnimationState := AnimationInstance.GetState()
# Animasyonun geçerli durumunu yazdır.
case(AnimationState):
play_animation_state.Playing => Print(“Animasyon Oynatılıyor!”)
play_animation_state.Playing => Print(“Animasyon Öncekinden Geçiş Yapıyor!”)
play_animation_state.Playing => Print(“Animasyon Sonrakine Geçiş Yapıyor!”)
play_animation_state.Completed => Print(“Animasyon Tamamlandı!”)
play_animation_state.Stopped => Print(“Animasyon Durduruldu!”)
play_animation_state.Interrupted => Print(“Animasyon Kesintiye Uğradı!”)
play_animation_state.Error => Print(“Animasyon Sırasında Hata Oluştu”)
else:
Print(“Animasyon denetleyicisi alınamadı”)