Esta función se encuentra en una fase experimental, de modo que puedes probarla, dejarnos tu feedback y conocer nuestros planes. En este momento, no puedes publicar proyectos que utilicen inventarios y objetos personalizados.
Ten en cuenta que no podemos garantizar la retrocompatibilidad para los recursos creados en la fase experimental. Las API para estas funciones podrían cambiar y podemos retirar funciones experimentales en su totalidad o funcionalidades específicas conforme lo consideremos. Consulta la lista de problemas conocidos antes de comenzar a trabajar con esta función.
En este tutorial, te mostramos cómo crear un componente interactivo personalizado de "recolección de objetos" que permita al jugador recoger objetos personalizados y añadir el objeto recogido al inventario del jugador.
Antes de empezar
Debes familiarizarte con UEFN, Scene Graph y el código de Verse para completar correctamente este tutorial.
Configura tu proyecto
Sigue estos pasos para configurar tu proyecto y habilitar el inventario y los elementos personalizados.
Abre UEFN y crea un proyecto a partir de cualquier plantilla de isla. En las plantillas de islas, puedes usar el proyecto en blanco si deseas garantizar un área plana con la que trabajar. Ponle nombre a tu 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 Objetos personalizados e inventario.
Escribe el código de Verse
El interactable_component es un componente de Scene Graph que se utiliza para manejar la interacción general. De forma predeterminada, los jugadores pueden presionar un botón 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 para interactuar con él. Es necesario que el objeto tenga colisión que se pueda comprobar cuando algo intente interactuar con la entidad.
Selecciona la entidad a la que vas a añadir el componente interactivo personalizado. En el panel de 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 si añades un archivo de Verse nuevo con el explorador de Verse.
En Elegir una plantilla, selecciona Scene Graph Component.
En la parte inferior, en el campo Nombre del componente, escribe item_interactable_component. A continuación, haz clic en Crear.
En la barra de menú, haz clic en Verse > Explorador de Verse. Ubica tu 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 escribir todo en este tutorial. Primero agrega los módulos requeridos. Puedes copiarlos y pegarlos desde el fragmento que está abajo.
Verseusing { /Verse.org/Simulation } using { /Verse.org/SceneGraph } using { /UnrealEngine.com/Itemization }A continuación, agrega una función de ayuda 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 de 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 Scene Graph que herede de
interactable_component. Este es elitem_interactable_component.Verseitem_interactable_component := class(interactable_component) :Agrega una variable
cancelableopcional. Este componente personalizado tendrá que 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 llamar a la función subscribe enSucceededEvent. Esto también definirá la funciónOnSucceededEventpara que se active cuando ocurra 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 haya recogido un objeto, o podría interferir con otro código una vez que el objeto esté en un inventario. Tú puedes hacerlo al anular la funciónOnRemovingFromScene. Esto se activa cuando cambia la entidad principal del objeto. Úsalo aquí paracancelar()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. Entonces necesitas escribir una nueva función con la misma firma. En el paso 6, utilizaste la función de ayudaGetInventoryRoot[]para recuperar el inventario raíz del jugador que interactúa. Ahora llama a la funciónAddItemDistribute()para darle la Entidad que es dueña de este componente.VerseOnSucceededEvent(Agent:agent):void = if(PickupInventory := GetInventoryRoot[Agent]): if(PickupInventory.AddItemDistribute(Entity).GetSuccess[]):El último bit de código necesario para este componente es la anulación de la función
InteractMessage[]. Esto devuelve el mensaje que se muestra en pantalla cuando un jugador está mirando el objeto, antes de que lo recoja. Esto verificará la entidad propietaria de este componente para ver si también tiene uncomponente de detalles del artículo. Si es así, recupera el nombre del objeto. De lo contrario, si la entidad no tenía unitem_details_componento se eliminó por algún motivo, se utiliza elDefaultInteractionMessageque declaramos anteriormente.VerseInteractMessage<override>(Agent:agent)<reads><decides>:message = if(Details := Entity.GetComponent[item_details_component]): Details.Name else: DefaultInteractionMessage
Cómo configurar el prefabricado
Ahora que escribiste tu item_interactable_component, puedes crear un objeto de ejemplo para exhibirlo. Sigue estos pasos para crear un prefabricado de Scene Graph y adjuntar el nuevo componente.
Haz clic derecho en el explorador de contenido y, en el menú contextual, selecciona Definición de prefabricados de entidades. Nombra el nuevo prefabricado Item_Cube.
Abre el nuevo Prefabricado y añade los siguientes componentes al hacer clic en +Componente en el panel de detalles.
item_componentitem_details_component: completa los campos de este componente.Nombre
Descripción
Descripción breve
mesh_component: selecciona la primitiva de cubo u otro cubo.item_interactable_component
El siguiente video muestra el item_interactable_component en acción. Cuando el jugador interactúa con el Prefabricado Item_Cube que creaste, el objeto se agrega al inventario del jugador.
Aquí está la secuencia de comandos completa para 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]