Edytor grafów animacji to wizualne, oparte na węzłach narzędzie, które umożliwia technicznym artystom i animatom budowanie złożonej logiki animacji bezpośrednio w Roblox Studio. Dzięki uproszczonemu interfejsowi do tworzenia zachowań, takich jak drzewka blendy, usuwa tradycyjną zależność od ręcznego skryptowania w celu poruszania postacią.
System ten działa współzależnie z Twoim istniejącym przepływem pracy dla animacji:
- Edytor animacji: Kontynuuj korzystanie z Edytora animacji jako głównego narzędzia do tworzenia pojedynczych klipów oraz dostosowywania kluczowych klatek i krzywych.
- Edytor grafów animacji: Użyj tego nowego miejsca pracy, aby wziąć te klipy i zorganizować je w drzewo logiki do sterowania wyspecjalizowanym zachowaniem w grze.
Zaprojektowany, aby poprawić współpracę, wizualny graf pozwala deweloperom szybko sprawdzać, debugować i zrozumieć logikę stworzoną przez animatorów. Podczas gdy artyści koncentrują się na doskonaleniu interaktywnego ruchu, deweloperzy mogą nadal uzyskiwać dostęp do węzłów grafów animacji programowo, aby mieć bezpośrednią kontrolę nad mieszanymi animacjami i stanami.
Budowanie grafu
Aby rozpocząć budowanie logiki dla animowalnej postaci, uzyskaj dostęp do edytora grafów animacji za pomocą zakładki Avatar wstęgi Studio. Kolejne kroki pokazują, jak zainicjować rig i skonstruować podstawową sieć węzłów używając domyślnych animacji chodzenia i machania.
Aby głębiej zagłębić się w praktyczne aplikacje, możesz zapoznać się z Plikiem odniesienia grafów animacji, który zawiera zarówno podstawowe, jak i złożone przykłady implementacji.
Aby stworzyć własny graf animacji, podobnie do podstawowego przykładu podanego w odniesieniu, użyj następujących kroków:
W Studio dodaj animowalny rig, przechodząc do zakładki Avatar i wybierając Postać ⟩ Moja Postać.

Otwórz edytor grafów animacji, przechodząc do Edytora grafów w zakładce Avatar.

Wybierz animowalny rig w widoku 3D i wybierz Utwórz graf.
W Edytorze grafów kliknij prawym przyciskiem myszy i wybierz Klip.

W nowym węźle Klip, ustaw identyfikator animacji.
Wybierz rozwijane menu Identyfikator animacji.
Aby wprowadzić konkretny identyfikator zasobu animacji, kliknij Importuj.

W polu Identyfikator animacji dodaj domyślną animację chodzenia: 507777826.
Wybierz Importuj.
Dodaj kolejny węzeł klipu, powtarzając kroki 4-5, używając domyślnej animacji machania: 507770239.

W Edytorze grafów kliknij prawym przyciskiem myszy i wybierz Dodaj.

Połącz węzły klipu z węzłem Dodaj, przeciągając złącze wyjściowe w prawym górnym rogu do odpowiedniego portu:
- Połącz węzeł Klip z animacją chodzenia z portem Podstawowym.
- Połącz węzeł Klip z animacją machania z portem Dodatkowym.

Z węzła Dodaj, połącz złącze wyjściowe w prawym górnym rogu z portem wyjściowym grafu Postura.

(Opcjonalnie) Przypisz parametr do swojej zmiennej Prędkość.
Kliknij i przeciągnij zielone złącze portu Prędkość w pustą przestrzeń. Pojawia się nowy węzeł parametru.

W lewym górnym rogu edytora grafów, użyj panelu parametrów, aby szybko modyfikować parametry w swoich węzłach. Możesz również uzyskać do nich dostęp programowo.

Przetestuj animację, naciskając przycisk odtwarzania.

