Zachowanie postaci niezależnej jest definiowane przez jej skrypt zachowania. Skrypt zachowania to coś, co mówi postaciom, jakie akcje mają podejmować w świecie, np. dokąd iść, z czym lub kim walczyć i jak wchodzić w interakcję z innymi postaciami. Postacie takie, jak strażnicy i dzikie zwierzęta, mogą mieć dodatkowe zachowania, np. percepcja, alarmowanie, zdolność do wynajęcia lub oswojenia.
Zachowanie postaci niezależnej to zdefiniowany przez użytkownika skrypt Verse, który do istniejących zachowań postaci niezależnej dodaje dodatkową funkcjonalność. API npc_behavior pozwala na zdefiniowanie kodu, który jest uruchamiany w momencie spawnowania lub odspawnowania postaci niezależnej, można go używać, aby tworzyć niestandardowe postacie, takie jak medycy, sklepikarze lub bossowie. Zachowania postaci niezależnej dziedziczą z klasy abstrakcyjnej npc_behavior i trzeba zaimportować moduł /Fortnite.com/AI, aby można ich było używać.
Aby wykonać skrypt zachowania postaci niezależnej, musisz go dołączyć do Definicji postaci niezależnej. Sposób, w jaki skrypt zachowania postaci niezależnej wchodzi w interakcję z definicją postaci, zależy od typu postaci niezależnej. Niestandardowe typy postaci niezależnych wymagają, aby skrypt zachowania wykonywał akcje, natomiast postacie niezależne typu Strażnicy i Dzikie zwierzęta będą realizowały zachowanie domyślne, jeśli nie zostanie podany ich inny skrypt zachowania. W celu uzyskania dodatkowych informacji na temat tworzenia definicji postaci niezależnej oraz różnych typów postaci przeczytaj stronę Definicja postaci.
Ten samouczek omawia podstawy tworzenia skryptu zachowania postaci niezależnej i uczy, w jaki sposób spawnować postać niezależną i nawigować nią, aby dotarła do celu.
Tworzenie nowego skryptu zachowania postaci niezależnej
Wykonaj te kroki, aby w UEFN utworzyć skrypt zachowania postaci niezależnej, który spawnuje strażnika patrolującego teren między dwoma punktami.
Otwórz projekt w UEFN, a następnie na pasku menu wybierz kolejno Verse > Eksplorator Verse.
W Eksploratorze Verse kliknij prawym przyciskiem myszy nazwę projektu i wybierz Dodaj nowy plik Verse do projektu, aby otworzyć okno Utwórz skrypt Verse.
W oknie Utwórz skrypt Verse kliknij Zachowanie postaci niezależnej, aby wybrać je jako szablon.
Nadaj nazwę zachowaniu postaci niezależnej, zmieniając tekst w polu Nazwa zachowania postaci niezależnej na nazwę swojego urządzenia. W tym przykładzie urządzeniu nadano nazwę my_first_npc_behavior.
Kliknij opcję Utwórz, aby utworzyć plik Verse.
W Eksploratorze Verse kliknij dwukrotnie nazwę pliku Verse, aby go otworzyć w Visual Studio Code.
Zapisz kod, skompiluj go i utwórz nową definicję postaci niezależnej. W celu uzyskania dodatkowych informacji na temat tworzenia postaci niezależnej zapoznaj się ze stroną Definicja postaci.
Przypisz skrypt
my_first_behaviorjako zachowanie Verse nowej Definicji postaci.Na pasku narzędzi UEFN kliknij Uruchom sesję, aby przetestować poziom w grze. Podczas testowania poziomu w grze, postacie zespawnowane z Generatora postaci niezależnych powinny wybrać losowy punkt w pobliżu miejsca spawnu i do niego nawigować. Gdy osiągną wybrany punkt, powinny odczekać pewien czas i nawigować z powrotem do punktu początkowego. Jeśli opcję rysowanie debugowania Verse włączono w urządzeniu Ustawień wyspy, powinny się wyświetlać narysowane strzałki pokazujące, na którym miejscu postać się skupia, a także sześciany wskazujące punkt, do którego postać nawiguje.
Interfejs Navigatable
API możliwości nawigacji Navigatable można używać, aby kierować postacie do określonych celów oraz do takich rzeczy, jak patrolowanie, strzeżenie punktu lub podążanie za inną postacią. Postacie niezależne typu strażnicy mogą to robić przy użyciu węzłów ścieżki patrolu SI, ale w tym przypadku użyjesz kodu Verse, aby rozszerzyć tę funkcjonalność na dowolny typ postaci i uniknąć umieszczania na poziomie dodatkowych urządzeń. Interfejs navigatable postaci umożliwia nawigowanie postaci do celu nawigacji navigation_target, który tworzy się z opcji agent lub position. Wszystkie postacie niezależne typu Niestandardowe, Strażnicy i Dzikie zwierzęta mogą używać interfejsu navigatable. Aby uzyskać interfejs navigatable postaci, musisz najpierw uzyskać odwołanie do jej fort_character, co osiągasz, wywołując GetFortCharacter[].
# Get the Navigatable Interface, this allows you to tell it to move.
Navigatable := Character.GetNavigatable[]
W przykładowym szablonie kod wybiera pozycję z losowego przesunięcia od miejsca, w którym postać się spawnuje, i zapisuje ją w zmiennej GoToPoint. Następnie tworzy navigation_target z GotToPoint i punktu spawnu postaci.
# Create a random offset from the spawn point to walk toward.
GoToPoint := NPCSpawnPoint + vector3{X := GetRandomFloat(-DistanceFromSpawnPtToMove,DistanceFromSpawnPtToMove),
Y := GetRandomFloat(-DistanceFromSpawnPtToMove,DistanceFromSpawnPtToMove),
Z := 0.0 }
if(ShowAIDebug?):
Print(my_first_npc_behavior_message_module.OnNavigateBeginMessage(Agent,GoToPoint.X,GoToPoint.Y,GoToPoint.Z), ?Duration := AIDebugDrawTime)
# Create a navigation target from these two positions that the navigation interface can use.
NavTargetStart := MakeNavigationTarget(GoToPoint)
Funkcja NavigateTo() zwraca typ wyliczeniowy enum navigation_result, który zawiera informację o tym, czy postać dotarła do navigation_target. Możesz sprawdzić wartość navigation_result, aby nadawać postaciom zachowania w zależności od tego, czy dotarły do miejsca docelowego.
# Check to see if something has interfered with the NPC reaching the intended location and print a
# message to the output log.
if (NavResultGoTo <> navigation_result.Reached):
if(ShowAIDebug?):
Print(my_first_npc_behavior_message_module.OnNavigateErrorMessage(Agent,GoToPoint.X,GoToPoint.Y,GoToPoint.Z), ?Duration := AIDebugDrawTime)
else:
# Once it arrives at its location, wait for this duration in seconds
Navigatable.Wait(?Duration := MoveToWaitDuration)Aby dowiedzieć się więcej o tym, w jaki sposób postacie nawigują w świecie i aby zwizualizować różne obszary, do których postacie mogą nawigować, przeczytaj stronę Siatka nawigacyjna.
Skup wzrok
Gdy postacie wykonują akcje, patrzą na określone miejsca docelowe. Konkretne miejsce docelowe, na które patrzy postać, nazywa się jej fokusem. Postacie skupiają się na postaci, z którą rozmawiają, na celu, który atakują, lub na pozycji, do której nawigują. Interfejs fokusu focus_interface pozwala na podanie konkretnych miejsc docelowych, na których fokusują się tworzone postacie. Wszystkie postacie niezależne typu Niestandardowe, Strażnicy i Dzikie zwierzęta mogą używać interfejsu focus. Funkcja MaintainFocus() fokusuje postać na miejscu docelowym, może to być pozycja vector3 lub agent. Interfejs focus_interface to część interfejsu fort_character, można go pobrać przy użyciu GetFocusInterface[].
# Get the Focus Interface, this allows you to tell it to look at something or somewhere.
Focus := Character.GetFocusInterface[]
W przykładowym szablonie, gdy postać zacznie nawigować z powrotem do pozycji początkowej, kod używa MaintainFocus(), aby wymusić zachowanie fokusowania na poprzednim navigation_target. Dzięki temu postać idzie do tyłu do punktu początkowego, patrząc za siebie.
# Leveraging concurrency to wait until the NPC reaches its destination, while the calls to look back at its origin point
# and drawing a debug arrow never completes, continuing, ensures only the NavigateTo can win the race.
NavResultGoToNext := race:
# Move back to its starting position.
Navigatable.NavigateTo(NavTargetEnd)
# Sets NPC to look at its previous position which will make it walk backwards.
# This is meant to show the utility of the focus interface.
block:
Focus.MaintainFocus(GoToPoint)
Przypinanie do smyczy
Gdy strażnicy strzegą jakiegoś celu, chcesz mieć pewność, że pozostają w określonym promieniu od celu i nie odchodzą za daleko. Interfejs fort_leashable to interfejs postaci niezależnej specyficzny dla typu Strażnika, umożliwiający określenie promienia wokół celu, którego strażnicy się będą trzymali i nie odejdą patrolować za daleko. Strażników można przypiąć tak, jak się przypina smyczą, do określonych pozycji lub innych postaci niezależnych, wówczas strażnicy będą uaktualniali swoje pozycje w taki sposób, aby pozostawać w pobliżu celu, do którego są przypięci, gdy cel się przemieści. Obecnie postacie niezależne typu Niestandardowe i Dzikie zwierzęta nie mogą używać interfejsu fort_leashable. Interfejs fort_leashable możesz pobrać przy użyciu GetFortLeashable[].
# Get the Leash Interface, which lets you confine a guard to a certain area.
Leashable := Character.GetFortLeashable[]
Strażników można przypiąć do pozycji lub innych agentów, np. w sytuacji, gdy strzegą punktu do przechwycenia lub ochraniają ważną postać niezależną. Każda smycz ma promień wewnętrzny InnerRadius i promień zewnętrzny OuterRadius, które decydują odpowiednio o tym, w jakiej odległości liczonej w centymetrach strażnicy mają pozostawać od celu, do którego są przypięci. W przykładowym szablonie nie używa się interfejsu leashable, ale może się on przydać, gdy chcesz stworzyć własną postać niezależną strażnika.
# Leash the guard to a position so they stay between 500 and 1000
# cm of the position they're leashed to
Leashable.SetLeashPosition(NPCSpawnPoint, InnerRadius := 500.0, OuterRadius := 1000.0)
# Leash the guard to an agent so they stay between 500 and 1000
# cm of the agent they're leashed to
Leashable.SetLeashAgent(AgentToFollow, InnerRadius := 500.0, OuterRadius := 1000.0)
# Clear all leashes on the guard
Leashable.ClearLeash()
Rysowanie debugowania
Na początku pliku ten szablon definiuje wyspecjalizowany kanał do rysowania debugowania. Możesz użyć Rysowania debugowania, aby wizualizować pewne dane gry do celów testowania. Możesz np. wizualizować zakres widoczności swojej postaci lub rysować kształt wokół lokalizacji, do której podąża. Aby wizualizować takie kształty debugowania, musi być włączone Rysowanie debugowania Verse na karcie Debugowanie w Ustawieniach wyspy, w opublikowanych przygodach rysunki nie będą widoczne. Kanał na początku pliku pozwala na ukrywanie, wyświetlanie i czyszczenie wszystkich kształtów debugowania w kanale przy użyciu jednej metody.
# Create a dedicated debug channel to draw to for this behavior
npc_debug_draw := class(debug_draw_channel) {}
Klasa szablonu new_npc_behavior definiuje kilka wartości używanych do wizualizacji i ruchu.
MoveToWaitDurationdefiniuje, jak długo, licząc w sekundach, postać czeka w jakimś punkcie, zanim się poruszy.Verse# How long to wait in seconds after the NPC navigates to a point before moving on. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5}, MaxValue:=option{10.0} MoveToWaitDuration:float = 5.0DistanceFromSpawnPtToMovedefiniuje zakres losowego przesunięcia od miejsca spawnu, do którego ma się przemieścić postać.Verse# The negative min and absolute max x & y coordinate offset in centimeters to tell the NPC to move to @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.0} DistanceFromSpawnPtToMove:float = 1500.0Wartość logiczna
ShowAIDebugpozwala na przełączanie między rysowaniem i ukrywaniem kształtów debugowania z poziomu edytora.Verse# Whether to draw debug to the NPC channel when Verse Debug Draw is enabled in Island Settings. @editable: Categories:=array{my_first_npc_behavior_message_module.SettingsCategory} ShowAIDebug:logic = trueWartość pojedynczej precyzji (float)
AIDebugDrawTimepozwala na określenie ilości czasu, przez który będzie renderowana lokalizacja rysowania debugowania.Verse# How long in seconds to render the debug draw location and print text. # It is recommended to keep this in sync with MoveToWaitDuration otherwise the print will not be shown if a previous message is displayed. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5} AIDebugDrawTime:float = 5.0Wartość pojedynczej precyzji
LookAtDebugDrawDurationpozwala określić, przez jak długo renderować rysowanie debugowania strzałki patrzenia.Verse# How long in seconds to render the look at arrow's debug draw. LookAtDebugDrawDuration:float = 0.5Kanał
DebugDrawNPCdefiniuje instancję rysowania debugowania i używa kanału zdefiniowanego na początku pliku.Verse# How long in seconds to render the look at arrow's debug draw. @editable_number(float): Categories:=array{my_first_npc_behavior_message_module.SettingsCategory}, MinValue:=option{0.5} LookAtDebugDrawDuration:float = 0.5Na koniec,
VerticalOffsetToNPCHeaddefiniuje przesunięcie od miednicy do głowy postaci niezależnej, od którego ma być rysowana strzałka debugowania kierunku patrzenia. Bez tego przesunięcia strzałka debugowania kierunku patrzenia byłaby rysowana od środka postaci niezależnej.Verse# Used for specifying a point offset from the NPC pelvis to the head to draw the look at arrow from. VerticalOffsetToNPCHead<private>:float = 55.0
Dwie funkcje w klasie szablonu new_npc_behavior rysują kształty debugowania. Funkcja DrawDebugLocation() rysuje duży punkt w określonej lokalizacji przez długość czasu równą LookAtDebugDrawDuration.
# This function draws a box around a specified position for a finite amount of time.
# NOTE: To see this in game, Verse Debug Draw must be enabled in Island Settings.
DrawDebugLocation(Location:vector3):void =
DebugDrawNPC.DrawPoint( Location,
?Color := NamedColors.SteelBlue,
?Thickness := 100.0,
?DrawDurationPolicy := debug_draw_duration_policy.FiniteDuration,
?Duration := AIDebugDrawTime )
Funkcja DrawDebugLookAt() pozwala zwizualizować kierunek, w którym patrzy jakiś znak, poprzez rysowanie strzałki biegnącej od głowy agenta do punktu, na który patrzy.
# This function draws an arrow from the Agent's head to its look at point every half a second.
# NOTE: To see this in game, Verse Debug Draw must be enabled in Island Settings.
DrawDebugLookAt(Character:fort_character, LookAtPoint:vector3)<suspends>:void=
loop:
DebugDrawNPC.DrawArrow( Character.GetTransform().Translation + vector3{ Z := VerticalOffsetToNPCHead},
LookAtPoint,
?ArrowSize := 50.0,
?Color := NamedColors.Yellow,
?Thickness := 5.0,
?DrawDurationPolicy := debug_draw_duration_policy.FiniteDuration,
Dodawanie postaci do poziomu
Wiesz już, jak wygląda skrypt zachowania postaci niezależnej. Czas utworzyć postać i użyć skryptu na wyspie. Poniższy przepływ pracy zaprojektowano dla postaci typu Strażnicy, ale skrypt zachowania postaci niezależnej będzie też działał z postaciami typu Niestandardowe i Dzikie zwierzęta.
Utwórz nową definicję postaci niezależnej o nazwie MyFirstCharacterDefinition. Kliknij nową definicję postaci, aby otworzyć ekran Definicja postaci.
Na ekranie Definicja postaci zmodyfikuj następujące właściwości:
W sekcji Typ postaci niezależnej wybierz dla opcji Typ ustawienie Strażnik. Interfejs strażnika daje dostęp do funkcjonalności charakterystycznych dla postaci strażnika, takich jak zdarzenia, gdy strażnik zostanie zaalarmowany lub coś podejrzewa, umożliwia też wynajmowanie strażników jako sojuszników. Strażnicy mogą też brać broń do ręki, a postacie typu Niestandardowe i Dzikie zwierzęta obecnie nie mogą tego robić. Możesz też zmienić nazwę postaci na karcie Nazwa.
W sekcji Zachowanie postaci niezależnej wybierz dla opcji Zachowanie ustawienie Zachowanie Verse. Następnie wybierz dla opcji Skrypt zachowania postaci niezależnej ustawienie
medic_example. Postać będzie miała dalej dostęp do funkcjonalności z interfejsu strażnika, ale będzie używała twojego skryptu Verse, aby zdecydować, co robić w trakcie fazOnBeginiOnEnd.Na karcie Modyfikatory w sekcji Modyfikator spawnu strażnika kliknij kartę Elementy kosmetyczne, aby zmienić wygląd kosmetyczny znaku. Możesz wybrać spośród istniejących elementów kosmetycznych lub włączyć Dopasowanie elementów kosmetycznych postaci, aby używać niestandardowego modelu. Uwaga: dopasowania elementów kosmetycznych mogą używać tylko strażnicy i postacie typu Niestandardowe, dzikie zwierzęta nie mogą tego używać. W celu uzyskania dodatkowych informacji o modyfikatorach postaci i o tym, które mają zastosowanie do różnych typów postaci, przeczytaj stronę Definicja postaci niezależnej.
Na karcie Modyfikatory kliknij Dodaj element, aby dodać nowy modyfikator do postaci. Zmień typ nowego modyfikatora na Modyfikator ekwipunku. Uwaga: modyfikatora ekwipunku mogą używać tylko strażnicy.
W pozycji Modyfikator ekwipunku kliknij Dodaj element, aby dodać nowy przedmiot do ekwipunku postaci. Ustaw opcję Definicja przedmiotu na broń, przedmiot lub coś innego, co postać powinna mieć. Do ekwipunku postaci możesz dodać wiele przedmiotów, postacie będą używały broni do walki, przedmiotów do leczenia itd.
Na karcie Modyfikatory kliknij Dodaj element, aby dodać nowy modyfikator do postaci. Zmień typ nowego modyfikatora na Modyfikator UI.
W obszarze Modyfikator UI kliknij kartę Nazwa, aby zmienić nazwę swojej postaci. Nazwa postaci będzie wyświetlana nad jej głową.
Zapisz definicję swojej postaci niezależnej. W Przeglądarce zawartości przeciągnij definicję postaci niezależnej do poziomu. Automatycznie utworzy to Generator postaci niezależnej i przypisze do niego twoją definicję postaci.
Wybierz Generator postaci niezależnej. W Outlinerze, w sekcji Opcje użytkownika:
Dla ustawienia Liczba spawnów wybierz wartość 20. Utworzysz kilku strażników, którzy będą ci pomagali, dlatego pobaw się trochę i wyciągnij z tej możliwości, ile się da.
Na pasku narzędzi UEFN kliknij Uruchom sesję, aby przetestować poziom w grze. Podczas testu gry postać powinna się zespawnować i patrolować teren między punktem początkowym a losowym punktem w jego pobliżu, a także walczyć ze wszystkimi wrogami, których napotka po drodze.
Praca własna
Po ukończeniu tego przewodnika wiesz, jak tworzyć skrypt zachowania postaci niezależnej, aby generować własne niestandardowe postacie. Aby dowiedzieć się więcej na temat tworzenia konkretnych typów postaci i scenariuszy, zapoznaj się z wymienionymi poniżej samouczkami na temat zachowania postaci niezależnych.