Ta funkcja jest w stanie eksperymentalnym, więc możesz ją wypróbować, przesłać swoją opinię i zobaczyć, co planujemy wdrożyć. Aktualnie nie możesz opublikować projektu, w którym wykorzystano niestandardowy ekwipunek i przedmioty.
Pamiętaj, że nie gwarantujemy kompatybilności wstecznej zasobów utworzonych na etapie eksperymentalnym, interfejsy API tych funkcji mogą ulec zmianie i możemy wedle własnego uznania usunąć całe funkcje eksperymentalne lub określone funkcje. Przed rozpoczęciem pracy z tą funkcją sprawdź listę znanych problemów.
Ten samouczek pokazuje, jak utworzyć niestandardowy interaktywny komponent „podnoszenia przedmiotu”, który umożliwia graczom podnoszenie niestandardowych przedmiotów, a następnie dodaje podniesiony przedmiot do ekwipunku gracza.
Zanim zaczniesz
Aby ukończyć ten samouczek, musisz znać UEFN, narzędzie Scene Graph i kod Verse.
Konfigurowanie projektu
Wykonaj poniższe kroki, aby skonfigurować projekt oraz włączyć system niestandardowych ekwipunków i przedmiotów.
Otwórz UEFN i utwórz projekt na podstawie dowolnego szablonu wyspy. W oknie szablonów wysp możesz wybrać projekt Pusty, jeśli chcesz pracować z wykorzystaniem płaskiego obszaru. Nadaj nazwę nowemu projektowi i kliknij Utwórz, aby otworzyć go w edytorze.
Na pasku narzędzi kliknij Projekt i wybierz Ustawienia projektu.
Przewiń w dół do sekcji Dostęp do funkcji eksperymentalnych i zaznacz pole System niestandardowych ekwipunków i przedmiotów.
Pisanie kodu Verse
Komponent interactable_component jest komponentem Scene Graph używanym do obsługi ogólnej interakcji. Domyślnie gracze mogą nacisnąć przycisk, aby wejść w interakcję z jednostką, która posiada komponent. Wykonaj te kroki, aby dostosować ten komponent.
Komponent interactable_component wymaga, aby jednostka posiadała mesh_component, aby można było z nią wchodzić w interakcję. Obiekt musi mieć kolizję, którą da się sprawdzić, gdy coś próbuje wejść w interakcję z jednostką.
Wybierz jednostkę, do której chcesz dodać niestandardowy interaktywny komponent. W panelu szczegółów kliknij +Komponent i wybierz Nowy komponent Verse. Otworzy się okno Utwórz komponent Verse.
Możesz również utworzyć komponent Verse poprzez dodanie nowego pliku Verse za pomocą Eksploratora Verse.
W sekcji Wybierz szablon wybierz Komponent Scene Graph.
U dołu w polu Nazwa komponentu wpisz item_interactable_component. Następnie kliknij Utwórz.
Na pasku menu kliknij kolejno Verse > Eksplorator Verse. Znajdź nowy komponent Verse, kliknij go prawym przyciskiem myszy i wybierz Otwórz w Visual Studio Code.
W nowym pliku Verse usuń istniejący kod, ponieważ w tym samouczku zamierzasz napisać wszystko od nowa. Najpierw dodaj wymagane moduły. Możesz je skopiować i wkleić z fragmentu poniżej.
Verseusing { /Verse.org/Simulation } using { /Verse.org/SceneGraph } using { /UnrealEngine.com/Itemization }Następnie dodaj funkcję pomocniczą, aby pobrać ekwipunek główny określonego gracza.
VerseGetInventoryRoot(Agent:agent)<decides><transacts>:inventory_component = Inventory := (for (I : Agent.FindDescendantComponents(inventory_component)) { I })[0]Przed utworzeniem nowego komponentu niestandardowego musisz zadeklarować nową stałą typu komunikatu poza zakresem naszej klasy. Ten komunikat jest wartością domyślną, jeśli funkcja nie może pobrać nazwy z komponentu
item_details_component. Zazwyczaj komunikaty tego typu są zapisywane na samym końcu pliku Verse.VerseDefaultInteractionMessage<localizes>:message = "Interact"Zdefiniuj nowy Scene Graph, który dziedziczy z
interactable_component. To jestitem_interactable_component.Verseitem_interactable_component := class(interactable_component) :Dodaj opcjonalną zmienną
możliwą do anulowania. Ten komponent niestandardowy musi zasubskrybować zdarzenie, aby wiedzieć, kiedy gracz wchodzi w interakcję z przedmiotem. Ta zmienna zapisuje odwołanie do tej subskrypcji i w razie potrzeby ją anuluje.Versevar SucceededEventHandler : ?cancelable = falseNastępnie zastąp funkcję
OnAddedToScenetak, aby ustawiała zmienną opcjonalną, gdy zmieni się element nadrzędny jednostki będącej właścicielem tego komponentu (na przykład po umieszczeniu go w świecie). UstawSucceededEventHandlertak, aby wywołał funkcję subskrypcji dla zdarzeniaSucceededEvent. Spowoduje to również zdefiniowanie funkcjiOnSucceededEvent, tak aby była wyzwalana po wystąpieniu interakcji.VerseOnAddedToScene<override>():void = if(not SucceededEventHandler?): set SucceededEventHandler = option{SucceededEvent.Subscribe(OnSucceededEvent)}Subskrypcja
SucceededEventmusi zostać wyczyszczona po podniesieniu przedmiotu, w przeciwnym razie, gdy przedmiot znajdzie się w ekwipunku, może zakłócać działanie innego kodu. Ty Można to zrobić, zastępując funkcjęOnRemovingFromScene. Aktywuje się, gdy zmienia się jednostka nadrzędna elementu. Użyj go tutaj, abyanulować()subskrypcję zdarzenia. W przypadku powodzenia spowoduje również unieważnienieSucceededEventHandler.VerseOnRemovingFromScene<override>():void = if(SucceededEventHandler?.Cancel()): set SucceededEventHandler = falseW kroku 10 funkcja
OnSucceededEventzostała zasubskrybowana doSucceededEvent, ale jeszcze nie istnieje w kodzie. Musisz więc napisać nową funkcję o tej samej sygnaturze. W kroku 6 użyto funkcji pomocniczejGetInventoryRoot[]do pobrania głównego ekwipunku od gracza wchodzącego w interakcję. Teraz wywołaj funkcjęAddItemDistribute(), aby podać jednostkę będącą właścicielem tego komponentu.VerseOnSucceededEvent(Agent:agent):void = if(PickupInventory := GetInventoryRoot[Agent]): if(PickupInventory.AddItemDistribute(Entity).GetSuccess[]):Ostatni element kodu potrzebny dla tego komponentu to zastąpienie funkcji
InteractMessage[]. Zwraca komunikat wyświetlany na ekranie, gdy gracz patrzy na przedmiot, zanim go podniesie. Spowoduje to sprawdzenie, czy jednostka będąca właścicielem tego komponentu ma również komponentitem_details_component. Jeśli tak, pobiera nazwę przedmiotu. W przeciwnym razie, jeśli jednostka nie miała elementuitem_details_componentlub został on z jakiegoś powodu usunięty, użyje zadeklarowanego wcześniejDefaultInteractionMessage.VerseInteractMessage<override>(Agent:agent)<reads><decides>:message = if(Details := Entity.GetComponent[item_details_component]): Details.Name else: DefaultInteractionMessage
Konfigurowanie gotowca
Po zapisaniu item_interactable_component, możesz stworzyć przykładowy przedmiot, aby go zaprezentować. Wykonaj poniższe kroki, aby utworzyć gotowiec Scene Graph i dołączyć nowy komponent.
Kliknij prawym przyciskiem myszy w Przeglądarce zawartości i z menu kontekstowego wybierz opcję Definicja gotowca jednostki. Nadaj nowemu gotowcowi nazwę Item_Cube.
Otwórz nowy gotowiec i dodaj poniższe komponenty, klikając +Komponent w panelu szczegółów.
item_componentitem_details_component– wypełnij pola w tym komponencie.Nazwa
Opis
Krótki opis
mesh_component– pozwala wybrać prymityw sześcianu lub inny sześcian.item_interactable_component
Poniższy film przedstawia komponent item_interactable_component w działaniu. Gdy gracz wejdzie w interakcję z utworzonym przez ciebie gotowcem Item_Cube, przedmiot zostanie dodany do ekwipunku gracza.
Oto kompletny skrypt do tego samouczka.
using { /Verse.org/Simulation }
using { /Verse.org/SceneGraph }
using { /UnrealEngine.com/Itemization }
# This function returns the first subentity with an inventory_component. Use this to get the root inventory of an agent.
GetInventoryRoot(Agent:agent)<decides><transacts>:inventory_component =
Inventory := (for (I : Agent.FindDescendantComponents(inventory_component)) { I })[0]