Spróbuj testować różne wagi, prędkości, tryby odtwarzania i inne animacje. Aby uzyskać więcej informacji na temat pojedynczych węzłów, zobacz Odniesienie węzłów.
Integracja API
Tworzenie i wdrażanie grafu animacji odbywa się zgodnie z standardowym procesem animacji Roblox. Po wybraniu riga w Edytorze grafów animacji, nowy zasób AnimationGraphDefinition jest tworzony. Ten zasób działa jako kontener dla Twoich węzłów, połączeń i parametrów. Gdy logika zostanie sfinalizowana, publikujesz graf, aby otrzymać standardowy identyfikator zasobu.
W swoich skryptach interakcjonujesz z tymi grafami, ładując je na Animator tak jak tradycyjną animację. Aby uruchomić wewnętrzną logikę grafu, użyj AnimationTrack:SetParameter(), aby przekazać wartości w czasie rzeczywistym - takie jak prędkość ruchu lub stany logiczne - bezpośrednio do zmiennych grafu.
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://123456789" -- Twój opublikowany identyfikator grafu
local animationTrack = animator:LoadAnimation(animation)
animationTrack:Play()
-- Dynamiczne aktualizacje parametrów za pomocą RunService
game:GetService("RunService").Stepped:Connect(function(_, dt)
local currentSpeed = humanoidRootPart.AssemblyLinearVelocity.Magnitude
animationTrack:SetParameter("humanoidSpeed", currentSpeed)
end)
Odniesienie do węzłów
Każdy węzeł grafu animacji działa jako bramka logiki lub źródło danych, które przetwarza dane animacji, zanim dotrą do riga postaci. Ta sekcja dostarcza technicznych informacji na temat funkcjonalnych bloków w Edytorze grafów animacji. Wszystkie węzły obecnie produkują posturę animacji.
Każda sekcja węzła zawiera:
- Definicja – Podsumowanie celu węzła i jego roli w grafie.
- Wejścia – Strumienie danych wchodzące do węzła. Wiele wejść oznaczone jest jako Wejście1, Wejście2, ..., WejścieN.
- Właściwości wejściowe – Ustawienia związane bezpośrednio z konkretnym wejściem (wejście Bez ruchu przypisane do pozycji 0.5 na węźle Blend1D).
- Dane zdarzeń – Zdarzenia emitowane lub konsumowane przez węzeł w celu wyzwolenia wewnętrznej logiki grafu lub zewnętrznych skryptów Luau. To zachowanie może ulec zmianie w trakcie rozwoju wersji beta.
Globalne zasady zdarzeń
Dla wszystkich węzłów i przejść stosują się poniższe zasady domyślne:
- Zdarzenia propagują się w górę z węzła źródłowego przez graf. Każde zdarzenie niesie wagę reprezentującą wpływ jego źródła na finalną blendę. Jeśli waga wynosi zero w dowolnym momencie, zdarzenie jest nieme.
- Węzły bez dostosowanej logiki zdarzeń przekazują wszystkie zdarzenia bez zmian; węzły, które mieszają lub wybierają spośród wejść, mogą skalować wagę lub blokować zdarzenia z wejść niepierwszorzędowych (zobacz sekcję Zdarzeń dla każdego węzła).
- Zdarzenia znaczników, które docierają na szczyt grafu, mogą być obserwowane za pomocą AnimationTrack:GetMarkerReachedSignal().
Klip

