World of Warcraft

L'angolo del programmatore: progettare la WoW Companion App

L'angolo del programmatore: progettare la WoW Companion App

Uno dei miglioramenti tecnici più importanti apportato alla WoW Companion App per Shadowlands è il supporto per più espansioni. Si tratta di una funzione che molti giocatori ci hanno chiesto e oggi vogliamo spiegare quali sono le sfide che abbiamo affrontato e le decisioni che abbiamo preso in merito a un cambiamento tecnico così importante e su larga scala.

Un po' di storia

La Companion App è stata originariamente progettata per supportare un'espansione, Legion. In vista di Battle for Azeroth, abbiamo deciso di dare la priorità ad alcune migliorie back-end, inclusa la possibilità di condividere il codice con il client PC, che ci consente di utilizzare molte delle funzioni e degli strumenti disponibili nell'interfaccia utente di gioco e ai quali l'app non aveva precedentemente accesso. Questo però non ci ha permesso di creare l'infrastruttura necessaria a supportare più di un'espansione alla volta. Quindi, abbiamo scambiato la singola espansione supportata dall'app, Legion, passando a quella successiva, Battle for Azeroth.

Sappiamo che i giocatori non sono stati contenti di perdere l'accesso ai contenuti di Legion nell'app quando abbiamo fatto questo scambio, così ci siamo impegnati, per Shadowlands, a supportare più di un'espansione alla volta. Inoltre, il team mobile era ansioso di poter dare alla comunità ciò che voleva, ripristinando quindi l'accesso ai contenuti di Legion.

Abbiamo discusso brevemente dell'opzione di supportare solo parzialmente alcune funzioni delle espansioni precedenti, per massimizzare il lavoro sui contenuti di Shadowlands, ma abbiamo poi deciso di ripristinare quante più funzionalità possibili. Sapevamo anche che, con l'arrivo di Shadowlands, i giocatori avrebbero avuto la possibilità di progredire di livello con i personaggi secondari in Legion, attraverso i Viaggi nel Tempo, e volevamo assicurarci che avessero un supporto mobile totale dedicato a questa esperienza.

Scegli l'espansione
La Companion App permetterà ai giocatori di scegliere tra Legion e Battle for Azeroth a partire dalla pre-patch di Shadowlands, i cui contenuti saranno disponibili al lancio dell'espansione.

Fortunatamente, la maggior parte del codice specifico di Legion era ancora presente nell'app, e avevamo ancora i materiali originali di Legion a disposizione, il che ha reso la ri-aggiunta di quei contenuti un test perfetto per la nostra nuova infrastruttura multi-espansione. Visto che non c'era molto altro da implementare, non ci è rimasto che separare nettamente i contenuti di Legion da quelli di Battle for Azeroth.

Per creare l'infrastruttura multi-espansione c'è stato bisogno di tre elementi fondamentali:

  1. l'app doveva ripulire tutti i dati relativi ai contenuti dell'espansione attuale e richiedere i dati della nuova espansione al server.
  2. per mantenere le funzionalità separate, dovevamo separare il codice dell'interfaccia utente specifico dell'espansione.
  3. abbiamo dovuto suddividere gli asset specifici di ogni espansione per minimizzare l'utilizzo delle risorse dell'app.

Dati dell'espansione

Quando abbiamo sviluppato la Companion App di Legion, la maggior parte del codice del server che gestiva le richieste dell'app era stata creata espressamente perché restituisse solo i dati di Legion. Quando siamo passati a Battle for Azeroth, abbiamo cambiato quelle funzioni perché fornissero i dati di questa espansione Stavolta, però, dovevamo essere in grado di recuperare i dati di tutte le espansioni selezionate, cioè passare attraverso tutte le funzioni del server che rispondevano alle richieste mobile, cambiandole perché accettassero i parametri che specificavano a quale espansione appartenevano i dati richiesti. Per esempio, le richieste dei dati sui seguaci dovevano poter specificare il tipo di seguace (di Legion o di Battle for Azeroth), mentre le richieste per le Missioni Mondiali dovevano includere le zone per le quali si richiedevano tali dati.

