Input avanzato
Input avanzato è un plugin di prima parte creato da Epic Games che utilizziamo in Parrot. Se stai usando la versione più recente di Unreal Engine 5, dovrebbe essere abilitato per impostazione predefinita. Puoi verificare che sia abilitato andando su Modifica > Plugin e spuntando la casella.
L'Input avanzato sostituisce il sistema di input predefinito di Unreal Engine e rappresenta lo standard per la gestione complessa degli input o la rimappatura di controllo del runtime. La documentazione ufficiale di Epic Games offre una panoramica eccellente in merito al sistema, oltre a informazioni su come configurare gli asset di input.
Concetti chiave
Secondo la documentazione ufficiale, i concetti chiave dell'Input avanzato da comprendere sono i seguenti:
Azioni di input
Contesti di mappatura degli input (IMC)
Modificatori input
Trigger input
Se hai utilizzato il nuovo sistema di input di Unity, questi concetti dovrebbero essere familiari.
Le Azioni di input si possono immaginare al meglio come "gli effetti dell'azione che sarà eseguita nel gioco" in un contesto particolare del gioco. Ad esempio, se il tuo personaggio si trova in un'auto, dovrai rendere disponibili le azioni di accelerazione o frenata.
Questo esempio si applica anche ai contesti di mappatura degli input. Se il giocatore entra o esce dall'auto, potrebbe essere necessario modificare le azioni di certi tasti o pulsanti del controller.
I trigger input impediscono alle azioni di essere eseguite a meno che non siano soddisfatte tutte le condizioni di attivazione. Ad esempio, potrebbe essere utile che il giocatore tenga premuto un pulsante per un certo periodo di tempo al fine di attivare un'azione.
I Modificatori input alterano il valore dell'input stesso. Le zone morte sono un comune modificatore input usate per semplificare i valori di input grezzi. L'Input avanzato risolve tutti questi problemi per te, basta configurarlo.
Vediamo un esempio in Parrot. In Content/Input/Gameplay troverai una cartella Actions e un file di asset IMC_Gameplay. Nella cartella Actions, individua l'asset IA_Jump.
Il tipo di valore qui è Digital (bool) che indica il tipo di output di questa azione. Sotto i trigger troverai i seguenti tipi:
Premuto
Rilasciato
Potremmo quindi dire che questa azione di input debba attivarsi tramite una pressione e avere uno stato di output booleano. Il rilascio del pulsante attiva la fine dell'azione. Un altro importante dettaglio da osservare è che sia i trigger sia i modificatori possono essere sovrascritti da un contesto di mappatura di input. Diamo uno sguardo al contesto di mappatura input del gameplay per vedere l'override del modificatore in pratica.
IA_MoveAxis non è collegato ad alcun trigger, dunque il valore dell'asse X della levetta sinistra del gamepad viene immediatamente letto quando è rilevata una modifica. Per semplificare i valori di input grezzi, utilizziamo un modificatore della Zona morta per impostare i limiti superiori e inferiori dell'input.
Un esempio in cui non forniamo un override nell'IMC è la mappatura del salto.
Qui noterai che il trigger proviene dall'azione di input stessa, quindi non occorre definire un trigger sulla mappatura. Anche le impostazioni sono ereditate dall’azione, ma puoi ignorare questo aspetto per ora poiché sarà trattato nella sezione della rimappatura.
Ascoltatori evento Input avanzati
Ora che hai gestito gli asset, devi effettuare una configurazione per l'utilizzo del runtime. In Parrot, associamo al Sottosistema giocatore locale input avanzati per configurare i nostri ascoltatori di evento in BP_ParrotPlayerController. Fuori dal nodo BeginPlay aggiungiamo un contesto di mappatura per IMC_Gameplay.
Il parametro priorità è importante in questo caso. I contesti di mappatura degli input sono valutati in base alla loro priorità quindi tienilo a mente quando stratifichi i contesti. Per ora, userai semplicemente il contesto del gameplay.
Tieni presente il parametro Notify User Settings impostato qui su true: sarà necessario per la rimappatura degli input del runtime.
Con il contesto di mappatura pronto, restano solo da aggiungere i nodi evento di input avanzati sulle azioni che ti interessano. Ecco un esempio di salto:
L’azione inizia quando il giocatore preme il pulsante e si completa quando il giocatore rilascia il pulsante. Osserva il resto delle azioni di input in BP_ParrotPlayerController per vedere come sono elaborati altri tipi di input. Puoi anche associare eventi di input in C++ se preferisci, argomento trattato nella documentazione ufficiale.
Rimappatura degli input del runtime
L'Input avanzato ha la capacità di rimappare i tasti legati ad azioni di input durante la loro esecuzione. Vale la pena notare che la funzione, nonostante sia efficace, è ancora in fase sperimentale. Sii cauto quando cerchi di implementarla. In Parrot, è disponibile la schermata Scorciatoie da tastiera che permette al giocatore di rimappare i tasti. Ciò è reso possibile dall'unione di Input avanzato e del plugin UI comune di Epic Games che fornisce i metadati corretti ai widget della schermata. La configurazione della UI comune viene trattata nella documentazione Interfaccia utente. Consigliamo di leggere quella sezione prima di procedere oltre. Con quel plugin configurato, puoi anche visualizzare elementi UI specifici della piattaforma.
Per iniziare, abilita le impostazioni utente per Input avanzato nelle impostazioni del progetto. Lo potrai trovare in Modifica > Impostazioni progetto > Motore > Input avanzato. Configura le impostazioni come segue
Successivamente, vai all’asset Azione di input e regola Impostazioni tasti mappabili giocatore. Il campo Nome deve essere univoco per tutte le azioni di input. Nome visualizzato e Categoria sono localizzati in Parrot.
Puoi anche eseguire l'override di Impostazioni tasti mappabili giocatore quando definisci un tasto in un IMC. Abbiamo impostato l'azione del salto nell'IMC di gameplay come "Eredita impostazioni da azione", cosicché non siano richiesti ulteriori interventi.
Assicurati che, quando aggiungi il contesto di mappatura input sulla blueprint del controller del giocatore, il parametro Notify User Settings sia impostato su true.
La prossima sezione illustrerà come legare le azioni di input avanzato con l'UI comune. Parleremo di ciò che è richiesto per la Rimappatura di input in Parrot, ma questa documentazione è un supplemento della guida rapida UI Comune ufficiale.
Per il passaggio successivo, abbiamo creato un nuovo IMC: IMC_UI_Generic inr Content/Input/UI.
Devi impostare il campo Impostazioni tasti mappabili giocatore su ciascuna azione di input e segnalarlo all'asset di dati e metadati dell'UI pertinente. Ecco un esempio dell’azione di input generica Accetta e dell'asset di metadati stesso.
Queste azioni IMC e di input sono necessarie affinché la UI comune conosca le azioni invocate dalla navigazione dell'UI. Un esempio lampante lo ritroviamo nelle azioni di input Accetta e Indietro, poiché i giocatori dovranno sempre invocarle quando navigano le schermate dell'UI. Definiamo queste mappature in una blueprint di dati specifica CommonUI, sottoclasse di CommonUIInputData.
A questo punto, in Modifica > Impostazioni progetto > Impostazioni di input comuni, imposta i dati di input sulla blueprint di dati di input generica.
Ora che hai gestito i campi più importanti, puoi passare all'impostazione delle schermate dei widget. Inizi con una classe di Schermo Parrot di base per le schermate statiche e una attivabile per le altre. Un esempio di schermata statica è l'HUD, in cui la navigazione dell'UI è irrilevante. Tra le schermate attivabili, d'altro canto, ritroviamo il Menu Pausa. Esso si trova sul layer Menu nel layout del gioco e dovrà reagire quando il pulsante Indietro viene premuto.
La gerarchia delle schermate viene spiegata nella documentazione Interfaccia utente, ma puoi trovare un riferimento di seguito:
Nelle impostazioni predefinite della classe delle schermate BP, impostiamo un contesto di mappatura di input opzionale. Viene applicato all'attivazione/alla disattivazione del widget e puoi sovrascriverlo di classe in classe.
UParrotActivatableScreen ha un'implementazione per gestire le azioni Indietro. L'ascoltatore di eventi IA_UI_GenericBack è definito nel grafico evento delle blueprint derivate che ne fanno uso. Devi inoltre abilitare la casella di spunta Is Back Handler nel pannello Dettagli.
Fai riferimento ai commenti nella classe C++ e BP per vedere come il pattern Indietro è usato in widget di schermata diversi.
Dopo le classi di base, dai uno sguardo alla schermata delle combinazioni di tasti WBP_KeyBindingsScreen si trova in Content/UI/Widgets/Screens. Vale la pena esaminare autonomamente il grafico eventi per vedere come User Settings e Key Profile sono interrogati per estrarre i tipi di Player Key Mapping dall'input avanzato. I dati sono usati per aggiungere e popolare i widget WBP_InputSelectorBox. All'interno del widget WBP_InputSelectorBox troverai due widget W_ParrotInputSelector.
Uno è usato per gli input del gamepad e mentre l'altro per gli input della tastiera. Il selettore di input Parrot è un widget personalizzato ispirato al widget selettore di input integrato. Entrambi questi widget entrano in uno stato di selezione, attendono un input e poi aggiornano la visualizzazione:
Per il mouse e la tastiera, lavoriamo con il testo restituito dal sottosistema di Input avanzato e aggiorniamo la visualizzazione.
L'implementazione della schermata relativa al gamepad, invece, si basa sull'UI comune affinché esegua una query per le immagini specifiche del controller. In questo caso, ne abbiamo configurata una per le immagini Xbox chiamata
CommonInput_Gamepad_XboxinContent/Input/UI/Platform. Questa classe deriva daUCommonInputBaseControllerData.
Derivando da questa classe, puoi mappare le chiavi di input sui pennelli con le immagini. Prosegui configurando i dati del controller in Modifica > Impostazioni progetto > Impostazioni input comune, quindi naviga verso la piattaforma.
Una volta che quei dati sono connessi, il resto del lavoro avverrà nei widget. Vale la pena esaminare il codice e i commenti in UParrotInputSelector e WBP_InputSelectorBox per vedere esattamente come opera la funzione di rimappatura usando l’input avanzato e i sottosistemi di UI comune.
L'ultima importante funzione da sottolineare è il salvataggio dei tasti mappati, che viene eseguita in SaveKeyMappings in WBP_KeyBindingsScreen. La funzione itera su tutti i widget del riquadro di selezione e poi usa le funzioni integrate delle impostazioni utente Apply Settings e Save Settings. Save Settings scrive un file di salvataggio, ossia EnhancedInputUserSettings.sav, su disco. Puoi trovarlo sotto Directory progetto > Parrot > Salvati-SaveGames.
Se tutto è stato configurato correttamente, dovresti avere una schermata di combinazioni di tasti funzionante.
Puoi notare che nell'angolo in basso a destra è presente un widget di azione che si aggiorna quando il tasto viene rimappato. Questo widget è WBP_ParrotGamepadActionWidget e si trova sotto Content/UI/Widgets/Common. Fa un utilizzo massiccio della classe UCommonActionWidget dell'UI comune che è creata per mostrare icone specifiche della piattaforma sulla base di un'azione di input. Vengono usati i dati di input comuni creati in precedenza. Sfruttando l'UI comune, è facile creare nuovi widget in base alle esigenze che fanno riferimento alle azioni di input avanzato del gioco.