Odwołanie do zasobu AnimationClip. Służy jako liściasty węzeł w grafie, generując surowe dane animacji, które wprowadzane są do innych węzłów do mieszania, wyboru lub modyfikacji.
- Wejścia
- Brak
- Właściwości
Właściwość Typ Opis Klip Identyfikator zasobu Zasób animacji do odtworzenia (np. rbxassetid://12345). TrybOdtwarzania Enum.AnimationNodePlayMode Definiuje zachowanie klipu, gdy osiągnie koniec swojej długości.
- Pętla (domyślnie): Automatycznie restartuje się od początku, gdy klip zakończy odtwarzanie.
- PingPong: Odtwarza od początku do końca, a następnie natychmiast wraca do początku.
- Raz i przytrzymaj: Odtwarza raz i utrzymuje ostatnią posturę po zakończeniu.
- Raz i zresetuj: Odtwarza raz i przeskakuje do początkowej postury po zakończeniu.
Odwróć Boolean Kontroluje kierunek odtwarzania. Prędkość Liczba Mnożnik dla tempa odtwarzania. 0.0 wstrzymuje graf, 1.0 to normalna prędkość, a 2.0 to podwójna prędkość. Przytnij Boolean Umożliwia przycięcie długości klipu. TrimStart Liczba Absolutny znacznik czasowy (w sekundach), od którego powinno rozpocząć się odtwarzanie. TrimEnd Liczba Absolutny znacznik czasowy (w sekundach), w którym powinno zakończyć się odtwarzanie. - Dane zdarzeń
- Obsługa zdarzeń: Brak. Jest to liściasty węzeł bez dzieci.
- Emisja zdarzeń: Odczytuje własne znaczniki osadzone w klipie animacji (np. "Krok", "Uderzenie broni") i emituje je jako nazwane zdarzenia w dokładnej klatce, w której się pojawiają. Jeśli klip jest przycięty, tylko znaczniki w zdefiniowanym zakresie [TrimStart, TrimEnd] (włącznie) są emitowane.
Wybierz

Wybiera spośród dowolnej liczby wejść za pośrednictwem właściwości Wybór. Kiedy bieżący wybór się zmienia, uruchamia nowe przejście.
- Wejścia
- Wejście1...WejścieN
- Właściwości
Właściwość Typ Opis Wybór String Unikalny identyfikator wejścia do wybrania, pasujący do nazwy połączenia wejścia (np. "Chodź"). - Dane zdarzeń
- Obsługa zdarzeń: Zdarzenia z aktualnie wybranego wejścia przechodzą bez zmian ich wagi.
- Emisja zdarzeń: Przechodzi przez wszystkie zdarzenia tylko z aktualnie wybranego wejścia. W trakcie przejścia emisja zdarzeń podlega globalnym zasadom zdarzeń.
WybórPriorytetowy

Ocena listy połączonych wejść od góry do dołu i odtwarzanie pierwszego, którego warunek oceniany jest na prawdziwy. Pozwala to na wybór animacji hierarchicznych na podstawie konkretnej logiki. Kiedy zmienia się aktualny wybór, uruchamia nowe przejście.
- Wejścia
- Wejście1...WejścieN
- Wyzwalacz (Boolean): Warunek logiczny, który musi być prawdziwy, aby to wejście zostało aktywowane. W obecnych wersjach jest to podłączone do parametru logicznego.
- Przerywalny (Enum.AnimationNodeInterruptible): Definiuje zasady, kiedy ta aktywna animacja może być przerwana przez wejście o wyższym priorytecie.
- Zawsze (domyślnie): Wejście można przerwać w dowolnym momencie przez warunek o wyższym priorytecie.
- Zakończono: Obecna animacja musi zakończyć swoje odtwarzanie, zanim wyższy priorytet może przejąć kontrolę.
- Wyzwalacz: Wejście jest przerywalne tylko wtedy, gdy InterruptibleTrigger ustawione jest na prawdę.
- WyzwalaczPrzerywalny (Boolean): Dostępne tylko, jeśli Przerywalny ustawione jest na Wyzwalacz. Wejście można przerwać, gdy to konkretne wyrażenie jest prawdziwe.
- Właściwości
Właściwość Typ Opis DefaultInterruptible Enum.AnimationNodeInterruptible Podstawowa zasada przerwania stosowana do wszystkich wejść. Każde wejście może nadpisać to swoją własną właściwością wejściową Przerywalny. DefaultInterruptibleTrigger Boolean Podstawowa wartość wyzwalacza używana, gdy rozwiązany tryb Przerywalny wejścia to Wyzwalacz. Każde wejście może nadpisać to swoją własną właściwością wejściową WyzwalaczPrzerywalny. - Dane zdarzeń
- Obsługa zdarzeń: Zdarzenia z aktualnie wybranego wejścia przechodzą bez zmian ich wagi.
- Emisja zdarzeń: Przechodzi przez wszystkie zdarzenia tylko z aktualnie wybranego wejścia. W trakcie przejścia emisja zdarzeń podlega globalnym zasadom zdarzeń.
Sekwencja

Aktywuje połączone wejścia w określonej sekwencyjnej kolejności, na podstawie zdefiniowanych warunków oczekiwania. Kiedy zmienia się aktualny wybór, uruchamia nowe przejście.
- Wejścia
- Wejście1...WejścieN
- CzekajNa (Enum.AnimationNodeWaitFor): Określa warunek, który musi być spełniony, zanim sekwencja przejdzie do następnego wejścia.
- Zakończono (domyślnie): Przechodzi do następnego wejścia, gdy obecne wejście kończy cykl. Zachowanie przejścia zależy od połączonego wejścia:
- Prawa do odtworzenia klipu: Przechodzi, gdy klip kończy.
- Powtarzający się klip: Przechodzi po zakończeniu jednego pełnego cyklu.
- Sekwencja z nieskończonymi pętlami: Przechodzi po pełnym cyklu przez wszystkie wejścia.
- Sekwencja z nieskończonymi pętlami: Przechodzi po zakończeniu wszystkich pętli.
- Wyzwalaj: Aktywuje następne wejście, gdy niestandardowe wyrażenie logiczne ocenia się na prawdę.
- WaitForTrigger (Boolean): Dostępne tylko, gdy WaitFor jest ustawione na Wyzwalacz.
- Właściwości
Właściwość Typ Opis LiczbaPętli Liczba Liczba cykli przez całą sekwencję (domyślnie 1). Wartość 0 oznacza nieskończoną pętlę. Gdy liczba zostanie osiągnięta, węzeł respektuje ustawienia pętli lub trzymania końcowego wejścia. DomyślnaCzekajNa Enum.AnimationNodeWaitFor Podstawowy warunek oczekiwania stosowany do wszystkich wejść. Każde wejście może nadpisać to swoją własną właściwością wejściową CzekajNa. - Dane zdarzeń
- Obsługa zdarzeń: Zdarzenia z aktualnie aktywnego wejścia przechodzą bez zmian ich wagi.
- Emisja zdarzeń: Przechodzi przez wszystkie zdarzenia tylko z aktualnie aktywnego wejścia w sekwencji. W trakcie przejścia emisja zdarzeń podlega globalnym zasadom zdarzeń.
SekwencjaLosowa

Wybiera i odtwarza jedno z podłączonych wejść losowo. Gdy obecna animacja kończy, węzeł losowo wybiera inne wejście do odtworzenia. Przypisz każdemu wejściu konkretną wagę, aby wpłynąć na prawdopodobieństwo jego wyboru. Gdy zmienia się aktualny wybór, uruchamia nowe przejście.
- Wejścia
- Wejście1...WejścieN
- Waga (Liczba): Określa prawdopodobieństwo, że to wejście zostanie wybrane; wyższe wagi zwiększają szansę na wybór.
- Właściwości
Właściwość Typ Opis LiczbaOdtwórzeń Liczba Liczba wejść, przez które węzeł będzie odtwarzać przed zatrzymaniem. Po osiągnięciu węzeł respektuje ustawienia pętli lub trzymania końcowego wejścia. Domyślnie jest to 0 dla nieskończonego odtwarzania Ziarno Liczba Wartość używana do inicjacji Generatora Liczb Losowych (RNG), zapewniając, że sekwencja pozostaje spójna w różnych klientach. Domyślnie -1 dla losowego ziarna. - Dane zdarzeń
- Obsługa zdarzeń: Zdarzenia z aktualnie aktywnego wejścia przechodzą bez zmian ich wagi.
- Emisja zdarzeń: Przechodzi przez wszystkie zdarzenia tylko z aktualnie aktywnego wejścia w sekwencji. W trakcie przejścia emisja zdarzeń podlega globalnym zasadom zdarzeń.
Nad

Nakłada posturę Nad na posturę Podstawową. Kiedy połączona z węzłem Mask, wykluczone stawy w poście Nad całkowicie ujawniają posturę Podstawową, tworząc efekt przezroczystego nakładania.
- Wejścia
- Podstawowa: Tło lub dolna warstwa, zazwyczaj pełna animacja ciała, taka jak lokomocja lub postawa spoczynkowa.
- Nad: Warstwa pierwszorzędna, która ma być zastosowana ponad podstawą, na przykład gest ręki lub animacja używania narzędzia.
- Właściwości
Właściwość Typ Opis Waga Liczba Waga blendy używana do osłabienia postury Nad. Domyślnie 1.0 (pełna zastąpienie) i nieograniczona. - Dane zdarzeń
- Obsługa zdarzeń:
- Węzeł nasłuchuje na zdarzenia z obu wejść Podstawowego i Nad.
- Emisja zdarzeń:
- Zdarzenia podstawowe: Wszystkie zdarzenia z wejścia podstawowego są przekazywane bez zmian.
- Zdarzenia nad: Zdarzenia z wejścia nad są skalowane przez właściwość Waga.
- Przy wadze 0.5, zdarzenia Nad propagują się z połową wagi
- Przy wadze 0 są nieme.
Dodaj

Dodaje posturę Dodatnią do postury Podstawowej, osłabionej przez konkretną Wagę (nieograniczoną).
- Wejścia
- Podstawowa: Podstawowa postura animacji.
- Dodatnia: Postura, która ma być nałożona na podstawę.
- Właściwości
Właściwość Typ Opis Waga Liczba Określa siłę nałożonej postury dodatniej na podstawę. - Dane zdarzeń
- Obsługa zdarzeń: Węzeł nasłuchuje na zdarzenia z obu wejść Podstawowego i Dodatniego.
- Emisja zdarzeń: Wszystkie zdarzenia z obu wejść Podstawowego i Dodatniego są przekazywane bez zmian.
Odejmij

Konwertuje animację w posturę dodatnią przez odjęcie względnej postury podstawowej od docelowej postury (). Wynik jest osłabiony przez konkretną Wagę (nieograniczoną).
- Wejścia
- A: Docelowa postura animacji.
- B: Względna postura podstawowa do odjęcia.
- Właściwości
Właściwość Typ Opis Waga Liczba Określa siłę efektu odejmowania zastosowanego do wyniku. - Dane zdarzeń
- Obsługa zdarzeń: Węzeł nasłuchuje na zdarzenia z obu Wejście A i Wejście B.
- Emisja zdarzeń: Wszystkie zdarzenia z obu Wejścia A i Wejścia B są przekazywane bez zmian.
Blend1D

Linearnie interpoluje między dwiema posturami animacji najbliższymi aktualnej pozycji wejścia na jednej osi.
- Wejścia
- Wejście1...WejścieN
- Pozycja (Liczba): Konkretna współrzędna dla każdego kolejnego wejścia na osi blendy.
- Właściwości
Właściwość Typ Opis Pozycja Liczba Aktualna aktywna wartość na osi blendy używana do próbkowania animacji. Jeśli Pozycja jest poza zakresem zdefiniowanych pozycji wejściowych, węzeł extrapoluje, używając dwóch najbliższych wejść. SynchronizacjaFaz Enum.AnimationNodePhaseSync Konfiguruje, czy czasowe synchronizacje wejść dzieci powinny być synchronizowane.
- Synchroniczny (domyślnie): Normalizowana synchronizacja. Węzeł oblicza "wirtualną długość" na podstawie ważonej średniej aktywnych wejść. Czas kroków każdego węzła wejściowego jest dostosowywany, aby wszystkie dzieci zbiegały się do tej samej fazy, utrzymując animacje o różnych długościach w synchronizacji.
- Niesynchronizowany: Standardowe mieszanie, w którym klipy postępują niezależnie od swoich prędkości odtwarzania.
- Dane zdarzeń
- Obsługa zdarzeń: Węzeł nasłuchuje na zdarzenia ze wszystkich aktualnie aktywnych węzłów dzieci.
- Emisja zdarzeń: Tylko zdarzenia z najwyżej ważonego aktywnego wejścia propagują się, skalowane przez ich wagę blendy. Zdarzenia z dodatkowego wejścia są nieme.
Blend2D

Miesza wiele postur animacji na podstawie dwóch parametrów wejściowych w ramach przestrzeni współrzędnych 2D. Uogólnia węzeł Blend1D, aby poradzić sobie z bardziej złożonymi scenariuszami, takimi jak mieszanie na podstawie zarówno kierunku ruchu, jak i prędkości jednocześnie.
- Wejścia
- Wejście1...WejścieN
- X (Liczba): Współrzędna X dla każdego kolejnego wejścia.
- Y (Liczba): Współrzędna Y dla każdego kolejnego wejścia.
- Właściwości
Właściwość Typ Opis TrybWejścia Enum.AnimationNodeBlend2DInputMode Definiuje system współrzędnych używany do ocenienia przestrzeni blendy:
- Kartezjański (domyślnie): Używa standardowych współrzędnych siatki 2D. X i Y reprezentują aktualną pozycję w przestrzeni blendy.
- Polar: Używa wartości kątowych i wielkości. X reprezentuje kierunek w radianach, podczas gdy Y reprezentuje wielkość lub siłę ruchu. Kierunek jest oceniany ciężej niż wielkość, więc wejścia w podobnych kątach, ale różnych wielkościach lepiej się mieszają niż wejścia w różnych kątach.
X Liczba Aktualna współrzędna X (Kartezjańska) lub kierunek w radianach (Polar). Y Liczba Aktualna współrzędna Y (Kartezjańska) lub wielkość (Polar). SynchronizacjaFaz Enum.AnimationNodePhaseSync Konfiguruje, czy czasowe synchronizacje wejść dzieci powinny być synchronizowane.
- Synchroniczny (domyślnie): Normalizowana synchronizacja. Węzeł oblicza "wirtualną długość" na podstawie ważonej średniej aktywnych wejść. Czas kroków każdego węzła wejściowego jest dostosowywany, aby wszystkie dzieci zbiegały się do tej samej fazy, utrzymując animacje o różnych długościach w synchronizacji.
- Niesynchronizowany: Standardowe mieszanie, w którym klipy postępują niezależnie od swoich prędkości odtwarzania.
- Dane zdarzeń
- Obsługa zdarzeń: Węzeł nasłuchuje na zdarzenia ze wszystkich aktualnie aktywnych węzłów dzieci.
- Emisja zdarzeń: Tylko zdarzenia z najwyżej ważonego aktywnego wejścia propagują się, skalowane przez ich wagę blendy. Zdarzenia z dodatkowego wejścia są nieme.
Maska

Aplikacje wcześniej zdefiniowanej maski do wejściowej postury. Maska jest definiowana przez wagę dla każdego obiektu (np. stawu) w hierarchii riga, co pozwala na precyzyjne kontrolowanie lub "piórkowanie" animacji.
- Wejścia
- Postura: Postura animacji, która ma być zamaskowana.
- Właściwości
Właściwość Typ Opis Maska ObjectValue Obiekt ObjectValue (utworzony jako bezpośrednia właściwość dziecka w definicji węzła Mask) definiuje wagi maski. Może działać na jeden z dwóch sposobów:
- Bezpośrednio: Sam ObjectValue zawiera atrybuty mapujące nazwy obiektów riga do konkretnych wartości wag.
- Przez referencję: ObjectValue odnosi się do innego obiektu Instance, który zawiera atrybuty mapujące. To pozwala na współdzielone maski w różnych węzłach w grafie.
Podczas tworzenia maski można wybrać schemat riga (HumanoidRigDescription lub Picker), aby uzupełnić hierarchię.
- HumanoidRigDescription: Standaryzuje maskę dla postaci humanoidalnych.
- Picker: Umożliwia wybór dowolnego konkretnego riga w przestrzeni roboczej do uzupełnienia hierarchii maski.
Odwróć Boolean Kiedy prawda, stosuje wartości wag jako 1 - waga. Umożliwia to ponowne wykorzystanie maski odwrotnie bez tworzenia nowego zasobu. - Dane zdarzeń
- Obsługa zdarzeń: Węzeł nasłuchuje na wszystkie zdarzenia z wejścia Postura.
- Emisja zdarzeń: Wszystkie zdarzenia z wejścia Postura są przekazywane bez zmian.
Prędkość

Modyfikuje tempo odtwarzania nadchodzącej postury animacji.
- Wejścia
- Postura: Postura_animacji_ lub podgraf, której tempo odtwarzania ma być modyfikowane.
- Właściwości
Właściwość Typ Opis Prędkość Liczba Mnożnik zastosowany do zmiany czasu (). 0.0 wstrzymuje graf, 1.0 to normalna prędkość, a 2.0 to podwójna prędkość. - Dane zdarzeń
- Obsługa zdarzeń: Węzeł nasłuchuje na zdarzenia z wejścia Postura.
- Emisja zdarzeń: Wszystkie zdarzenia z wejścia Postura są przekazywane bez zmian. Należy pamiętać, że podczas gdy wizualna prędkość odtwarzania się zmienia, czas emisji emitowanych zdarzeń (takich jak znaczniki) będzie odpowiednio skalować się wraz z zastosowaną prędkością odtwarzania.
GrafWyjściowy

Reprezentuje ostateczną ocenioną posturę grafu. Ten węzeł jest automatycznie umieszczany we wszystkich nowych grafach w Edytorze grafów animacji. Jego obecność zapewnia, że graf jest zawsze ważny i konsekwentnie produkuje posturę animacji.
- Wejścia
- Postura: Ostateczne przetworzone dane animacji, które mają być zastosowane do riga.
- Właściwości
- Brak
- Dane zdarzeń
- Obsługa zdarzeń: Węzeł nasłuchuje na wszystkie zdarzenia przekazywane przez ostatnie połączone wejście.
- Emisja zdarzeń: Ten węzeł działa jako punkt wyjścia dla procesu animacji i nie emituje sygnałów z powrotem do grafu.
Przejścia
Kilka węzłów w Grafie Animacji (takich jak Wybierz, Wybór Priorytetowy, Sekwencja i Sekwencja Losowa) zarządza tym, jak animacje mieszają się podczas przełączania między aktywnymi wejściami. Aby zapobiec redundantności w odniesieniu do węzłów, te zachowania są definiowane przez znormalizowane grupy właściwości przejść.
Domyślne przejście

Podstawowe zachowanie mieszania stosowane do węzła, gdy przełącza się na nowe aktywne wejście.
- DomyślnaCzasTrwaniaPrzejścia (liczba): Czas (w sekundach), który zajmuje całkowite zmieszanie się w nową posturę.
- DomyślnaKrzywaPrzejścia (Enum.PoseEasingStyle): Funkcja wygładzania stosowana w czasie mieszania. Obecnie obsługuje tylko Enum.PoseEasingStyle.Linear oraz Enum.PoseEasingStyle.CubicV2.
Nadzór nad przejściem

Właściwości związane z danym wejściem, które nadrzędne przejście. Są one stosowane, gdy węzeł przechodzi do tego konkretnego wejścia.
- PrzejścieCzasTrwaniaNadpisywania (liczba): Nadpisuje czas trwania domyślnego przejścia.
- PrzejścieKrzywaNadpisywania (Enum.PoseEasingStyle): Nadpisuje domyślną krzywą przejścia. Obecnie obsługuje tylko Enum.PoseEasingStyle.Linear oraz Enum.PoseEasingStyle.CubicV2
Replikacja
Parametry grafów animacji są lokalne dla każdego AnimationTrack i nie są automatycznie replikowane. Może to się zmienić w przyszłych aktualizacjach, ale obecnie zalecanym podejściem jest użycie:
- Klient → Serwer: RemoteEvent, aby przesyłać parametry z klienta posiadającego do serwera w stałym tempie.
- Serwer → Inni Klienci: Atrybuty instancji, które automatycznie replikują do wszystkich klientów.
Postacie graczy
Skrypt klienta steruje postaciami graczy. Ponieważ tylko posiadający klient zna aktualny stan gry (wejście ruchu, stan humanoida itp.), parametry muszą przepływać od posiadającego klienta do serwera, a następnie do wszystkich innych klientów.
Ustawienia
W StarterCharacterScripts stwórz:
- Skrypt LocalScript do animacji po stronie klienta i napędzania parametrów.
- Script do replikacji po stronie serwera.
- RemoteEvent do komunikacji klient-serwer.
Skrypt klienta
Posiadający klient steruje parametrami na podstawie zdarzeń związanych z grą i co jakiś czas wysyła je do serwera. Inne klienty odczytują zreplikowane atrybuty z skryptu serwera.
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid
-- Załaduj graf animacji
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- Zastąp swoim opublikowanym identyfikatorem grafu
local track = animator:LoadAnimation(animation)
track:Play()
local isLocalCharacter = Players:GetPlayerFromCharacter(character) == Players.LocalPlayer
if not isLocalCharacter then
-- Odczytaj zreplikowane parametry z skryptu serwera
local animateServer = script.Parent:WaitForChild("AnimateServer")
for attribute, value in animateServer:GetAttributes() do
track:SetParameter(attribute, value)
end
animateServer.AttributeChanged:Connect(function(attribute)
track:SetParameter(attribute, animateServer:GetAttribute(attribute))
end)
return
end
-- Lokalny gracz: napędzaj parametry w zależności od stanu gry
local params = {}
local function setParam(key, value)
track:SetParameter(key, value)
params[key] = value
end
-- Przykład: napędzaj parametry na podstawie stanu humanoida
humanoid.Running:Connect(function(speed)
setParam("Speed", speed)
setParam("State", if speed < 0.1 then "Spoczynek" else "Ruch")
end)
-- Prześlij parametry do serwera w stałym tempie
local replicateEvent = script.Parent:WaitForChild("ReplicateEvent")
local TICK_RATE = 1 / 20
local lastSendTime = 0
RunService.Stepped:Connect(function(gameTime)
if gameTime - lastSendTime > TICK_RATE then
lastSendTime = gameTime
replicateEvent:FireServer(params)
end
end)
Skrypt serwera
Otrzymuje parametry od posiadającego klienta, kieruje grafem animacji po stronie serwera i propaguje wartości jako atrybuty do replikacji do innych klientów.
local Players = game:GetService("Players")
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid
-- Załaduj ten sam graf animacji na serwerze
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://YOUR_GRAPH_ID" -- Ten sam identyfikator grafu co klient
animation.Parent = script
local track = animator:LoadAnimation(animation)
track:Play()
-- Odbieraj parametry od klienta posiadającego i replikuj przez atrybuty
local replicateEvent = script.Parent:WaitForChild("ReplicateEvent")
replicateEvent.OnServerEvent:Connect(function(player, params)
if Players:GetPlayerFromCharacter(character) ~= player then
return
end
for key, value in params do
track:SetParameter(key, value)
script:SetAttribute(key, value)
end
end)
NPC
Ponieważ serwer posiada animacje NPC, wymagana jest tylko replikacja serwer-klient. Kieruj grafem animacji na serwerze, zapisuj parametry jako atrybuty w skrypcie serwera i odczytuj je na klientach używając tego samego wzorca Instance.AttributeChanged, pokazując powyżej.
Opóźnienie
Inni klienci widzą animacje z małym opóźnieniem równym interwałowi ticków (do 50 ms przy 20 Hz) plus opóźnienie sieciowe. Możesz zmniejszyć interwał ticków, zwiększając częstotliwość (np. 1/30), kosztem wyższego ruchu sieciowego. 20 Hz to rozsądny domyślny ustawienia; miksowanie animacji jest na tyle wyrozumiałe, że małe opóźnienia są trudne do zauważenia.