Perqué son útils els Blueprints Interface per fer botons?

Per fer botons, he fet alguns Blueprints complexos amb molta lògica per aconseguir bons efectes i jugabilitat. En aquest vídeo de Youtube podeu veure el resultat:

Botons - Vista prèvia de funcions

Per fer-los vaig fer una estructura d'herència similar a la que he fet amb els llums, així tinc les mateixes característiques de llum als meus botons: soroll, espurnes, llum, etc. No aniré pas a pas perquè els meus Blueprints de botons són molt complexos, però explicaré les idees generals sobre les "interfícies de Blueprints" que em permeten fer la interacció dels botons.

PER QUÈ NECESSITO BLUEPRINT INTERFACES?

Ara tinc un nou problema: qualsevol botó del meu joc pot interactuar amb qualsevol altre objecte o objectes. Per exemple: un botó pot encendre o apagar un grup de llums a una habitació, activar un esdeveniment com girar una vegada una porta giratòria, etc.

Les portes i els llums són objectes molt diferents, i dins de tots dos poden existir molts subtipus de portes i llums. Aleshores necessito algun tipus de mecanisme per permetre que un botó reconegui qualsevol objecte en el joc i executi la seva lògica.

A l'altra banda tindrem un botó que el jugador pot pressionar amb el personatge del joc. Un botó pot ser un objecte que pot variar des dun simple botó fins a un interruptor amb diferents malles, efectes, llums, etc. Per tant, també necessitem un mecanisme perquè el joc reconegui un botó i faci que el personatge del jugador el pressioni quan apretem el botó d'acció al nostre teclat, controlador, etc.

Aquí és on una "Interfície Blueprint" ens pot ajudar.

Una "Interfície Blueprint" és un tipus especial de Blueprint que no es pot instanciar i no pot tenir cap lògica interna, però ha de tenir almenys una declaració de funció. Podem definir qualsevol funció que necessitem amb les entrades i sortides de dades.

Aleshores podem aplicar aquesta "Interfície Blueprint" a qualsevol altre "Blueprint" i aquest tindrà els mètodes de la seva interfície, després hem d'especificar la lògica a aplicar per a cada funció d'interfície en aquest "Blueprint". Això ens permet fer un comportament diferent a cada "Blueprint" per a la mateixa funció.

Per exemple: faré una interfície d'interruptor que em permeti executar una funció en un objecte de joc anomenat "BPI_BooleanSwitchable" per encendre o apagar una llum, una màquina, un motor, etc. Dins d'aquesta interfície tenim una funció anomenada "Switch".

exemple d'interfície de botons de blueprint

Puc utilitzar aquesta interfície en portes i llums i després un botó pot convertir qualsevol d'aquests objectes a "BPI_BooleanSwitchable" i iniciar la seva funció "Switch" quan el jugador pressiona el botó.

COM ACTIVO UN BOTÓ (o alguna cosa) AL JOC?

En primer lloc, vaig afegir un nou col·lisionador al meu personatge per detectar objectes interactius anomenat "InteractableCollider":

caracters de botons blueprint

Quan un objecte que té la interfície BPI_Interactable és dins del col·lisionador, aleshores es pot activar. Aleshores, quan el jugador pressiona el botó d'acció al controlador i si hi ha un objecte dins del col·lisionador interactiu, intenta convertir-lo en un objecte BPI_Interactable i llançar la seva lògica.

Aquest és el detall de la lògica de l'objecte del meu personatge Blueprint:

botons blueprint caràcter 2

El BPI_Interactable és una interfície de Blueprint que té el mètode "Interactuate" per activar un botó, agafar un objecte o el que necessiteu fer. Si es un botó, activareu la lògica d'altres objectes associats al botó. Després faig servir la interfície BPI_Interactable per crear botons com el meu BP_Base_Button.

DES D'UN BOTÓ COM ACTIVO ALTRES LÒGIQUES D'OBJECTES?

Llavors necessito objectes que responguin al botó però no al jugador com, per exemple, una màquina que comença a funcionar quan l'activem. Cada botó té una sèrie dobjectes que es poden activar, per reconèixer-los, cada objecte tindrà una interfície BPI_Triggerable.

Aquesta interfície té un mètode que és útil per activar els objectes: el mètode Launch. Quan el jugador pressiona el botó, el botó projecta els seus objectes activables a BPI_Triggerable i després cada objecte executa la seva pròpia lògica.

Aquí mostro la lògica del botó BP_Base_Button. Perquè sigui fàcil d'entendre, oculto tota la lògica sobre fer sorolls, llums, etc. i només mostro la part important de la lògica del botó:

disparador de botons blueprint

Com podeu veure al final, executo una funció de "Launch" dins l'objecte BPI_Triggerable.

Aquest és un bon punt de partida per fer botons més complexos.

QUÈ PASSA AMB EL BOTÓ DE TIPUS INTERRUPTOR?

El botó interruptor és útil per a coses que poden tenir dos estats, per exemple seran coses com llums o altres botons que poden estar actius o no, portes que poden estar obertes o tancades, etc. Per aconseguir-ho vaig fer una interfície BPI_BolleanSwitchable que té la funció "Switch".

El meu interruptor és una evolució del meu botó base BP_Base_Button anomenat BP_Base_Switch. Anul·larà (override) la funció LaunchObjectLogic gràcies a l'herència i, en lloc d'objectes BPI_Triggerable, llançarà objectes BPI_BooleanSwitchable. Però aquest és un botó especial que acollirà l'estat de les coses que estaran actives o no, per tant primer hem de modificar el nostre BP_Base_Button novament.

Vaig afegir una funció de "Update" que serà útil per fer modificacions quan premeu el botó. Al BP_Base_Button, aquesta funció romandrà invàlida perquè no necessito fer res en aquest punt i serà útil només per ser anul·lada (override) per Blueprints fills.

Aquesta imatge mostra les parts importants de la lògica del botó:

botons blueprint activen 2

Com es pot veure, entre l'inici i el final d'aquest procés truco a la funció "Update" perquè si vull fer modificacions a les dades del botó, és obligatori fer-ho abans que intentem llançar les lògiques dels objectes.

Ara vaig fer el BP_Base_Switch i en aquest Blueprint vaig configurar l'herència per tenir el BP_Base_Button com a Blueprint pare i això vol dir que ja tinc tota la lògica que hem vist abans i la interfície BPI_Interactable aplicada.

Llavors vaig anul·lar les funcions (override) Update i LaunchObjectLogic:

interruptor de botons blueprint

L'important en el mètode Update és que canvia l'estat booleà de l'interruptor i al LaunchObjectLogic en lloc del BPI_Triggerable estan projectant BPI_BooleanSwitchable. També envia l'estat de l'interruptor a l'objecte mitjançant la funció Switch.

ESQUEMA

Per mirar de veure tot això una mica més clar fes un cop d'ull a aquest esquema. És una representació daquest mecanisme dinteracció i botons:

botons blueprint final