Documentazione di Steamworks
File delle azioni nel gioco

Panoramica


Gli sviluppatori devono fornire un file di azioni in-game (IGA) che definisca le azioni, i set di azioni e la struttura di base della configurazione di input del loro gioco. Questo articolo descrive la struttura generale di tale file e fornisce diversi esempi concreti tratti da vari giochi.

File di esempio


Creazione manuale di un file di azione in gioco

Inizia scaricando il file iniziale delle azioni in gioco (IGA) di cui trovi il link negli esempi in alto. Poi crea una directory "controller_config" all'interno della cartella di Steam, in genere C:/Program Files (x86)/Steam/controller_config, e sposta il file in quella directory. La cartella di Steam conterrà già una cartella con un nome molto simile, quindi assicurati di usare la cartella "controller_config" e non "controller_base". Rinomina il file come segue: "game_actions_X_vdf", dove X è l'appID di Steam del tuo gioco. Se non conosci l'appID di Steam del tuo gioco, puoi trovarlo accedendo al sito di Steam per i partner.

A questo punto, apri il file in un editor di testo. Il file è nel formato standard di Valve denominato KeyValues, ossia un semplice formato di lettura. Potrebbe essere utile scaricare anche uno dei nostri template di file di azioni in gioco o il file IGA di Portal 2 per avere dei riferimenti.

Generazione di un file IGA da un gioco esistente che utilizza le API di Steam Input


Se salvi una configurazione per qualsiasi gioco su Steam come configurazione "locale " è quindi possibile trovare un file corrispondente in:
[PercorsodiSteam]\UserData\[tuoID]\241100\remote\controller_config\[appid]\[nomesalvataggio].vdf

Nell'esempio di seguito viene visualizzata la posizione in cui le configurazioni locali di Defender's Quest vengono memorizzate su un tipico computer che utilizza Windows 10:

whereisvgf.png

Nota: questi file non sono copie esatte del file IGA principale caricato dallo sviluppatore, ma puoi farti un'idea della struttura originale dai blocchi dei parametri "actions" e "localization", estratti direttamente dal file principale.

