Unreal Engine: Creación de un Sistema de Caza y Recolección Dinámico con Interacciones Contextuales y Blueprint
Este tutorial te guiará paso a paso en la creación de un sistema robusto de caza y recolección en Unreal Engine. Aprenderás a configurar objetos interactivos, manejar la lógica de recolección y diseñar una experiencia inmersiva para tu juego de supervivencia o RPG. Ideal para desarrolladores que buscan añadir mecánicas de supervivencia dinámicas.
🎯 Introducción al Sistema de Caza y Recolección en Unreal Engine
Los sistemas de caza y recolección son pilares fundamentales en muchos géneros de videojuegos, desde los survival y crafting hasta los RPGs de mundo abierto. Permiten a los jugadores interactuar con el entorno de manera significativa, recolectar recursos para la supervivencia, la fabricación o la progresión del personaje. En Unreal Engine, podemos construir estos sistemas de forma robusta y flexible utilizando Blueprints, aprovechando la potencia visual y la facilidad de implementación que nos ofrece el motor.
En este tutorial, exploraremos cómo diseñar y construir un sistema de caza y recolección dinámico. Cubriremos desde la configuración de los objetos interactivos, la lógica de recolección, hasta la integración con un sistema de inventario básico. Nos centraremos en la creación de interacciones contextuales, donde la acción del jugador cambia según el objeto con el que interactúa y las herramientas que posee. ¡Prepárate para dar vida a tus mundos y hacer que tus jugadores sientan la emoción de la supervivencia!
🛠️ Configuración Inicial del Proyecto
Para empezar, necesitaremos un proyecto base en Unreal Engine. Puedes usar una plantilla de 'Third Person' o 'First Person' para tener un personaje controlable y un entorno básico. Asegúrate de que tu proyecto sea un proyecto de Blueprint si prefieres no usar C++ en este tutorial. Si ya tienes un proyecto en marcha, ¡perfecto!
📂 Estructura de Carpetas Recomendada
Mantener tu proyecto organizado es crucial para la escalabilidad y el mantenimiento. Te sugiero la siguiente estructura para los archivos que crearemos:
Content/Gameplay/Resources/(Para los objetos interactivos como árboles, rocas, plantas)Content/Gameplay/Actors/(Para el actor de interacción genérico)Content/Gameplay/Interfaces/(Para las interfaces de interacción)Content/UI/(Si eventualmente agregamos UI para el inventario o mensajes)
🧩 Crear la Interfaz de Interacción (BPI_Interactable)
La base de nuestro sistema contextual será una interfaz de Blueprint. Esto nos permitirá tener diferentes tipos de objetos que respondan a una misma llamada de interacción, pero cada uno a su manera. Así, nuestro personaje solo necesita saber que un objeto es 'interactuable', sin importar si es un árbol, una roca o una planta.
- En tu carpeta
Content/Gameplay/Interfaces/, haz clic derecho y seleccionaBlueprints>Blueprint Interface. NómbraloBPI_Interactable. - Abre
BPI_Interactable. Verás una lista de funciones. - Haz clic en
+ New Functiony nómbralaInteract. Esta función no necesitará ninguna entrada o salida por ahora. Guardamos y cerramos.
Esta interfaz será implementada por todos los actores con los que queramos interactuar. Cuando el jugador intente interactuar con un objeto, simplemente llamaremos a la función Interact en él, y el objeto sabrá cómo responder.
🌳 Creando Recursos Recolectables (Árbol, Roca, Planta)
Ahora vamos a crear los actores que representarán nuestros recursos en el mundo. Para simplificar, crearemos un Blueprint genérico BP_ResourceBase del que heredarán nuestros recursos específicos.
📦 Blueprint Base de Recurso (BP_ResourceBase)
- En
Content/Gameplay/Actors/, haz clic derecho y seleccionaBlueprint Class. EligeActorcomo clase padre y nómbraloBP_ResourceBase. - Abre
BP_ResourceBase. En la secciónClass SettingsdelDetails Panel, haz clic enAddbajoInterfacesy buscaBPI_Interactable. Compila y guarda. - En la pestaña
Components, añade unStatic Mesh Component(nómbraloResourceMesh) y unBox Collision Component(nómbraloInteractionVolume). - Ajusta el tamaño del
InteractionVolumepara que sea un poco más grande que elResourceMesh. Esto facilitará la interacción. - En el
Event Graph, implementa el eventoInteractde la interfaz:- Haz clic derecho en el
Event Graphy buscaEvent Interactbajo la secciónInterfaces. - Por ahora, simplemente arrastra un cable desde el nodo
Event Interacty añade unPrint Stringcon el texto:"Interacting with: "seguido de unGet Display NamedelSelf. Esto nos permitirá probar la interacción. - Añade una variable de tipo
DataTabley nómbralaResourceDataTable. La usaremos más adelante para definir qué recursos se obtienen. - Añade una variable
ResourceTagde tipoFName. Esta etiqueta definirá el tipo de recurso (madera, piedra, etc.). - Añade una variable
Healthde tipoFloatcon un valor por defecto de 100.0. Este será el "estado" del recurso antes de ser recolectado. - Añade una variable
RequiredToolTagde tipoFName. Por ejemplo,"Axe"para la madera,"Pickaxe"para la piedra. Inicialízalo aNone.
- Haz clic derecho en el
Compila y guarda BP_ResourceBase.
🌳 Creando el Árbol (BP_TreeResource)
- En
Content/Gameplay/Resources/, haz clic derecho enBP_ResourceBasey seleccionaCreate Child Blueprint Class. NómbraloBP_TreeResource. - Abre
BP_TreeResource. - En el
Details Panel, selecciona el componenteResourceMesh. - Asigna un
Static Meshde árbol. Puedes usar los que vienen con el paquete 'Starter Content' o buscar uno en el 'Quixel Bridge' (por ejemplo,SM_Treesi tienes el 'Starter Content'). - Asegúrate de que el
InteractionVolumeenvuelva correctamente el árbol. - En las variables por defecto, establece
ResourceTaga"Wood"yRequiredToolTaga"Axe".
Compila y guarda BP_TreeResource.
🪨 Creando la Roca (BP_RockResource)
- Repite el proceso: haz clic derecho en
BP_ResourceBasey seleccionaCreate Child Blueprint Class. NómbraloBP_RockResource. - Abre
BP_RockResource. - Asigna un
Static Meshde roca (por ejemplo,SM_Rocksi tienes el 'Starter Content'). - Asegúrate de que el
InteractionVolumeenvuelva correctamente la roca. - Establece
ResourceTaga"Stone"yRequiredToolTaga"Pickaxe".
Compila y guarda BP_RockResource.
🌿 Creando la Planta (BP_PlantResource)
- Crea un nuevo hijo de
BP_ResourceBase, nómbraloBP_PlantResource. - Asigna un
Static Meshde planta. Puedes buscarSM_Busho similar. - Establece
ResourceTaga"Fiber"yRequiredToolTagaNone(o"Hand"si quieres especificar que se recolecta a mano).
Compila y guarda BP_PlantResource.
Ahora puedes arrastrar estos actores (BP_TreeResource, BP_RockResource, BP_PlantResource) a tu nivel. ¡Ya tenemos objetos interactuables en nuestro mundo!
🚶 Configuración del Personaje para Interacción
Necesitamos que nuestro personaje pueda detectar objetos interactivos y llamar a la función Interact cuando el jugador pulse un botón. Modificaremos el ThirdPersonCharacter (o el que estés usando).
🔍 Detección de Objetos Interactivos
Para detectar objetos, podemos usar un Line Trace (raycast) o una Sphere Trace desde la cámara o el personaje.
- Abre el Blueprint de tu personaje (ej.
BP_ThirdPersonCharacter). - En el
Event Graph, crea una nueva función, nómbralaTraceForInteractables. - Dentro de
TraceForInteractables:- Necesitamos obtener la posición de la cámara y la dirección a la que apunta. Usa
Get Player Camera Manager>Get Camera LocationyGet Forward Vector. - Calcula el
End Locationdel trace sumando elCamera Location+ (Forward Vector*InteractionDistance). Crea una variableInteractionDistancede tipoFloat(ej. 500 unidades). - Utiliza un nodo
Line Trace By Channel. ConfiguraTrace Startcon elCamera LocationyTrace Endcon elEnd Locationcalculado. EstableceTrace ChannelaVisibility. ActivaDraw Debug TypeaFor Duration(para ver el rayo en el editor).Ignore Selfpara que no colisione con el propio personaje. - Desde el
Out HitdelLine Trace, haz unBreak Hit Result. - Arrastra desde
Hit Actory haz unDoes Implement InterfaceparaBPI_Interactable. Esto verificará si el actor golpeado es interactuable. - Guarda el
Hit Actoren una variableCurrentInteractableActor(tipoActor Reference). Si el trace no golpea nada o el objeto no implementa la interfaz, seteaCurrentInteractableActoraNone.
- Necesitamos obtener la posición de la cámara y la dirección a la que apunta. Usa
⌨️ Input de Interacción
Ahora, necesitamos asignar una tecla para la interacción y llamar a nuestra función de trace.
- Ve a
Edit>Project Settings>Input. - Bajo
Action Mappings, añade un nuevoAction Mappingy nómbraloInteract. Asigna una tecla, por ejemplo, E. - En el
Event Graphde tu personaje, buscaInput Action Interact. - Desde el pin
PresseddeInput Action Interact:- Llama a la función
TraceForInteractables. - Después, haz un
IsValidparaCurrentInteractableActor. - Si es válido, arrastra desde
CurrentInteractableActory llama alInteract Message(esto es la funciónInteractde la interfaz).
- Llama a la función
Para que la detección de interactuables sea continua, puedes llamar a TraceForInteractables en el Event Tick de tu personaje, pero es más eficiente hacerlo cada cierto tiempo o solo cuando el jugador se mueve o el input de interacción es presionado. Por ahora, para simplificar, la llamaremos en el Interact Pressed.
Compila y guarda tu Blueprint de personaje. Ahora, cuando ejecutes el juego y apuntes a un árbol, una roca o una planta y pulses E, deberías ver el mensaje "Interacting with: BP_TreeResource_C_0" (o el nombre del recurso) en la pantalla.
📊 Data Tables para Recursos y Herramientas
Para manejar de manera eficiente los datos de los recursos que podemos recolectar (qué objeto da qué, la cantidad, el sonido, etc.) y las herramientas necesarias, utilizaremos Data Tables.
📝 Estructura de Datos para Recursos (FResourceData)
- En
Content/Gameplay/, haz clic derecho y seleccionaBlueprints>Structure. NómbralaFResourceData. - Abre
FResourceDatay añade las siguientes variables:ItemTag(FName): Una etiqueta única para el recurso recolectado (ej. "WoodLog", "StoneChunk").Amount(Int): La cantidad de este recurso que se obtiene (ej. 1, 2, 3).MinAmount(Int): Cantidad mínima a obtener. (Por ejemplo, para un rango aleatorio)MaxAmount(Int): Cantidad máxima a obtener.RequiredToolTag(FName): La etiqueta de la herramienta necesaria (ej. "Axe", "Pickaxe").DamagePerHit(Float): El daño que este recurso recibe por golpe de la herramienta correcta.MeshToDrop(Static Mesh Reference): Un Static Mesh que podría caer al suelo al recolectar.SoundOnHit(Sound Wave Reference): Sonido al golpear el recurso.SoundOnDestroy(Sound Wave Reference): Sonido al destruir/recolectar el recurso.
Compila y guarda FResourceData.
📚 Data Table de Recursos (DT_Resources)
- En
Content/Gameplay/Data/, haz clic derecho y seleccionaMiscellaneous>Data Table. - En el selector de
Row Structure, busca y seleccionaFResourceData. - Nómbrala
DT_Resources. - Abre
DT_Resourcesy añade filas para los diferentes tipos de recursos que obtendremos:
| Row Name (FName) | ItemTag (FName) | MinAmount | MaxAmount | RequiredToolTag | DamagePerHit | MeshToDrop | SoundOnHit | SoundOnDestroy |
|---|---|---|---|---|---|---|---|---|
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
Tree_Wood | WoodLog | 1 | 3 | Axe | 25.0 | (Asignar SM) | (Asignar SW) | (Asignar SW) |
Rock_Stone | StoneChunk | 1 | 3 | Pickaxe | 33.0 | (Asignar SM) | (Asignar SW) | (Asignar SW) |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
Plant_Fiber | Fiber | 2 | 5 | None | 50.0 | (Asignar SM) | (Asignar SW) | (Asignar SW) |
🛠️ Estructura de Datos para Herramientas (FToolData)
Vamos a crear una estructura similar para definir las herramientas.
- En
Content/Gameplay/, crea otraStructurey nómbralaFToolData. - Abre
FToolDatay añade:ToolTag(FName): Etiqueta única para la herramienta (ej. "Axe", "Pickaxe", "Hand").DamageBonus(Float): Daño adicional que la herramienta aplica (ej. 1.0 para el puño, 10.0 para un hacha básica).Durability(Float): Durabilidad de la herramienta. (No la implementaremos en este tutorial, pero es buena idea tenerla).
Compila y guarda FToolData.
📚 Data Table de Herramientas (DT_Tools)
- Crea otra
Data TableenContent/Gameplay/Data/, seleccionandoFToolDatacomoRow Structure. - Nómbrala
DT_Tools. - Añade filas para tus herramientas básicas:
| Row Name (FName) | ToolTag (FName) | DamageBonus |
|---|---|---|
| --- | --- | --- |
Hand | None | 1.0 |
BasicAxe | Axe | 10.0 |
| --- | --- | --- |
BasicPickaxe | Pickaxe | 10.0 |
Ahora tenemos una base de datos de nuestros recursos y herramientas. Con esto, podemos hacer que nuestro sistema sea mucho más flexible y fácil de balancear.
🔄 Lógica de Recolección y Daño en el Recurso Base
Regresemos a BP_ResourceBase para implementar la lógica principal de recolección, aplicando el concepto de interacciones contextuales.
🔨 Actualizando el Evento Interact en BP_ResourceBase
-
Abre
BP_ResourceBase. En elEvent Graph, borra elPrint Stringque teníamos. -
El evento
Interactnecesitará información sobre quién está interactuando y qué herramienta usa. Modifica la funciónInteractenBPI_Interactableañadiendo unInput Parameter:Instigator(Actor Reference): Quién está interactuando.EquippedToolTag(FName): La etiqueta de la herramienta que el instigador tiene equipada.- Importante: Después de modificar la interfaz, vuelve a
BP_ResourceBasey verás que el nodoEvent Interactse ha actualizado con los nuevos pines. Si no se actualiza, bórralo y vuelve a añadirlo.
-
Dentro del
Event InteractenBP_ResourceBase, implementa la siguiente lógica:- Verificar la herramienta correcta:
- Obtén el
RequiredToolTagde este recurso. - Compara el
EquippedToolTagdelInstigatorcon elRequiredToolTagdel recurso (==nodo). - Usa un
Branchcon esta condición.
- Obtén el
- Si la herramienta es correcta (True):
- Aplicar daño: Resta
DamagePerHit(obtenido delDT_ResourcesusandoResourceTagcomoRow NameyEquippedToolTagpara obtener el bonus de daño) a la variableHealth. - Reproduce
SoundOnHit(si existe). - Comprobar salud: Si
Healthes<= 0:- Llama a la función
Destroy Resource(que crearemos a continuación).
- Llama a la función
- Aplicar daño: Resta
- Si la herramienta NO es correcta (False):
- Puedes mostrar un
Print Stringcomo "Necesitas un hacha para esto" o reproducir un sonido de "error". - También podríamos aplicar un daño reducido si el jugador usa las manos desnudas (ToolTag
None). Para esto, tendrías que obtenerDamageBonusdeDT_ToolsusandoEquippedToolTag.
- Puedes mostrar un
- Verificar la herramienta correcta:
-
Función
Destroy Resource:- Crea una nueva función en
BP_ResourceBase, nómbralaDestroyResource. - Dentro de
DestroyResource:- Obtén la fila de datos (
FResourceData) deDT_Resourcesusando elResourceTagde este recurso. - Generar recursos para el inventario: Genera un número aleatorio de
ItemTagentreMinAmountyMaxAmount(Random Integer in Range). - Llama a una función en el
Instigator(el jugador) para añadir estos ítems a su inventario (ej.AddToInventory- la implementaremos después). - Reproduce
SoundOnDestroy(si existe). - Si
MeshToDropestá asignado, puedes spawnear ese Static Mesh como un objeto pickeable en el mundo. - Finalmente, destruye el actor:
Destroy Actor(Self).
- Obtén la fila de datos (
- Crea una nueva función en
Compila y guarda BP_ResourceBase.
➕ Mejoras en la Lógica de Daño (Opcional pero recomendado)
Podemos hacer el daño más dinámico dependiendo de la herramienta. Necesitamos que el Interact reciba el DamageBonus de la herramienta equipada.
- Modifica
BPI_Interactablede nuevo. Añade un parámetroToolDamageBonus(Float) a la funciónInteract. - En
BP_ResourceBase(Event Interact): Obtén elDamagePerHitde laFResourceDatay multiplícalo porToolDamageBonus. Este será el daño total aplicado a laHealth.
🎒 Integración con un Inventario Básico
Para que la recolección sea útil, necesitamos un lugar donde guardar los ítems. Implementaremos un sistema de inventario muy básico en nuestro personaje.
📦 Estructura de Ítem (FInventoryItem) y Data Table para Ítems
Para definir los ítems que se añaden al inventario, crearemos otra Structure y Data Table.
-
Crea una
StructureenContent/Gameplay/llamadaFInventoryItem. -
Añade:
ItemTag(FName): La etiqueta única del ítem (ej. "WoodLog", "StoneChunk").DisplayName(Text): Nombre para la UI (ej. "Tronco de Madera").Description(Text): Descripción del ítem.Icon(Texture 2D Reference): Icono para la UI.MaxStackSize(Int): Cuántos ítems pueden acumularse en un solo slot (ej. 99).IsStackable(Bool): Si el ítem puede apilarse.ToolType(FName): Si es una herramienta, qué tipo de herramienta (ej. "Axe").
-
Crea una
Data TableenContent/Gameplay/Data/llamadaDT_Items, conFInventoryItemcomoRow Structure. -
Añade entradas para
WoodLog,StoneChunk,Fiber,BasicAxe,BasicPickaxe, etc.
| Row Name (FName) | ItemTag (FName) | DisplayName | Description | Icon | MaxStackSize | IsStackable | ToolType |
|---|---|---|---|---|---|---|---|
| --- | --- | --- | --- | --- | --- | --- | --- |
WoodLog | WoodLog | Tronco de Madera | Madera básica. | (Tex) | 99 | True | None |
StoneChunk | StoneChunk | Trozo de Piedra | Piedra básica. | (Tex) | 99 | True | None |
| --- | --- | --- | --- | --- | --- | --- | --- |
BasicAxe | BasicAxe | Hacha Básica | Corta árboles. | (Tex) | 1 | False | Axe |
🎒 Lógica de Inventario en el Personaje
-
Abre el Blueprint de tu personaje (
BP_ThirdPersonCharacter). -
Crea una variable
Inventoryde tipoMap(Mapa).- La
Key TypeseráFName(paraItemTag). - La
Value TypeseráInt(para la cantidad de ítems).
- La
-
Crea una función, nómbrala
AddToInventory.- Entradas:
ItemTag(FName),Amount(Int). - Dentro de la función:
- Haz un
Map FindenInventoryconItemTagpara ver si el ítem ya existe. - Si existe: Obtén la cantidad actual, súmale
Amount, y luego haz unMap Setcon elItemTagy la nueva cantidad. - Si no existe: Haz un
Map Addcon elItemTagy elAmount. - Puedes añadir un
Print Stringpara confirmar que se añadió el ítem (ej."Added " + Amount + " " + ItemTag + " to inventory.").
- Haz un
- Entradas:
-
Crea una variable
EquippedToolde tipoFName(con un valor por defecto de"Hand"). Esta representará la herramienta actualmente equipada.
🔄 Conectando el Recurso al Inventario
- Regresa a la función
DestroyResourceenBP_ResourceBase. - Cuando vayas a añadir el ítem al inventario, en lugar de un
Print Stringo unSpawnActor, arrastra desde el pinInstigatory haz unCast To BP_ThirdPersonCharacter. - Desde el pin
As BP Third Person Character, llama a la funciónAddToInventoryque acabamos de crear, pasándole elItemTagy la cantidad aleatoria calculada.
Compila y guarda ambos Blueprints.
Ahora, cuando "destruyas" un árbol, deberías ver los mensajes de que los troncos de madera se han añadido a tu inventario. ¡Progreso!
🔧 Implementando Herramientas y Equipamiento (Mínimo)
Para que nuestro sistema de RequiredToolTag funcione, el personaje necesita poder "equipar" herramientas.
🧰 Función EquipTool en el Personaje
- En el Blueprint de tu personaje, crea una nueva función
EquipTool.- Entrada:
ToolItemTag(FName). - Dentro de la función:
- Obtén la
FInventoryItemdeDT_ItemsusandoToolItemTagcomoRow Name. - Asegúrate de que el ítem sea realmente una herramienta (
ToolTypeno seaNone). - Si es una herramienta, setea la variable
EquippedToolaToolItemTag. - Puedes mostrar un
Print Stringcomo "Equipped: " +DisplayName.
- Obtén la
- Entrada:
⚔️ Usando la Herramienta Equipada en la Interacción
- Vuelve al
Input Action Interacten tu personaje. - Cuando llamas al
Interact Messageen elCurrentInteractableActor, ahora necesitas pasar elEquippedToolde tu personaje como elEquippedToolTagy también elToolDamageBonus. - Para obtener el
ToolDamageBonus:- Obtén la
FInventoryItemdeDT_ItemsusandoEquippedToolcomoRow Name. - Obtén el
ToolTypede esaFInventoryItem. (Si elEquippedTooles"Hand", elToolTypeseráNone). - Obtén la
FToolDatadeDT_Toolsusando esteToolType(o"Hand"si esNone). - Pasa el
DamageBonusde esaFToolDataal pinToolDamageBonusdelInteract Message.
- Obtén la
Compila y guarda tu personaje Blueprint.
✨ Pulido y Mejoras Adicionales
Nuestro sistema ya es funcional, pero siempre hay espacio para mejoras y pulido.
🔊 Feedback Visual y Sonoro
- Sonidos: Asegúrate de asignar sonidos de golpe y destrucción en tus
DT_Resources. - Partículas: Puedes añadir
Particle System ComponentsaBP_ResourceBaseo spawnearParticle Systemsal golpear o destruir el recurso. Por ejemplo, chispas para la roca, hojas para el árbol. - Animaciones: El personaje podría tener una animación de "corte de hacha" o "pico" al interactuar. Esto requeriría una
Montagey llamarla en elInput Action Interactantes de la llamada alInteract Message. - Feedback de UI: Mostrar un pequeño mensaje "+3 Wood Log" o un icono flotante sobre el recurso.
📈 Reaparición de Recursos
Los recursos recolectados actualmente desaparecen para siempre. Para un juego de supervivencia, es común que reaparezcan.
- En
BP_ResourceBase, en la funciónDestroyResource, en lugar deDestroy Actor, puedesSet Actor Hidden In GameaTrueySet Actor Enable CollisionaFalse. - Inicia un
Timer By Eventdespués de un retardo (ej. 300 segundos). - Cuando el temporizador expire, el evento del temporizador puede
Set Actor Hidden In GameaFalse,Set Actor Enable CollisionaTrue, y resetear laHealthdel recurso a su valor inicial.
🔄 Variaciones de Recursos
Considera tener diferentes niveles de recursos (ej. "Madera Dura", "Piedra de Hierro"), cada uno con su propia entrada en DT_Resources y quizás requiriendo herramientas de mayor nivel.
🏃 Limitaciones de Inventario
Nuestro inventario actual es ilimitado. Puedes añadir límites por peso o por número de slots para hacer el juego más desafiante. Esto implicaría modificar la función AddToInventory para verificar si hay espacio antes de añadir ítems.
🌐 Multijugador (Consideraciones)
Si tu juego es multijugador, la interacción y la recolección deben replicarse. BP_ResourceBase necesitaría estar configurado como Replicated y las funciones de daño y destrucción deberían ejecutarse en el servidor (Run On Server).
Ejemplo de Lógica de Reaparición de Recursos (Pseudocódigo en Blueprint)
// En BP_ResourceBase
// Event BeginPlay: Guardar la salud inicial y visibilidad
InitialHealth = Health;
InitialVisibility = ResourceMesh.IsVisible();
// Funcion ResetResource (llamada por Timer)
Set Hidden in Game (ResourceMesh, False);
Set Collision Enabled (ResourceMesh, CollisionEnabled);
Health = InitialHealth;
// Funcion DestroyResource (modificada)
Set Hidden in Game (ResourceMesh, True);
Set Collision Enabled (ResourceMesh, NoCollision);
Start Timer By Event (ResetResource, RespawnTimeVariable, False);
// ... lógica de añadir al inventario ...
✅ Conclusión
¡Felicidades! Has construido un sistema de caza y recolección dinámico y extensible en Unreal Engine utilizando Blueprints. Hemos cubierto la detección de interacción, la lógica contextual basada en herramientas, el uso de Data Tables para la configuración de recursos y herramientas, y una integración básica con un sistema de inventario.
Este sistema proporciona una base sólida sobre la cual puedes construir mecánicas más complejas, como la crafteo, la progresión de habilidades relacionadas con la recolección, y un inventario visual con UI. La clave ha sido el uso de interfaces y Data Tables, que permiten una gran flexibilidad y escalabilidad para tu proyecto. ¡Ahora sal y haz que tus jugadores exploren, recolecten y sobrevivan en tus mundos de Unreal Engine!
Nivel de Dificultad: Intermedio
Tutoriales relacionados
- Unreal Engine: Creando un Sistema de Puzzles de Bloques Deslizantes con Blueprintintermediate20 min
- Unreal Engine: Creando Interactividad con el Sistema de Interacciones Basado en Componentesintermediate15 min
- Unreal Engine: Creando un Sistema de Inventario Dinámico con UMG y C++intermediate25 min
- Creación de un Sistema de Progresión de Habilidades (Skill Tree) en Unreal Engine 5intermediate18 min
- Unreal Engine: Creación de un Sistema de Daño y Puntos de Golpe (HP) con Blueprintintermediate20 min
Comentarios (0)
Aún no hay comentarios. ¡Sé el primero!