3. Construye una cartera real con una interfaz que puedas pulsar
Construye este ejemplo en tu proyecto de Unreal y comprueba el resultado en cada paso.
En esta página
Crearás una interfaz UMG con botones para producir recursos y comprar. Cada operación actualizará el saldo y mostrará si la compra se ha podido realizar.
Preparar el actor propietario
- En Blueprints crea otro Actor llamado BP_MiCartera. Ábrelo.
- En Components pulsa Add y busca Scientific Number Value Component. Nombra el componente Wallet. Arrástralo al Event Graph como Get.
- Desde su referencia añade Try Set Value; asegúrate de que Target está conectado a Wallet.
- Añade Make Scientific Number con Base 1000, Exponent 0 y conéctalo a New Value. Conecta BeginPlay a Try Set Value. Añade Branch con su Return Value. Resultado esperado: True y Out Error = No Error. El valor 1000 × 10^0 se normaliza a Base 1, Exponent 3; normalizar no es un error.
- La rama False es el manejo de un posible fallo, no el resultado esperado con 1000. Conecta False a Print Scientific Number Error, Out Error a Error y Context =
Inicializar Wallet. En True continúa con la interfaz. No continúes por False con un saldo que no se inicializó.
Crear los botones y el texto
- En la carpeta UI: botón derecho → User Interface → Widget Blueprint. Usa User Widget y nómbralo WBP_MiCartera.
- Ábrelo en Designer. Añade un Canvas Panel si no tiene raíz. Añade dentro un Vertical Box, céntralo con el preset de anclas y activa Size to Content si necesitas ajustar su tamaño.
- Dentro de Vertical Box añade un Text Block llamado TXT_Saldo. Activa Is Variable. Dale un tamaño legible, por ejemplo 28.
- Añade otro Text Block, TXT_Estado, con Is Variable activado. Será el lugar para mostrar el rechazo de una compra.
- Añade dos Button, llamados BTN_Producir y BTN_Comprar. Pon dentro un Text Block con
Producir +25yComprar −100respectivamente. - En Graph crea una variable Cartera, de tipo BP_MiCartera → Object Reference. Activa Instance Editable y Expose on Spawn. Compila el widget.
Mostrar el widget
- Vuelve a BP_MiCartera. Desde la rama True de la inicialización añade Create Widget, Class WBP_MiCartera.
- Conecta Get Player Controller a Owning Player. En el pin Cartera del Create Widget conecta Self.
- Si no aparece Cartera, comprueba Expose on Spawn, compila el widget y usa Refresh Node o vuelve a crear Create Widget.
- Conecta Return Value del Create Widget a Add to Viewport.
- Usa Set Input Mode Game and UI, con Get Player Controller conectado al pin Player Controller y el widget creado en In Widget to Focus. En el Player Controller establece Show Mouse Cursor = true.
- No pongas un segundo Set Value al final: la cartera debe conservar el saldo a través de los clics.
Leer el saldo desde la interfaz
- Abre WBP_MiCartera, pestaña Graph. Crea una función llamada ActualizarSaldo.
- Arrastra Cartera como Get. Desde ella obtén Wallet. Desde Wallet añade Get Value.
- Conecta el valor a To Fixed String, Decimal Places 2. Conecta el texto a Set Text (Text) cuyo Target sea TXT_Saldo. Unreal puede insertar la conversión String → Text.
- Conecta la entrada blanca de la función a To Fixed String y de ahí a Set Text. Compila.
- En EventGraph conecta Event Construct → ActualizarSaldo. La referencia Cartera ya se entrega al crear el widget.
Programar los botones
- En Designer selecciona BTN_Producir. En Details → Events pulsa + OnClicked. Unreal abre su evento en Graph.
- Desde Cartera → Wallet llama a Try Add, Amount = Make Scientific Number 25. Conecta OnClicked al nodo y después a Branch con Return Value.
- En True limpia TXT_Estado con Set Text vacío y llama a ActualizarSaldo. En False muestra un mensaje de fallo y revisa Out Error. No simules el saldo cambiando solo el texto.
- Crea OnClicked de BTN_Comprar. Obtén Wallet → Get Value y conecta el resultado a Can Afford, Resources Available. Price = Make Scientific Number 100.
- Conecta OnClicked a Branch con el resultado de Can Afford. En False, conecta Print Scientific Number Error: Out Error → Error, Context =
Comprary No Error Message =Saldo insuficiente. Con saldo 25 y precio 100, Can Afford devuelve False / No Error y el Print muestraComprar: Saldo insuficiente. Un error real tiene prioridad sobre No Error Message. Mantén este Print en la rama False: si se ejecuta también al tener éxito, imprimirá igualmente el texto alternativo. Para un mensaje en el widget, actualiza además TXT_Estado; Print es solo de desarrollo. Can Afford compara saldo y precio, no ejecuta ni simula la resta. - Obtén la referencia Cartera → Wallet y arrastra desde su pin azul de objeto para buscar Try Subtract. Es un método de Scientific Number Value Component (Normal): al buscar desde el cable blanco del Branch, el menú contextual puede no mostrarlo. Conecta Wallet a Target, True → ejecución de Try Subtract, y Make Scientific Number 100 a Amount. Comprueba Return Value con otro Branch; solo tras éxito limpia el estado y llama a ActualizarSaldo. No sustituyas esto por Try Add con -100 mientras Idle esté activo: el número negativo se rechaza al construirlo; Try Subtract recibe el precio positivo.
- Compila ambos assets y guarda. En el nivel elimina solo la instancia de BP_MiNumero que colocaste, o desactiva su prueba; no borres el asset. Coloca una única instancia de BP_MiCartera.
- Ejecuta y haz clic dentro del juego. Debes tener dos botones y un saldo inicial de 1000.00.
Usa tu cartera
| Lo que haces tú | Lo que debería ocurrir |
|---|---|
| Pulsa Producir una vez | 1025.00 |
| Después pulsa Comprar una vez | 925.00 |
| Detén Play y vuelve a ejecutarlo | 1000.00: esta cartera aún no guarda partida |
| Compra diez veces desde 1000 | 0.00 |
| Compra una vez más | Sigue 0.00 y aparece Saldo insuficiente |
| Produce cuatro veces y compra | Vuelve a 0.00 y desaparece el mensaje anterior |
| Añade breakpoint a Try Subtract | Ves la llamada del botón y el componente que cambia |
Para adaptar la interfaz a tu juego, puedes mantener el botón de compra activo y explicar el rechazo en TXT_Estado, o desactivarlo cuando no haya saldo suficiente. Comprueba el saldo al ejecutar la compra aunque el botón ya refleje su disponibilidad.