Puoi scaricare il file mostrato nello screenshot (può essere utile confrontarlo con il file IGA principale di Defender's Quest) qui: #library_controllersavedefaulttitle_0.vdf.

Formato del file IGA


Il file IGA ha il formato di un documento VDF, ossia il formato proprietario dei dati di Valve per la creazione di dati di oggetti strutturati con coppie di stringhe chiave/valore.

Struttura di base


La struttura di base del file è un oggetto wrapper denominato "Azioni nel gioco" con due oggetti inferiori definiti rispettivamente "actions" e "localization":

"Azioni nel gioco" { "actions" { } "localization" { } }

Set di azioni

Guardiamo più da vicino la struttura dell'oggetto "actions". In questo oggetto sono inclusi i set di azioni. La struttura di un oggetto "actions" è la seguente:
"actions" { "ActionSetNameGoesHere" { "title" "#TitleGoesHere" "StickPadGyro" { } "AnalogTrigger" { } "Button" { } } }

Le stringhe "ActionSetNameGoesHere" e "#TitleGoesHere" sono le uniche dell'esempio precedente che l'utente deve sostituire. Per le altre si tratta di parole chiave riservate.

Il valore con cui viene sostituito "ActionSetNameGoesHere" sarà il nome del set di azioni che utilizzi per l'API di Steam Input. Il valore sostituito a "#TitleGoesHere" sarà il token di traduzione utilizzato nella sezione "localization" più avanti nel file. Tieni presente che in questo codice è necessario il simbolo #.

Ogni set di azioni deve presentare un nome di stringa univoco. Puoi aggiungere dei set semplicemente creando più oggetti nel contesto dell'oggetto contenitore "actions". Non sono necessarie virgole o parentesi quadre. Si tratta del formato VDF, non JSON.

Ci sono tre possibili oggetti secondari per ogni oggetto del set di azioni. Si tratta di "StickPadGyro", "AnalogTrigger", e "Button". Questi sono gli unici oggetti che è possibile definire. Rappresentano i contenitori che ospiteranno le definizioni delle singole azioni. Non è necessario fornire tutte e tre le categorie, tuttavia.

Questa struttura è perfettamente valida, ad esempio:
"actions" { "ActionSetName1" { "title" "#Title1" "AnalogTrigger" { } "Button" { } } "ActionSetName2" { "title" "#Title2" "StickPadGyro" { } } "ActionSetName3" { "title" "#Title3" "Button" { } } }

StickPadGyro

Questo blocco di set di azioni è destinato alle azioni analogiche che presentano fino a due assi di movimento, come quelle che di solito si assegnano a joystick, trackpad o giroscopi. Va inserito in questo blocco anche ciò che si desidera controllare con un mouse o una periferica con simile funzione.

AnalogTrigger

Questo blocco di set di azioni è destinato alle azioni analogiche che presentano un solo asse di movimento e che generalmente vengono assegnate a un grilletto analogico.

Tasto

Questo blocco di set di azioni è per le azioni puramente digitali, che riportano solo uno stato attivo o disattivo. Anche se il nome di questo blocco è "button", le azioni digitali possono essere assegnate a qualunque input fisico, anche quelli inizialmente destinati a dati di output analogici (come joystick, trackpad, ecc.).

Azioni


Un file IGA è inutile senza la definizione di alcune azioni. Vediamo come aggiungerne qualcuna.

Azioni di tipo StickPadGyro

Iniziamo con l'aggiunta di alcune azioni StickPadGyro (analogiche a 2 assi). Impostiamone una per lo spostamento del personaggio, che chiameremo "Move". Aggiungiamo poi un'altra azione per controllare la telecamera, assegnandole il nome "Camera".

"actions" { "FPSControls" { "title" "#Set_FPSControls" "StickPadGyro" { "Move" { "title" "#Action_Move" "input_mode" "joystick_move" } "Camera" { "title" "#Action_Camera" "input_mode" "absolute_mouse" } } } }

Come noterai, la struttura astratta per un'azione StickPadGyro è la seguente:
"ActionNameHere" { "title" "#ActionTitleHere" "input_mode" "<analog_mode>" }

Gli unici valori modificabili dall'utente in questa struttura sono quelli contrassegnati come "ActionNameHere", "#ActionTitleHere" e "<analog_mode>", che corrispondono rispettivamente al nome della stringa dell'azione da utilizzare nell'API di Steam Input, la chiave di localizzazione da utilizzare nella sezione del file per la localizzazione e la modalità della fonte dell'input che gestisce il modo in cui vengono elaborati e interpretati i dati analogici.

La proprietà "input_mode" può assumere due valori per le azioni StickPadGyro:

  • "joystick_move"
  • "absolute_mouse"

Per le azioni i cui valori vengono interpretati come joystick (deviazione costante da un punto centrale) è necessario utilizzare "joystick_move", mentre per le azioni analogiche con uno scopo generale più flessibile va utilizzato "absolute_mouse". In caso di dubbio, utilizza "absolute_mouse".

"joystick_move" o "absolute_mouse" ?

Non ci stancheremo mai di ripeterlo: alla creazione di un input per la telecamera nei giochi in prima/terza persona o che prevedono lo spostamento con il cursore, è sempre necessario utilizzare il tipo "absolute_mouse" e reagire ai delta come se si trattasse di un mouse.

L'API eseguirà automaticamente l'azione corretta per l'input basato su levetta. Di conseguenza, riceverai comunque l'input regolabile della levetta se la telecamera è applicata alla levetta analogica (in stile PS4/Xbox) con tutte le zone morte, curve di risposta e così via (definibili nella configurazione predefinita). Lo stesso input funzionerà su joystick, trackpad o giroscopi per il controllo del movimento (controller PS4/Steam Controller) così come sui mouse che verranno supportati in futuro.

Non utilizzare il metodo di input basato su "joystick_move" per la telecamera, in quanto non è possibile eseguire la mappatura della direzione opposta per ottenere dati utili 1:1 per i controlli del pad, del giroscopio o del mouse.

Questo si applica anche all'input basato su cursore: "absolute_mouse", dato che il cursore funzionerà correttamente sugli input basati su levetta. Non preoccuparti quindi di creare il tuo cursore basato su levetta, qualora ne avessi bisogno.

Facoltativamente, puoi inviare eventi del mouse di livello inferiore insieme ai dati analogici. Il gioco non sarà in grado di distinguere questi eventi del mouse da quelli generati dal sistema operativo. Puoi eseguire questa operazione aggiungendo il valore "os_mouse" e assegnando a questo un valore di 1.

Esempio:
"StickPadGyro" { "Mouse" { "title" "#Action_Mouse" "input_mode" "absolute_mouse" "os_mouse" "1" } }


Azioni di tipo AnalogTrigger
Le azioni AnalogTrigger sono azioni analogiche 1-D che possono essere associate ai grilletti. Se stai usando una semplice soglia del grilletto per un'azione come sparare con un'arma o avviare la modalità "Mira in basso", ti consigliamo di usare un'azione di tipo Button al posto di un'azione AnalogTrigger, in modo che gli utenti abbiano maggiore flessibilità di riassociazione.

Le azioni AnalogTrigger hanno una zona morta configurabile nell'interfaccia utente di riassociazione e sono riscalate da 0 - 1.0f tra quei valori. I controller con pulsanti di sparo digitali come Nintendo Switch Pro invieranno 0 o 1.0, quindi ti consigliamo di controllare di non avere un codice di gameplay che dipende dalle modifiche graduali del grilletto nel tempo.

Le azioni AnalogTrigger hanno un formato semplice, con il nome dell'azione come chiave e il token di localizzazione come valore. Come in questo esempio:
"AnalogTrigger" { "AccelerationAxis" "#Action_Accelerate" "BreakingAxis" "#Action_Brake" }

Azioni di tipo Button

Anche i pulsanti di azione hanno un formato simile, che usa il nome dell'azione e il token di localizzazione:
"Button" { "digital_action_1_name_here" "#DigitalAction1TitleHere" "digital_action_2_name_here" "#DigitalAction2TitleHere" }

Se lo ritieni necessario, puoi definire un evento hardware dell'input nativo di livello inferiore (come un clic nativo del mouse) che si attiva parallelamente all'azione. Può essere utile in alcuni casi limite in cui il gioco si basa, ad esempio, su un gruppo di input complesso con sette livelli di profondità che non tratta quasi mai gli eventi del mouse virtuale generati dal livello dell'applicazione allo stesso modo di quelli generati direttamente dal sistema operativo.

"Button" { "simple_click" "#simple_click" "fancy_click" "#fancy_click, mouse_button LEFT" }

Questo fa sì che il gioco produca un vero e proprio evento del pulsante sinistro del mouse a livello di sistema operativo ogni volta che l'azione "fancy_click" viene attivata.

Attenzione!

Non approfittare mai di questo stratagemma per forzare specifiche assegnazioni di input fissi per le tue azioni, in quanto andresti completamente contro il principio del paradigma "azioni, non input", che fornisce all'utente il controllo totale sulla configurazione. Se stai usando questa funzione per finalità diverse dalla semplice correzione di alcuni rari casi limite, probabilmente ne stai facendo un uso eccessivo.

Layer di set di azioni

Oltre ai set di azioni, puoi aggiungere un layer di modifiche incrementali per attivare il set di azioni con un layer di set di azioni. Puoi usarlo per gestire le specializzazioni di una modalità generale, come un layer Cecchino sopra ai controlli per muoversi a piedi o per gestire i casi in cui un'interfaccia utente compare in gioco sopra al normale gameplay, come le schermate di voto. I layer devono essere dichiarati in una propria sezione, ad esempio:
"action_layers" { "IngameModalLayer" { "title" "#Layer_IngameModal" "legacy_set" "0" "set_layer" "1" "parent_set_name" "InGame" "AnalogTrigger" { } "Button" { "Modal_Accept" "#Action_Modal_Accept" "Modal_Decline" "#Action_Modal_Decline" } } }

Localizzazione


Il file IGA principale deve includere, oltre alle definizioni dei set di azioni, una sezione per la traduzione denominata "localization". I singoli oggetti secondari dell'oggetto "localizzazione" saranno costituiti dalle stringhe di qualsiasi lingua supportata da Steam. Assicurati di includere almeno un blocco che includa i titoli delle azioni in lingua inglese.

"localization" { "english" { "move" "Move" "camera" "Camera" } }

Tieni presente che i nomi delle proprietà devono corrispondere alle chiavi di traduzione specificate nelle sezioni precedenti, fatta eccezione per il simbolo "#".

Per aggiungere ulteriori lingue è sufficiente aggiungere altri blocchi con la traduzione di ciascuna voce:

"localization" { "english" { "move" "Move" "camera" "Camera" } "spanish" { "move" "Mover" "camera" "Cámara" } "norwegian" { "move" "Bevege" "camera" "Kamera" } }
Il token per ogni lingua deve corrispondere al valore del "codice lingua dell'API", ad esempio "schinese" per il cinese semplificato. L'elenco completo delle lingue supportate è disponibile qui.

Utilizzo del file IGA da parte di Steam


Il file IGA principale che crei verrà utilizzato solo durante la fase di sviluppo, ma dovrà comunque essere salvato, mantenuto e conservato nel controllo della versione e così via. Quando crei una configurazione ufficiale di input per il tuo gioco durante la fase di sviluppo, il client di Steam utilizza il tuo file IGA principale per generare un modello iniziale.