Ta funkcja jest we udostępniana w ramach programu wczesnego dostępu. Możesz opublikować wyspę z tą funkcją, ale pamiętaj, że w okresie wczesnego dostępu zmiany mogą zepsuć twoją wyspę i wymagać twojej aktywnej interwencji.
Generatory postaci niezależnych wymagają w Sequencerze ścieżki wiązania czasu życia. Nie ma możliwości wstecznego dodania tej ścieżki do istniejących sekwencji utworzonych przed 31.00. Po dodaniu ścieżki wiązania czasu życia trzeba ponownie opublikować każdą wyspę, na której w sekwencji używa się generatora postaci niezależnych.
Aby dodać ścieżkę wiązania czasu życia:
-
Kliknij ikonę + obok Generatora postaci niezależnych na liście ścieżek.
-
Wybierz Wiązanie czasu życia z menu rozwijanego.
Użyj Sequencera, aby stworzyć niestandardowe animacje postaci, które można odtwarzać na wiele sposobów i na wielu urządzeniach, w tym na generatorze postaci niezależnych. Użyj zdarzeń lub Sequencera połączonego z urządzeniami sekwencji filmowych, aby ustawić i odtwarzać animacje z wzorcowymi zachowaniami wzdłuż wybranych punktów Ścieżki patrolu SI.
Możesz importować i migrować niestandardowe animacje z Unreal Engine (UE), w tym animacje MetaHuman. W tym celu konieczne może być dopasowanie siatki szkieletowej do postaci niezależnych, ponieważ postacie Fortnite mają własną strukturę szkieletu.
Postacie MetaHuman wymagają dużej ilości pamięci. Najlepiej jest ograniczyć liczbę używanych zasobów MetaHuman.
Animowanie postaci niezależnych w Sequencerze
Generator postaci niezależnych daje wiele możliwości tworzenia kreatywnych gier, od interaktywnych postaci po informacyjne przerywniki filmowe. Niestandardowe animacje dla generatora postaci niezależnych możesz tworzyć za pomocą Control Rig. Możesz też zaimportować animacje zakupione lub utworzone w innym oprogramowaniu.
Do animowania postaci niezależnych za pomocą animacji z dopasowaniem lub emotek możesz też użyć FK Control Rig.
Dowiedz się więcej o procesach animowania FK Control Rig w dokumentacji UE.
Aby uchwycić animacje z postaciami niezależnymi, wykonaj poniższe czynności.
-
Kliknij prawym przyciskiem myszy w Przeglądarce zawartości, aby utworzyć sekwencję poziomu.
-
Zmień nazwę miniatury sekwencji poziomu.
-
Kliknij dwukrotnie miniaturę sekwencji poziomu, aby otworzyć Edytor Sequencer.
-
Kliknij +Ścieżka i wybierz Aktor do Sequencera > Generator postaci niezależnych. Spowoduje to dodanie urządzenia generatora postaci niezależnych do ścieżki sekwencji poziomu.
Możesz przeciągnąć urządzenie generatora postaci niezależnych na listę ścieżek z Outlinera, aby dodać je do sekwencji poziomu.
-
Kliknij ikonę + obok urządzenia generatora postaci niezależnych na liście ścieżek, a następnie wybierz Control Rig > Klasy Control Rig > FK Control Rig. Spowoduje to dodanie szkieletu postaci niezależnej do ścieżki, zapewniając dostęp do poszczególnych kości szkieletu w celu manipulowania i nagrywania.
-
Wybierz kości, które chcesz przenieść z okna wizualizacji, Outlinera animacji lub Sequencera, i przenieś je do pozycji początkowej animacji.
-
Ustaw pierwszą klatkę kluczową, klikając ikonę + obok przesuniętych kości.
Jeśli dysponujesz animacją stworzoną lub zakupioną jako plik sekwencji animacji FBX, możesz dodać te pliki do ścieżki animacji urządzenia generatora postaci niezależnych na osi czasu, klikając ikonę + obok generatora postaci niezależnych i wybierając Animacja > Plik animacji.
Kontynuuj przesuwanie kości i ustawianie nowych klatek kluczowych na osi czasu Sequencera, aż animacja zostanie ukończona. Po ukończeniu animacji odtwórz ją w Sequencerze, aby upewnić się, że ruch jest zgodny z oczekiwaniami.
Aby łatwo odtworzyć animację wstecz, kliknij prawym przyciskiem myszy plik animacji na osi czasu i wybierz Właściwości > Odtwarzaj wstecz.
Po uzyskaniu zadowalających wyników nadszedł czas na wypalenie animacji na siatce szkieletowej. Kliknij prawym przyciskiem myszy generator postaci niezależnych i wybierz Wypal sekwencję animacji.
Upewnij się, że kończyny siatki szkieletowej nie przecinają innych części korpusu siatki szkieletowej podczas odtwarzania animacji.
Nagrywanie atrybutów zachowania
Atrybutów zachowania można również używać z generatorem postaci niezależnych. Opcje zachowania określają podstawową cechę, którą postać niezależna dziedziczy z postaci niezależnych Fortnite: Battle Royale. Cechy te określają, czy postać niezależna zachowuje się jak strażnik, czy jak zwierzę.
Więcej informacji na temat ustawiania atrybutów zachowania za pomocą generatora postaci niezależnych można znaleźć w dokumencie Definicja postaci niezależnej.
Po skonfigurowaniu tych atrybutów zachowania możesz utworzyć klatki kluczowe animacji w sekwencji poziomu i odtwarzać je na urządzeniu sekwencji filmowej podczas rozgrywki. W przeciwieństwie do wcześniejszych kroków, nie trzeba wypalać wydajności w Control Rig, ponieważ zachowanie jest ustawione w opcjach urządzenia generatora postaci niezależnych.
Możesz również użyć stworzonej przez siebie animacji lub zachowania odziedziczonego za pomocą urządzenia węzła ścieżki patrolu SI i nagrać postać niezależną podążającą ścieżką stworzoną za pomocą aktora kamery kinowej.
Możliwe do spawnowania i wymienne powiązania postaci niezależnych
Istnieją teraz dwa dodatkowe sposoby wprowadzenia postaci niezależnej do twoich sekwencji: możliwe do spawnowania powiązanie postaci niezależnej i wymienne powiązanie postaci niezależnej. Powiązania te są tworzone z poziomu definicji postaci niezależnej.
Możliwe do spawnowania powiązanie postaci niezależnej
Korzystając z sekwencji filmowej, możliwe do spawnowania powiązanie postaci niezależnej może zespawnować aktora w świecie w oparciu o definicję postaci niezależnej. Tę postać niezależną można animować w Sequencerze w taki sam sposób, jak dowolną siatkę szkieletową.
Aby utworzyć możliwe do spawnowania powiązanie postaci niezależnej, po prostu przeciągnij definicję postaci niezależnej do Sequencera:
Kliknij gif, aby powiększyć.
Możliwe do spawnowania powiązanie można animować tak, jak wszystkich innych aktorów siatki szkieletowej. Na przykład:
-
Kliknij + Animacja i wybierz emotkę tańca dla definicji postaci niezależnej.
Kliknij gif, aby powiększyć.
-
Przesuń wskaźnik odtwarzania do przodu, przeciągnij postać niezależną do nowej lokalizacji i ustaw nową klatkę kluczową. Postać niezależna przesunie się teraz z punktu A do punktu B.
Kliknij gif, aby powiększyć.
Wymienne powiązanie postaci niezależnej
Wymienne powiązanie postaci niezależnej przejmie kontrolę nad postacią niezależną spawnowaną w świecie i umieści ją w sekwencji. Postać może wówczas wykonywać animacje utworzone w Sequencerze. Gdy postać niezależna jest powiązana przez Sequencer, całe zachowanie, percepcja i podążanie ścieżką zostaje wstrzymane. Są one wznawiane, gdy powiązanie postaci niezależnej zostanie usunięte.
Gdy postać niezależna przestanie być powiązana, zostanie umieszczona z powrotem w swojej pierwotnej lokalizacji.
Aby utworzyć wymienne powiązanie postaci niezależnej, utwórz możliwe do spawnowania powiązanie postaci niezależnej, kliknij powiązanie PPM i wybierz Konwertuj zaznaczone powiązanie na > Wymienna postać niezależna**.
Kliknij gif, aby powiększyć.
Po konwersji ścieżka jest zastępowana ścieżką wiązania czasu życia. Wszystkie zmiany wprowadzone w możliwym do spawnowania powiązaniu zostają zachowane.
Aby postać niezależną można było znaleźć i powiązać podczas rozgrywki, do definicji postaci niezależnej należy dodać modyfikator: modyfikator Sequencera. Możesz dodać go do definicji postaci niezależnej, używając tej samej metody, co w przypadku innych modyfikatorów. Jeśli nie dodasz tego modyfikatora, walidacja zakończy się niepowodzeniem.
Kliknij gif, aby powiększyć.
Modyfikator Sequencera ma właściwość unikatowego identyfikatora. Ta właściwość służy do lokalizowania zespawnowanej postaci niezależnej w grze. Wartością domyślną jest nazwa definicji postaci niezależnej. Zwróć uwagę, że jeśli dwie różne definicje postaci niezależnej mają ten sam unikatowy identyfikator, obie mogą być powiązane, gdy sekwencja jest w grze.
Odtwarzanie sekwencji w grze
Aby odtwarzać sekwencje, użyj standardowego urządzenia sekwencji filmowej.
Możliwe do spawnowania powiązanie nie wymaga dalszej konfiguracji, aby móc grać.
Wymienne powiązanie wymaga dodania do świata generatora postaci niezależnych, który będzie używał definicji postaci niezależnej. Jeśli wymienne powiązanie nie znajdzie postaci niezależnej, z którą chce się powiązać, w dzienniku klienta pojawi się następujący wiersz:
LogFortNPCMovieSceneBindings: Ostrzeżenie: Nie można powiązać z pionkiem przy użyciu strażnika definicji postaci niezależnej. Upewnij się, że istnieje co najmniej jeden zespawnowany obiekt.
Jeśli chcesz zespawnować postać niezależną w tym samym czasie, gdy twoja sekwencja ma zostać odtworzona. Rozważ skorzystanie z możliwego do spawnowania powiązania lub podepnij Zdarzenie w momencie spawnu do funkcji Odtwórz w urządzeniu sekwencji filmowej.
Postacie niezależne z niestandardowego Blueprintu
Większość typów postaci niezależnych będzie powiązana jako siatki szkieletowe, definicji postaci niezależnej, która używa niestandardowego Blueprintu.
Spowoduje to powiązanie Blueprintu i uwidoczni dodatkowe komponenty, takie jak VFX, które można następnie zmodyfikować w Sequencerze.
W tym przykładzie system cząsteczkowy Niagara został zmodyfikowany w Sequencerze w celu wywołania eksplozji głowy postaci niezależnej:
Kliknij gif, aby powiększyć.
Znane ograniczenia
- Wymienne powiązania postaci niezależnej mogą być użyte tylko w urządzeniu sekwencji filmowej ustawionym na Widoczność: wszyscy. W przypadku innego ustawienia widoczności walidacja zakończy się niepowodzeniem.
- Próba użycia wymiennego powiązania postaci niezależnej z postaciami niezależnymi, na których można jeździć lub które można oswoić, spowoduje, że walidacja się nie powiedzie.
- Wymienne powiązania postaci niezależnej, które używają definicji postaci niezależnej, nie mogą użyć opcji Wymuś utrzymanie stanu na opcji użytkownika Zastąpienie stanu po zakończeniu. Próba użycia tej opcji spowoduje, że walidacja się nie powiedzie.
- Gdy postać niezależna jest powiązana przez Sequencer, postać wskoczy na miejsce. Ponadto problemy z opóźnieniem mogą powodować bardzo krótkie wizualne błędy, gdy postać niezależna jest powiązywana i odwiązywana. Z tego powodu zdecydowanie zaleca się korzystanie z technik takich, jak spawnowanie postaci niezależnej poza ekranem, zanikanie ekranu, efekty wizualne lub ścieżka widoczności podczas korzystania z wymiennego powiązania postaci niezależnej.
Wywoływanie animacji za pomocą Verse
Udostępniając animacje do Verse za pomocą odbicia zasobów, możesz odtwarzać niestandardowe animacje na swoich postaciach niezależnych za pomocą modułu animacji.
Interfejs kontrolera animacji
Interfejs play_animation_controller pozwala na odtwarzanie animacji na postaci i można go pobrać za pomocą funkcji GetPlayAnimationController(). Ten interfejs udostępnia dwie funkcje, które odtwarzają animacje. Synchroniczną funkcję Play() i asynchroniczną funkcję PlayAndAwait().
Obie funkcje przyjmują następujące parametry:
| Opcja | Wartość | Opis |
|---|---|---|
| Animacja | Wybierz animację | Odtwarzana animacja. Musi określać animację w pliku Assets.digest.verse . |
| PlayRate | 1.0, Wybierz szybkość odtwarzania | Szybkość odtwarzania animacji. Wartość 1.0 odpowiada domyślnej szybkości animacji |
| BlendInTime | 0.0, Wybierz BlendInTime | Czas mieszania przychodzącego poprzedniej animacji z bieżącą. |
| BlendOutTime | 0.0, Wybierz BlendOutTime | Czas mieszania wychodzącego bieżącej animacji z następną. |
| StartPositionSeconds | 0.0, Wybierz StartPositionSeconds | Pozycja w sekundach, od której ma się rozpocząć odtwarzanie animacji. |
Funkcja Play And Await
Funkcja PlayAndAwait() odtwarza animację asynchronicznie i zwraca instancję typu wyliczeniowego (enum) play_animation_result, która zawiera trzy wartości: Completed, Interrupted i Error. Odpowiadają one odpowiednio ukończonej animacji, animacji, która została przerwana, i wystąpieniu błędu. Poprzez zapytanie o ten typ wyliczeniowy (enum) można wykonać inny kod w oparciu o wynik animacji.
AnimationResult := PlayAnimController.PlayAndAwait(MyAnimation)
case(AnimationResult):
play_animation_result.Completed => Print("Animacja ukończona!")
play_animation_result.Interrupted => Print("Animacja przerwana.")
play_animation_result.Error => ("Podczas animacji wystąpił błąd.")
Funkcja Play
Funkcja Play() działa synchronicznie i zwraca instancję klasy playing_animation_instance. Klasa playing_animation_instance umożliwia odpytywanie trwającej animacji i manipulowanie nią i zawiera następujące wartości:
| Wartość | Wyjaśnienie |
|---|---|
| GetState() | Ta funkcja zwraca aktualny stan odtwarzania animacji w typie wyliczeniowym (enum) play_animation_state. |
| Stop() | Ta funkcja zatrzymuje bieżącą animację. |
| CompletedEvent | To zdarzenie jest aktywowane po ukończeniu animacji |
| InterruptedEvent | To zdarzenie jest aktywowane po przerwaniu animacji. |
| BlendedInEvent | To zdarzenie jest aktywowane, gdy animacja zakończy mieszanie przychodzące. |
| BlendedOutEvent | To zdarzenie jest aktywowane, gdy animacja rozpoczyna mieszanie wychodzące. |
| Await() | Ta funkcja oczekuje na zakończenie lub przerwanie animacji. W szczególności zwraca ona typ wyliczeniowy (enum) play_animation_result i jest funkcjonalnie identyczna z wywołaniem PlayAndAwait(). |
Funkcji Play() można używać do manipulowania trwającymi animacjami lub wykonywania kodu po spełnieniu określonych warunków w animacji.
# Odtwarzaj animację synchronicznie i pobierz instancję animacji
AnimationInstance := PlayAnimController.Play(MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
# Subskrybuj funkcję uruchamianą po ukończeniu animacji
AnimationInstance.CompletedEvent.Subscribe(OnAnimationComplete)
Sleep(1.0)
AnimationState := AnimationInstance.GetState()
# Jeśli animacja nadal jest odtwarzana po sekundzie, zatrzymaj animację
if(AnimationState = play_animation_state.BlendingOut):
AnimationInstance.Stop()
Przykład odtwarzania animacji
Poniższy kod przedstawia przykład zachowania postaci niezależnej, które wykorzystuje moduł animacji do odtwarzania animacji. Należy pamiętać, że wszelkie niestandardowe animacje, które chcesz odtwarzać na swoich postaciach, muszą najpierw zostać udostępnione do Verse poprzez odbicie zasobów i muszą pojawić się w pliku Assets.digest.verse . W tym przykładzie animacja MyAnimation znajduje się w module Animacje niestandardowej postaci MyCharacter w Assets.digest.verse i jest wywoływana poprzez MyCharacter.Animations.MyCharacter.
using { /Fortnite.com/AI }
using { /Fortnite.com/Animation/PlayAnimation }
using { /Verse.org/Simulation }
using { /Fortnite.com/Characters }
basic_play_anim_example := class(npc_behavior):
# Szybkość odtwarzania animacji.
@editable
PlayRate : float = 1.0
# Jak długo ma trwać mieszanie poprzedniej animacji z
# bieżącą.
@editable
BlendInTime : float = 0.25
# Jak długo ma trwać mieszanie bieżącej animacji z
# następną.
@editable
BlendOutTime : float = 0.25
# Pozycja w sekundach, od której ma się rozpocząć odtwarzanie
# animacji.
@editable
StartPositionSeconds : float = 0.0
# Czas oczekiwania przed ponownym uruchomieniem animacji.
@editable
SleepDuration : float = 2.0
OnBegin<override>()<suspends>:void=
if:
# Pobierz kontroler animacji postaci niezależnej
Agent := GetAgent[]
FortCharacter := Agent.GetFortCharacter[]
PlayAnimController := FortCharacter.GetPlayAnimationController[]
then:
AnimationResult := PlayAnimController.PlayAndAwait(MyCharacter.Animations.MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
# Wyświetl wynik uruchomienia animacji.
case(AnimationResult):
play_animation_result.Completed => Print("Animacja ukończona!")
play_animation_result.Interrupted => Print("Animacja przerwana.")
play_animation_result.Error => ("Podczas animacji wystąpił błąd.")
Sleep(SleepDuration)
# Odtwarzaj animację synchronicznie i pobierz instancję animacji.
AnimationInstance := PlayAnimController.Play(MyCharacter.Animations.MyAnimation, ?PlayRate := PlayRate, ?BlendInTime := BlendInTime, ?BlendOutTime := BlendInTime, ?StartPositionSeconds := StartPositionSeconds)
Sleep(SleepDuration)
AnimationState := AnimationInstance.GetState()
# Wyświetl bieżący stan animacji.
case(AnimationState):
play_animation_state.Playing => Print("Odtwarzanie animacji!")
play_animation_state.BlendingIn => Print("Mieszanie przychodzące animacji!")
play_animation_state.BlendingOut => Print("Mieszanie wychodzące animacji!")
play_animation_state.Completed => Print("Animacja ukończona!")
play_animation_state.Stopped => Print("Animacja zatrzymana!")
play_animation_state.Interrupted => Print("Animacja przerwana!")
play_animation_state.Error => Print("Podczas animacji wystąpił błąd")
else:
Print("Nie można pobrać kontrolera animacji")