Da 0 a 100!
Ciao a tutti ragazzi,
Il mio nome è Garrett, Senior Programmer qui dentro ad OWI. Voi molto probabilmente mi conoscete come RoyAwesome qui sul forum e su Reddit. Lavoro su Squad da più di un anno, focalizzzandomi sull’implementazioni di varie features come ad esempio il sistema dei vari Deployable, le varie modalità di gioco, le modalità AAS, bandiere, punteggi etc. Una delle mie “missioni” principali negli ultimi mesi è stata su una delle features più richieste: i Veicoli.
Ho iniziato i lavori sui veicoli a Settembre 2015. A quello stadio avevamo 2 prototipi entrambi in Blueprint (Sistema di scripting dell’ Unreal Engines). Ne avete avuto un assaggio nel trailer Kickstarter sulle Humvee. Ho capito in tempi brevi che entrambi i prototipi avevano alcuni difetti fatali che mi hanno portato a scegliere di re-implementare da zero il sistema dei veicoli. Si è dimostrata essere una scelta vicente, permettendoci di creare un sistema robusto permettendoci la creazione di vicoli unici.
Un Veicolo sulla Mappa di Testing
Inoltre, prima di di scrivere qualsiasi linea di codice, dovevo sapere esattamente cosa volessimo che i veicoli fossero capaci di fare. Che tipo di azioni potevano fare? COsa sarebbe successo ad un mezzo colpito da un fucile? Un razzi? Un proiettile di carro? Cosa i passeggeri potevano fare? I mitraglieri? I guidatori? Avevo molte domande che richiedevano risposte che quindi ho girato ai nostri fantastici designers Z-Trooper e SgtRoss per aiutarmi nel brainstorm di alcune idee su come volessero rendere i Veicoli nella loro forma finale. Queste semplici domande hanno dato il via ad una grande discussione di design, portando poi alla costruzione di un corposo documento di design contenente tutte le idee più importanti e le implementazioni da fare. Con un design in mano, potevo quindi inziare a darmi da fare.
Partendo da un file di codice vuoto dovevo solo decidere da dove partire. I prototipi precedenti si erano focalizzati sulla Fisica ed il Movimento dei Veicoli e, siccome stavo partendo da 0, ho optato per iniziare dalla parte che nessuno di questi prototipi aveva affrontato: come entrare nel veicolo e come spostarsi tra le varie sedute al suo interno. L’ultima feature in particolare era un punto focale nel design, quindi ho iniziato implementando una versione semplificata. Come ulteriore bonus questo ha permesso di condividere i progressi con le Armi Per Postazioni Fisse, siccome entrare od uscire da queste richiedeva del lavoro.
L’implementazione iniziale delle sedute e delle interazioni con queste è stato un lavoro relativamente veloce, e verso la fine di Settembre ho iniziato a lavorare su di un prototipo di Veicolo statico che potesse avere un numero qualsiasi di posti a sedere. Ho incontrato vari problemi per il testing dove il gioco crashava ogni volta che entravo in un mezzo. Dopo una rapida investigazione ho scoperto che parte del codice presume che il PlayerController (cosa voi siete) controllava sempre il Soldier (la vostra persona nel gioco). “Oh semplice” ho pensato, “fixero queste problematiche”. Bhè non era così semplice.
Configurazione delle Sedute in una Technical
Per aiutarvi a capire il problema più facilemente, l’Unreal Engine presenta alcuni ogetti importanti. Il Giocatore è rappresentato tramite il PlayerController. Il lavoro del PlayerControllers è di controllare gli input dei vari giocatori, oltre che a tracciare il loro stato nel gioco. Loro non esistono nel mondo di gioco, ma possono prendere posseso di oggetti chiamati Pawns (Pedine), oggetti nel mondo di gioco che possono essere controllati. Fin dall’inizio dello sviluppo a ora avevamo solo un solo tipo di Pawn: il Soldier. A causa di questo alcuni sistemi core come le armi ed i danni funzionavano solo quando un PlayerController controllava un Soldier. Se il PlayerController controllava qualche altra cosa (poniamo il caso, un Veicolo), questo sistema andava in crash.
Qui potete vedere come, attualmente, potete entrare in un veicolo
Spezzare e riparare queste parti di codice mi ha portato via molto tempo, da Ottobre fino a Novembre. Alcune di queste erano facili da fixare, come istanze dove il codice creava un Pawn in un Soldier e non controllava se l’azione falliva, altre invece non erano così semplici. Ho realizzato, all’inizio d’Ottobre, che potevamo fixare questi problemi e rilasciare le Armi Per Postazioni Fisse in Novembre. Però ho poi scoperto che le Armi davano per scontato che il nostro Player Controller controllasse il Soldier. I progressi sul fixaggio di tali problematiche è stato lento. Le Amri richiedevano di essere inserite in un Inventario che fosse parte integrante del Soldier. Ho dovuto suddividere il tutto in varie componenti (sperando di non compiere ulteriori problemi nel proceso). Ottobre si è poi trasformato in Novembre e stavo ancora lavorando su istanze dove le armi venissero utilizzate dalle Animazioni del Soldier in ogni Pawn controllata (che ovviamente non funzionava con i Veicoli).
Creazione di un Inventario per una calibro .50
Per fortuna, mentre ero occupato a fixare questi problemi, Kory , un altro programmatore, concluse il suo lavoro ed inizio a lavorare ai Veicoli insieme a me. A questo punto avevamo mancato il rilascio per la patch di Novembre, ma miravamo a rilasciarli per l’Early Access. Chiesi a Kory di occuparsi a rendere funzionante la fisica dei veicoli, rendendo l’Humvee guidabile. A questo punto dovevo solo fixare tutte le problematiche legate al solo Soldier quindi guidare i veicoli era possibile. Abbiamo pensato di poter rendere almeno disponibili i mezzi di trasporti, quindi Kory cominciò ad integrare il sistema dei veicoli dell’UE4 nel sistema dei veicoli multiplayer che avevo costruito.
A questo punto io e Kory abbiamo iniziato a guidare le Humvees nella nostra mappa per test. A questo punto, dopo aver attivato un sistema di lag fittizia, abbiamo riscontrato alcuni strani comportamenti, dove le Humvees e le Technicals presentavano rubber banding (effetto ad elastco n.d.r.) e del desync quando le si guidava. Abbiamo iniziato ad investigare ma, con il rilascio dell’Alpha 3 dietro l’angolo, abbiamo dovuto aspettare.
Veicoli sulla Mappa per test
Più o meno nello stesso periodo fixai i rimanenti problemi con le armi fisse, riuscendo finalemente a sparare per la prima volta con una cal .50 fissa. Però, siccome alla release l’Apha 3 era piena di bug, misi da parte questi lavori per concentrarmi insieme a Kory sulla v.3 e rendere il rilascio dell’ Early Access fantastico. Aggiunsi un metodo di spawn per i veicoli in ogni mappa in modo che, nel post lancio, potessimo spawnare i veicoli su server pieni e vedere le performance.
Dopo il rilascio dell’EA abbiamo compiuto numerosi test, facendo spawnare Humvees e Technicals su server pieni per poter vedere come si comportassero. I risultati non furono incoraggianti, il problema che vedemmo con desync e rubber banding era addirittura peggio nei server pieni. Presi quindi un piccolo break dagi scontri con i bug post-release per investigare, e scoprii che il codice dei veicoli di default non aveva un netcode o una correzione di lag. I veicoli warpavano (si teletrasportavano in punti randomici n.d.r.) perchè gli input del guidatore venivano inviati ad ogni Client ed il Server, e solamente la posizione del Server era corretta. A causa della natura dell’engine fisico, ogni client presentava errori piccoli ma gravi in posizione e velocità, causando ad ogni client di vedere i veicoli in posizioni differenti. Quando il server invia la posizione Corretta, il veicolo veniva teletrasportato nella posizione adeguata con un bruttissimo effetto di warp e rubber banding.
Il netcode per i Veicoli andava ricostruito
Nella seconda parte parlerò del processo di riscrittura del Netcode per i Veicoli e di come abbia riunito i pezzi, oltre ad illustrarvi come modificarli voi stessi. Per ora spero che abbiate apprezzato questo sguardo al processo di sviluppo dei veicoli di questi mesi. Se avete qualsasi altra domanda potete seguirmi su Twitter, @RoyAwesome.
Offworld Out.
Per discutere la News scrivete pure sul topic inerente , per partecipare alla discussione generale di squad scrivete pure su questo topic
Traduzione: Aragorn89