L'app era stata ampliata perché supportasse specificatamente Battle for Azeroth. In Legion, l'app richiedeva le Risorse dell'Enclave; per Battle for Azeroth abbiamo semplicemente aggiunto le Risorse di Guerra al messaggio. Per Shadowlands, invece che continuare ad aggiungere nuove valute allo stesso messaggio, abbiamo deciso di importare l'intero sistema valutario del client PC alla nuova infrastruttura di codice condiviso sviluppata per Battle for Azeroth. Questo vuol dire che ogni espansione ora è in grado di richiedere automaticamente il proprio tipo di valuta/risorsa, invece di doverla specificare manualmente.

Query dei dati delle valute (precedente)
Prima: l'app richiedeva al server le valute specifiche.
alternate-image-name
Dopo: ogni espansione può richiedere le proprie valute. Questo codice può sembrare familiare a chi lavora sugli add-on che usano il sistema di valute di Shadowlands. Questo perché l'interfaccia con codice condiviso consente alla WoW Companion App di condividere le funzioni con il gioco principale.

Codice interfaccia utente

Buona parte del codice scritto per supportare Battle for Azeroth è stato scritto dopo il codice esistente di Legion, il che ha reso difficile capire quale dei codici fosse in uso. Per esempio, l'elenco dei seguaci di Battle for Azeroth poteva ancora mostrare gli armamenti, ma il relativo pulsante era nascosto, quindi quel codice non veniva mai richiamato. Le funzionalità di Legion e Battle for Azeroth erano così simili che ciò non ha rappresentato un grosso problema, ma sapevamo che con le nuove funzioni aggiunte con Shadowlands, non avremmo potuto mantenere lo stesso tipo di architettura. Se il codice, condiviso da Legion e Battle for Azeroth, avesse avuto bisogno di supportare elementi come Vincoli dell'Anima e Congreghe, sarebbe diventato ancora più complicato di quanto non fosse già.

Abbiamo invece analizzato ogni script, cercando di capire quali funzionalità sarebbero state condivise e quali dedicate a una specifica espansione. Abbiamo diviso il codice specifico di un'espansione in sottoclassi o componenti totalmente nuove, mantenendo solo la funzionalità di base condivisa nelle classi correlate, e creato nuovi oggetti di gioco per ogni espansione usando le nuove sottoclassi. Ora, anche se sono supportate dallo stesso sistema e condividono la maggior parte delle funzionalità, solo l'elenco delle Missioni di Legion necessita di avere un pulsante per l'alleato combattente, e l'elenco delle Avventure di Shadowlands è in grado di fare a meno del sistema a due schede che Legion e Battle for Azeroth usavano e mostra i ritratti dei nemici invece delle icone del tipo di missione.

Confronto tra l'elenco di Missioni di Legion e l'elenco delle Avventure di Shadowlands
Raffronto tra l'elenco di Missioni di Legion e l'elenco delle Avventure di Shadowlands

Un altro cambiamento importante dietro le quinte che abbiamo implementato per Shadowlands è il modo in cui produciamo i file del database; la Companion App ora crea il proprio codice del database e i file dei dati usando lo stesso procedimento del PC. Ciò è risultato estremamente utile con il codice che determina su quale mappa vengono mostrate le missioni mondiali. Originariamente, l'app prendeva questa decisione usando la logica manuale per l'ID di ogni mappa, una cosa non problematica quando era necessario il supporto esclusivamente per Argus e le Isole Disperse. Aggiungendo altre zone di Battle for Azeroth però, la questione si è fatta rapidamente più complessa. Invece di mantenere quel codice per Shadowlands, siamo riusciti a importare facilmente i database delle mappe dell'interfaccia utente di cui avevamo bisogno per rendere il sistema completamente dinamico, convertendo una grossa parte di codice, che doveva gestire le zone di tutte e tre le espansioni, in un'unica funzione snella, capace di gestire automaticamente qualunque missione mondiale senza alcuna logica specifica per espansione.

File di asset

Una grande differenza tra lo sviluppo mobile e PC è che nel primo caso abbiamo dovuto tenere presente che i giocatori avrebbero potuto usare l'app con una connessione cellulare, quindi con un limite di traffico dati o una connessione non ottimale. Dovevamo assicurarci che i giocatori avessero un'esperienza divertente e senza frustrazioni quando usavano l'app, indipendentemente dalla connessione cellulare, e uno dei modi per farlo è stato limitare i dati che i giocatori dovevano scaricare per usare l'app.

