Esta función se encuentra en estado experimental, así que puedes probarla, enviarnos tu feedback y ver qué estamos planeando. Actualmente no puedes publicar un proyecto que utilice el sistema de inventarios y objetos personalizados.
Ten en cuenta que no garantizamos la compatibilidad con versiones anteriores de los recursos creados en la fase experimental, dado que es posible que realicemos cambios en las API de estas funciones y eliminemos funciones experimentales completas o funcionalidades específicas según consideremos. Consulta la lista de problemas conocidos antes de empezar a trabajar con la función.
Este tutorial te muestra cómo crear un componente interactivo personalizado de «recogida de objetos» que permite a los jugadores recoger objetos personalizados y añadir el objeto recogido al inventario del jugador.
Antes de empezar
Debes conocer UEFN, Scene Graph y el código de Verse para completar correctamente este tutorial.
Cómo configurar el proyecto
Sigue estos pasos para configurar el proyecto y habilitar el inventario y los objetos personalizados.
Abre UEFN y crea un proyecto a partir de cualquier plantilla de isla. En las plantillas de isla, puedes usar el proyecto En blanco si quieres contar con una zona plana garantizada con la que trabajar. Ponle nombre al nuevo proyecto y haz clic en Crear para abrirlo en el editor.
En la barra de herramientas, haz clic en Proyecto y selecciona Configuración del proyecto.
Desplázate hacia abajo hasta la sección Acceso experimental y marca la casilla de Inventario y objetos personalizados.
Escritura del código de Verse
El interactable_component es un componente de Scene Graph que se utiliza para gestionar la interacción general. Por defecto, los jugadores pueden pulsar una entrada para interactuar con una entidad que tenga el componente. Sigue estos pasos para personalizar este componente.
Un interactable_component requiere que una entidad tenga un mesh_component con el que interactuar. Es necesario que el objeto tenga una colisión que se pueda comprobar cuando algo intenta interactuar con la entidad.
Selecciona la entidad a la que vas a añadir el componente interactivo personalizado. En el panel Detalles, haz clic en +Componente y selecciona Nuevo componente de Verse. Se abrirá la ventana Crear componente de Verse.
También puedes crear un componente de Verse añadiendo un nuevo archivo de Verse mediante el explorador de Verse.
En Seleccionar plantilla, selecciona Componente de Scene Graph.
En la parte inferior, en el campo Nombre del componente, escribe item_interactable_component. A continuación, haz clic en Crear.
En la barra del menú, haz clic en Verse > Explorador de Verse. Busca el nuevo componente de Verse, haz clic derecho en él y selecciona Abrir en Visual Studio Code.
En el nuevo archivo de Verse, elimina el código existente, ya que vas a escribirlo todo en este tutorial. Primero añade los módulos necesarios. Puedes copiarlos y pegarlos desde el fragmento que aparece a continuación.
Verseusing { /Verse.org/Simulation } using { /Verse.org/SceneGraph } using { /UnrealEngine.com/Itemization }A continuación, añade una función auxiliar para obtener el inventario raíz de un jugador específico.
VerseGetInventoryRoot(Agent:agent)<decides><transacts>:inventory_component = Inventory := (for (I : Agent.FindDescendantComponents(inventory_component)) { I })[0]Antes de crear el nuevo componente personalizado, debes declarar una nueva constante de tipo mensaje fuera del ámbito de nuestra clase. Este mensaje es el valor predeterminado si la función no puede obtener un nombre del
item_details_componentde un objeto. Normalmente, este tipo de mensaje se escribe en la parte inferior del archivo de Verse.VerseDefaultInteractionMessage<localizes>:message = "Interact"Define un nuevo componente de Scene Graph que herede de
interactable_component, que seráitem_interactable_component.Verseitem_interactable_component := class(interactable_component) :Añade una variable opcional
cancelable. Este componente personalizado deberá suscribirse a un evento para saber cuándo un jugador interactúa con el objeto. Esta variable guarda una referencia a esa suscripción y la cancelará si es necesario.Versevar SucceededEventHandler : ?cancelable = falseA continuación, anula la función
OnAddedToScenepara que establezca la variable opcional cuando cambie el padre de la entidad propietaria de este componente (por ejemplo, cuando se coloque en el mundo). EstableceSucceededEventHandlerpara que llame a la función Subscribe enSucceededEvent. Esto también definirá la funciónOnSucceededEventpara que se active cuando se produzca una interacción.VerseOnAddedToScene<override>():void = if(not SucceededEventHandler?): set SucceededEventHandler = option{SucceededEvent.Subscribe(OnSucceededEvent)}La suscripción a
SucceededEventdebe limpiarse una vez que se ha recogido un objeto, ya que podría interferir con otro código una vez que el objeto se encuentre en el inventario. Puedes hacerlo anulando la funciónOnRemovingFromScene, que se activa cuando cambia el padre de la entidad del objeto. Utilízala aquí para cancelar (cancel()) la suscripción al evento. Si tiene éxito, también invalidará elSucceededEventHandler.VerseOnRemovingFromScene<override>():void = if(SucceededEventHandler?.Cancel()): set SucceededEventHandler = falseEn el paso 10, la función
OnSucceededEventse suscribe aSucceededEvent, pero aún no existe en el código, por lo que debes escribir una nueva función con la misma firma. En el paso 6, utilizaste la función auxiliarGetInventoryRoot[]para recuperar el inventario raíz del jugador que interactúa. Ahora llama a la funciónAddItemDistribute()para proporcionar la entidad propietaria de este componente.VerseOnSucceededEvent(Agent:agent):void = if(PickupInventory := GetInventoryRoot[Agent]): if(PickupInventory.AddItemDistribute(Entity).GetSuccess[]):El último fragmento de código necesario para este componente es la sustitución de la función
InteractMessage[], que devuelve el mensaje que se muestra en pantalla cuando un jugador mira el objeto antes de recogerlo. Esto comprobará la entidad propietaria de este componente para ver si también tiene unitem_details_component. Si es así, se recuperará el nombre del objeto. De lo contrario, si la entidad no tenía unitem_details_componento se eliminó por algún motivo, utiliza elDefaultInteractionMessageque declaramos anteriormente.VerseInteractMessage<override>(Agent:agent)<reads><decides>:message = if(Details := Entity.GetComponent[item_details_component]): Details.Name else: DefaultInteractionMessage
Configuración del prefabricado
Una vez que hayas escrito tu item_interactable_component, podrás crear un objeto de ejemplo para mostrarlo. Sigue estos pasos para crear un prefabricado de Scene Graph y adjuntar el nuevo componente.
Haz clic con el botón derecho del ratón en el explorador de contenido y, en el menú contextual, selecciona Definición de prefabricado de entidad. Pon el nombre Item_Cube al nuevo prefabricado.
Abre el nuevo prefabricado y añade los siguientes componentes haciendo clic en +Componente en el panel Detalles.
item_componentitem_details_component: rellena los campos de este componente con lo siguiente:Nombre
Descripción
Descripción breve
mesh_component: selecciona la forma primitiva de cubo u otro cubo.item_interactable_component
El siguiente vídeo muestra el item_interactable_component en acción. Cuando el jugador interactúa con el prefabricado Item_Cube que has creado, el objeto se añade al inventario del jugador.
Aquí tienes la secuencia de comandos completa de este 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]