Cette fonctionnalité est en phase expérimentale, ce qui vous permet de l'essayer, de donner votre avis et de découvrir nos projets. Il n'est pas possible de publier un projet qui utilise un inventaire et des objets personnalisés pour le moment.
Nous attirons votre attention sur le fait que nous ne garantissons aucune compatibilité descendante pour les ressources créées en phase expérimentale, que les API de ces fonctionnalités sont susceptibles d'évoluer et que nous pouvons éventuellement supprimer des fonctionnalités expérimentales ou autres à notre discrétion. Consultez la [liste des problèmes connus](scene-graph-in-unreal-editor-for-fortnite#problèmesconnus) avant de commencer à utiliser cette fonctionnalité.
Ce tutoriel vous montre comment créer un composant interactif "item pickup" personnalisé, qui permet aux joueurs de ramasser des objets personnalisés et d'ajouter l'objet ramassé à l'inventaire du joueur.
Avant de commencer
Vous devez connaître l'UEFN, Scene Graph et le code Verse pour suivre ce tutoriel.
Configurer votre projet
Procédez comme suit pour configurer votre projet et activer le système d'inventaire et d'objets personnalisés.
Ouvrez l'UEFN et créez un projet à partir de n'importe quel modèle d'île. Dans les modèles d'îles, vous pouvez utiliser le projet Vide si vous souhaitez travailler sur une zone plane. Nommez votre nouveau projet, puis cliquez sur Créer pour l'ouvrir dans l'éditeur.
Dans la barre d'outils, cliquez sur Projet et sélectionnez Paramètres du projet.
Faites défiler le contenu vers le bas jusqu'à la section Accès expérimental, puis cochez la case Objets et inventaires personnalisés.
Rédiger le code Verse
Le composant interactable_component est un composant Scene Graph utilisé pour gérer l'interaction générale. Par défaut, les joueurs peuvent appuyer sur une entrée pour interagir avec une entité disposant du composant. Procédez comme suit pour personnaliser ce composant.
Une entité doit posséder un mesh_component pour interagir avec un interactable_component. Il est nécessaire que l'objet dispose d'une collision pouvant être vérifiée lorsqu'un élément tente d'interagir avec l'entité.
Sélectionnez l'entité à laquelle vous allez ajouter le composant interactif personnalisé. Dans le panneau Détails, cliquez sur +Composant et sélectionnez Nouveau composant Verse. La fenêtre Créer un composant Verse s'ouvre.
Vous pouvez également créer un composant Verse en ajoutant un nouveau fichier Verse à l'aide de l'explorateur Verse.
Sous Choisir un modèle, sélectionnez Composant Scene Graph.
En bas, dans le champ Nom de composant, saisissez item_interactable_component, puis cliquez sur Créer.
Dans la barre de menus, cliquez sur Verse > Explorateur Verse. Localisez votre nouveau composant Verse, faites un clic droit dessus et sélectionnez Ouvrir dans Visual Studio Code.
Dans le nouveau fichier Verse, supprimez le code existant, car vous allez tout écrire dans ce tutoriel. Ajoutez d'abord les modules requis. Vous pouvez les copier et coller à partir de l'extrait ci-dessous.
Verseusing { /Verse.org/Simulation } using { /Verse.org/SceneGraph } using { /UnrealEngine.com/Itemization }Ensuite, ajoutez une fonction d'aide pour obtenir l'inventaire racine d'un joueur spécifié.
VerseGetInventoryRoot(Agent:agent)<decides><transacts>:inventory_component = Inventory := (for (I : Agent.FindDescendantComponents(inventory_component)) { I })[0]Avant de créer le nouveau composant personnalisé, vous devez déclarer une nouvelle constante de type message en dehors de l'étendue de notre classe. Ce message est la valeur par défaut si la fonction ne peut pas obtenir un nom à partir du composant
item_details_componentd'un objet. En général, ce type de message est écrit tout en bas du fichier Verse.VerseDefaultInteractionMessage<localizes>:message = "Interact"Définissez un nouveau graphique de scène qui hérite du composant
interactable_component. Il s'agit d'item_interactable_component.Verseitem_interactable_component := class(interactable_component) :Ajoutez une variable
cancelableoptionnelle. Ce composant personnalisé devra s'abonner à un événement pour savoir quand un joueur interagit avec l'objet. Cette variable enregistre une référence à cet abonnement et l'annule si nécessaire.Versevar SucceededEventHandler : ?cancelable = falseEnsuite, remplacez la fonction
OnAddedToSceneafin qu'elle définisse la variable facultative lorsque le parent de l'entité qui possède ce composant change (par exemple, lorsqu'il est placé dans le monde). DéfinissezSucceededEventHandlerpour appeler la fonction d'abonnement surSucceededEvent. Cela définira également la fonctionOnSucceededEventafin qu'elle se déclenche lorsqu'une interaction se produit.VerseOnAddedToScene<override>():void = if(not SucceededEventHandler?): set SucceededEventHandler = option{SucceededEvent.Subscribe(OnSucceededEvent)}L'abonnement
SucceededEventdoit être nettoyé une fois qu'un objet a été ramassé, sinon il pourrait interférer avec d'autre code une fois l'objet dans l'inventaire. Pour ce faire, remplacez la fonctionOnRemovingFromScene. L'activation a lieu quand le parent de l'entité d'objet change. Utilisez-le ici pourcancel()(annuler) l'abonnement à l'événement. En cas de réussite, il invalide également leSucceededEventHandler.VerseOnRemovingFromScene<override>():void = if(SucceededEventHandler?.Cancel()): set SucceededEventHandler = falseÀ l'étape 10, la fonction
OnSucceededEventest abonnée àSucceededEvent, mais elle n'existe pas encore dans le code. Vous devez donc écrire une nouvelle fonction avec la même signature. À l'étape 6, vous avez utilisé la fonction d'aideGetInventoryRoot[]pour récupérer l'inventaire racine du joueur qui interagit. Appelez maintenant la fonctionAddItemDistribute()pour fournir l'entité propriétaire de ce composant.VerseOnSucceededEvent(Agent:agent):void = if(PickupInventory := GetInventoryRoot[Agent]): if(PickupInventory.AddItemDistribute(Entity).GetSuccess[]):La dernière partie de code nécessaire pour ce composant est le remplacement de la fonction
InteractMessage[]. Elle renvoie le message qui s'affiche à l'écran lorsqu'un joueur regarde l'objet avant de le ramasser et permet de vérifier l'entité propriétaire de ce composant pour voir si elle possède également un composantitem_details_component. Si c'est le cas, elle permet de récupérer le nom de l'objet. Sinon, si l'entité n'avait pas d'item_details_componentou si elle a été supprimée pour une raison quelconque, leDefaultInteractionMessageque nous avons déclaré précédemment est utilisé.VerseInteractMessage<override>(Agent:agent)<reads><decides>:message = if(Details := Entity.GetComponent[item_details_component]): Details.Name else: DefaultInteractionMessage
Configurer le préfabriqué
Maintenant que vous avez écrit votre item_interactable_component, vous pouvez créer un exemple d'objet pour le présenter. Procédez comme suit pour créer un préfabriqué Scene Graph et joindre le nouveau composant.
Faites un clic droit dans le navigateur de contenu, puis sélectionnez Définition de préfabriqué d'entité dans le menu contextuel. Nommez le nouveau préfabriqué Item_Cube.
Ouvrez le nouveau préfabriqué et ajoutez les composants suivants en cliquant sur +Composant dans le panneau Détails.
item_componentitem_details_component- renseignez les champs de ce composant :Nom
Description
Courte description
mesh_component- sélectionnez la primitive de cube ou un autre cube.item_interactable_component
La vidéo ci-dessous montre l'item_interactable_component en action. Lorsque le joueur interagit avec le préfabriqué Item_Cube que vous avez créé, l'objet est ajouté à l'inventaire du joueur.
Voici le script complet de ce tutoriel.
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]