Questa funzione è in stato sperimentale, quindi puoi provarla, fornire un feedback e vedere cosa stiamo pianificando. Al momento non puoi pubblicare un progetto che utilizza Inventario e oggetti personalizzati.
Ricorda che non garantiamo la retrocompatibilità per gli asset creati in fase sperimentale, che le API per queste funzioni sono soggette a modifiche e che potremmo rimuovere intere funzioni sperimentali o funzionalità specifiche a nostra discrezione. Prima di iniziare a usare questa funzionalità, consulta l'elenco dei problemi noti.
Questo tutorial ti mostra come creare un componente interattivo personalizzato "raccolta oggetti" che permette ai giocatori di raccogliere oggetti personalizzati e che aggiunge l'oggetto raccolto all'inventario del giocatore.
Prima di iniziare
Devi avere familiarità con il codice UEFN, Scene Graph e Verse per completare correttamente questo tutorial.
Imposta il progetto
Segui questi step per impostare il tuo progetto e abilitare Inventario e oggetti personalizzati.
Apri UEFN e crea un progetto da qualsiasi modello di isola. Nei modelli di isole, puoi utilizzare il progetto Vuoto se desideri avere a disposizione un'area libera con cui lavorare. Assegna un nome al tuo nuovo progetto e fai clic su Crea per aprirlo nell'editor.
Nella barra degli strumenti, fai clic su Progetto e seleziona Impostazioni progetto.
Scorri verso il basso fino alla sezione Accesso sperimentale e seleziona la casella Oggetti personalizzati e inventario.
Scrivi il codice Verse
interactable_component è un componente Scene Graph utilizzato per gestire l'interazione generale. Per impostazione predefinita, i giocatori possono premere un input per interagire con un'entità che ha il componente. Segui questi passaggi per personalizzare questo componente.
Un interactable_component richiede che un'entità abbia un mesh_component per poter interagire. È necessario che l'oggetto abbia una collisione che si possa controllare quando qualcosa cerca di interagire con l'entità.
Seleziona l'entità a cui aggiungere il componente interattivo personalizzato. Nel pannello Dettagli, fai clic su +Componente e seleziona Nuovo componente Verse. Si apre la finestra Crea componente Verse.
Puoi creare un componente Verse anche aggiungendo un nuovo file Verse tramite Verse Explorer.
In Scegli un modello, seleziona Componente Scene Graph.
In basso, nel campo Nome componente, digita item_interactable_component. Quindi fai clic su Crea.
Nella barra del menu, fai clic su Verse > Verse Explorer. Individua il nuovo componente Verse, fai clic con il pulsante destro del mouse e seleziona Apri in Visual Studio Code.
Nel nuovo file di Verse, elimina il codice esistente, dato che in questo tutorial lo riscriverai tutto. Per prima cosa, aggiungi i moduli richiesti. Puoi copiarli e incollarli dallo snippet qui sotto.
Verseusing { /Verse.org/Simulation } using { /Verse.org/SceneGraph } using { /UnrealEngine.com/Itemization }Quindi, aggiungi una funzione di aiuto per ottenere l'inventario radice da un giocatore specifico.
VerseGetInventoryRoot(Agent:agent)<decides><transacts>:inventory_component = Inventory := (for (I : Agent.FindDescendantComponents(inventory_component)) { I })[0]Prima di creare il nuovo componente personalizzato, devi dichiarare una nuova costante di tipo di messaggio al di fuori del mirino della nostra classe. Questo messaggio è il valore predefinito se la funzione non riesce a ottenere un nome dal componente
item_details_componentdi un oggetto. In genere questo tipo di messaggio viene scritto nella parte inferiore del file Verse.VerseDefaultInteractionMessage<localizes>:message = "Interact"Definisci un nuovo Scene Graph che eredita da
interactable_component. Questo èitem_interactable_component.Verseitem_interactable_component := class(interactable_component) :Aggiungi una variabile opzionale
annullabile. Questo componente personalizzato dovrà iscriversi a un evento per sapere quando un giocatore interagisce con l'oggetto. Questa variabile salva un riferimento a tale iscrizione e lo annulla, se necessario.Versevar SucceededEventHandler : ?cancelable = falseQuindi, esegui l'override della funzione
OnAddedToScenein modo che imposta la variabile facoltativa quando cambia il genitore dell'entità che possiede questo componente (ad esempio quando lo posizioni nel mondo). ImpostaSucceededEventHandlerper chiamare la funzione di iscrizione suSucceededEvent. In questo modo verrà definita anche la funzioneOnSucceededEventin modo che si attivi quando avviene un'interazione.VerseOnAddedToScene<override>():void = if(not SucceededEventHandler?): set SucceededEventHandler = option{SucceededEvent.Subscribe(OnSucceededEvent)}L'iscrizione
SucceededEventdeve essere ripulita una volta raccolto un oggetto, altrimenti potrebbe interferire con altro codice una volta che l'oggetto è stato inserito in un inventario. Tu Puoi farlo eseguendo l'override della funzioneOnRemovingFromScene. Si attiva quando il genitore dell'entità cambia. Utilizzalo qui perannullare()l'iscrizione all'evento. In caso di esito positivo, verrà invalidato ancheSucceededEventHandler.VerseOnRemovingFromScene<override>():void = if(SucceededEventHandler?.Cancel()): set SucceededEventHandler = falseNello step 10 la funzione
OnSucceededEventviene sottoscritta aSucceededEvent, ma non esiste ancora nel codice. Quindi devi scrivere una nuova funzione con la stessa firma. Nel passaggio 6, hai usato la funzione di supportoGetInventoryRoot[]per recuperare l'inventario radice dal giocatore che interagisce. Ora chiama la funzioneAddItemDistribute()per fornire l'entità proprietaria di questo componente.VerseOnSucceededEvent(Agent:agent):void = if(PickupInventory := GetInventoryRoot[Agent]): if(PickupInventory.AddItemDistribute(Entity).GetSuccess[]):L'ultimo bit di codice necessario per questo componente è l'override della funzione
InteractMessage[]. Questo restituisce il messaggio che viene mostrato sullo schermo quando un giocatore guarda l'oggetto, prima di raccoglierlo. Questo controllerà l'entità che possiede questo componente per vedere se ha anche unitem_details_component. Se sì, viene recuperato il nome dell'oggetto. In caso contrario, se l'entità non aveva unitem_details_componento è stata rimossa per qualche motivo, viene utilizzatoDefaultInteractionMessagedichiarato in precedenza.VerseInteractMessage<override>(Agent:agent)<reads><decides>:message = if(Details := Entity.GetComponent[item_details_component]): Details.Name else: DefaultInteractionMessage
Impostazione del prefabbricato
Ora che hai scritto il tuo item_interactable_component, puoi creare un oggetto di esempio per mostrarlo. Segui questi passaggi per creare un prefabbricato Scene Graph e aggiungere il nuovo componente.
Fai clic con il pulsante destro del mouse in Esplora contenuti e dal menu contestuale seleziona Definizione prefabbricato entità. Dai un nome al nuovo prefabbricato Item_Cube.
Apri il nuovo prefabbricato e aggiungi i seguenti componenti facendo clic su +Componente nel pannello Dettagli.
item_componentitem_details_component- completa i campi di questo componente:Nome
Descrizione
Descrizione breve
mesh_component- seleziona la primitive del cubo o un altro cubo.item_interactable_component
Il video seguente mostra il item_interactable_component in azione. Quando il giocatore interagisce con il prefabbricato Item_Cube che hai creato, l'oggetto viene aggiunto all'inventario del giocatore.
Ecco lo script completo di questo tutorial.
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]