Ogni espansione ha molti file di asset che possono accumularsi molto rapidamente, e passare da un'espansione dell'app per Legion e Battle for Azeroth a tre (considerando il supporto per Shadowlands), significava triplicare la quantità di dati usati dall'app. Molti asset però sono usati da una sola espansione, come le texture in alta risoluzione della mappa mondiale, gli sfondi dei luoghi delle missioni e i ritratti di seguaci e nemici, così abbiamo deciso di separare quegli asset in pacchetti differenti per ogni espansione. Così facendo, l'app deve caricare in memoria solo gli asset usati per l'espansione correntemente attiva, riducendo la quantità di memoria necessaria.

Abbiamo anche deciso, con largo anticipo, di suddividere ogni espansione nel proprio scenario di gioco, il che ci ha permesso di mantenere una netta separazione tra le funzionalità delle diverse espansioni. Lo scenario di gioco di Legion non ha bisogno di una pagina per i richiami della Congrega, mentre a quello di Shadowlands non serve una finestra per l'invio delle truppe. Come per i cambiamenti apportati al codice, anche in questo caso è più semplice capire cosa succede nell'app in ogni momento. Dividere gli asset e gli scenari di gioco in questo modo significa dare a ogni espansione il proprio spazio e spianare la strada a delle opzioni di download più user-friendly.

Volevamo che i giocatori avessero più controllo sugli asset dell'app da scaricare. L'utente può scegliere di scaricare tutto in una volta quando ha una connessione stabile, o scaricare gli asset di altre espansioni più tardi, accedendo così all'app più rapidamente. Se si sceglie di non interagire del tutto con una specifica espansione, non è neanche necessario scaricare i relativi asset. Calcolando 30-40 MB a espansione, si tratta di una quantità sensibile di dati di cui si può saltare il download!

Download selettivo per ogni espansione
Separare ogni espansione significa download più brevi, per iniziare subito a giocare!

Cambiamenti nel processo

Dividere gli asset per espansione ha richiesto un cambiamento in due punti del nostro flusso di lavoro: il tool di gestione degli asset doveva sapere quali appartenevano a quale espansione, e il tool di creazione del pacchetto di asset doveva poterli raggruppare insieme durante la creazione di quello finale. Il tool di gestione degli asset era uno di quelli espressamente creato per supportare Legion prima e Battle for Azeroth poi, quindi abbiamo dovuto riscriverlo perché funzionasse anche con Shadowlands. La nuova versione analizza l'elenco delle espansioni con i contenuti che la Companion App potrebbe utilizzare (con iterazioni dell'enumerazione del tipo di Guarnigione) e produce asset per ogni espansione posizionandoli in cartelle separate. Modificare il tool di gestione perché usasse l'elenco completo delle espansioni significa anche considerare tutti i valori aggiunti successivamente a quell'elenco, rendendo più facile aggiungere nuovi contenuti alla Companion App senza dover continuamente aggiornare il tool.

La creazione dei file di asset e il caricamento runtime fa un pesante utilizzo della funzione delle varianti AssetBundle di Unity, che permette all'app di trattare diversamente le varie versioni di un singolo file come se facesse parte dello stesso pacchetto. Il procedimento di creazione del pacchetto produce una diversa variante di ogni pacchetto per ogni espansione in base alla cartella di output specifica per espansione prodotta dal tool di gestione. Quei pacchetti di asset vengono scambiati ogni volta che si cambia espansione sull'app. Visto che tutte le varianti di un pacchetto possono essere trattate allo stesso modo, qualunque codice che debba recuperare, per esempio, i ritratti dei seguaci, può farlo senza preoccuparsi di quale specifico set di ritratti di seguaci è attualmente caricato. Questo permette al codice di non doversi preoccupare degli asset da caricare e scaricare: ogni espansione può considerarsi l'unica attualmente presente sull'app.

Nelle Terretetre

Che tu preferisca i contenuti delle nuove Avventure di Shadowlands o progredire con un personaggio secondario in Legion, siamo entusiasti di poterti fornire nuovi contenuti per World of Warcraft in mobilità! Speriamo che ti sia piaciuto questo sguardo approfondito sul lavoro che facciamo e sulle decisioni che intervengono nel processo di creazione dell'infrastruttura in grado di supportare non solo i contenuti attuali, ma anche tutto ciò che World of Warcraft ha in serbo per il futuro.

Articolo successivo

Notizie in evidenza