Articolo Dietro le quinte del sistema di proiettili di LoL

Stato
Discussione chiusa ad ulteriori risposte.

Loncore512

Utente Platinum
17 Maggio 2014
2,752
189
596
1,295
resize


Ciao a tutti, evocatori amanti dei colpi di precisione, sono Brian "Penrif" Bossé e sono qui per parlarvi dei nuovi dettagli tecnici sul funzionamento dei proiettili. Negli ultimi mesi abbiamo pubblicato una nuova implementazione dei proiettili (come è stato scritto nellerecenti note sulla patch. Se abbiamo fatto bene il nostro lavoro, non vi siete accorti di niente giocando. In ogni caso, siamo molto emozionati all'idea delle potenzialità di gioco sbloccate dal nuovo sistema, quindi vogliamo raccontarvele nel dettaglio.
Il vecchio sistema era un pasticcio quasi impossibile da gestire, mentre quello nuovo ci permette di fare facilmente cose buffe come questa:

resize


Non stiamo trasformando Raffica di frecce di Ashe in questo modo, sia chiaro. È semplicemente una cosa che ho fatto in un paio d'ore, dopo avere assunto gli antidolorifici che mi hanno prescritto, per mostrare cosa si può fare con poco sforzo. E senza la capacità di concentrarsi. E senza dolore.

PROIETTILI: SORPRENDENTEMENTE COMPLESSI

Per darvi un'idea di quello con cui abbiamo a che fare, lasciate che vi mostri un diagramma che rappresenta il flusso di esecuzione per frame nel vecchio sistema:

resize


Pur non essendo complesso come i sistemi di guida dei veri missili, questo flusso complicato, per la sua stessa natura, rende pericolosa qualsiasi modifica. In breve, stiamo vedendo una gerarchia di tipi di proiettili, tutti che esprimono un set diverso di proiettili. Le funzionalità dei tipi, a volte, vengono condivise, duplicate, e spesso creano confusione. Questo diagramma ordina in orizzontale i tipi di missili, con le funzioni simili codificate con i colori. Per esempio, se volete sapere come i proiettili gestiscono il tracciamento delle collisioni, dovete esaminare il codice rosa, comodamente piazzato... ovunque.
Il riquadro più in alto comprende quello che chiamiamo "proiettile base", la classe alla radice della gerarchia. Sono i proiettili più semplici: volano verso una posizione o un'unità e si attivano solo quando il movimento si conclude. Gli auto-attacchi e i colpi delle torri fanno parte di questo set, così come i proiettili di abilità come la Q di Corki e la R di Ziggs. Il loro flusso è relativamente semplice, perché tracciano il bersaglio, valutano dove si deve muovere il proiettile e poi determinano se hanno colpito il bersaglio. Un gioco da ragazzi.
Il riquadro successivo comprende i proiettili in linea retta, che includono quelli che i giocatori chiamano "colpi mirati", come Prigione luminosa di Lux, Raffica di frecce di Ashe e praticamente tutto quello che fa Ezreal. In questa categoria ci sono anche delle sorprese, come Muro di vento di Yasuo: è un proiettile in linea retta. L'ironia della cosa fa quasi male.
I proiettili in linea retta hanno un comportamento molto più complicato di quelli base. Per esempio, possono colpire oggetti mentre viaggiano, tornare a chi li ha lanciati (come la suprema di Draven) o abbracciare il terreno (come Radici stringenti di Zyra). Accumulare tutti questi comportamenti diversi in un'unica entità è già di per sé un crimine, ma i proiettili in linea retta sono ancora più complessi, perché sono "figli" di quelli base. Per questo ereditano tutte le funzionalità dei proiettili base, ma le usano diversamente. Il che ci mette nella situazione frustrante dove le modifiche ai proiettili base rischiano di rompere i proiettili in linea retta in modi complicati.
I gruppi piccoli in basso sono per i nostri tre proiettili circolari: la Q e la W di Diana e la W di Ahri. Si comportano in modo molto simile agli altri proiettili, ma si muovono lungo una traiettoria circolare. Derivano dai proiettili base e ricordano molto quelli in linea retta, in tutto quello che non riguarda il movimento. Nel fare questo diagramma ho trovato alcuni bugfix nei proiettili in linea retta che non sono arrivati a quelli circolari. Duplicando il codice si duplicano anche i bug: è questo il dolore inflitto dal demone del copia-incolla.

In breve, il sistema dei proiettili in League of Legends è inutilmente complesso, contorto e fragile. I proiettili rappresentano una parte importante del design del gioco, quindi dobbiamo fare in modo che siano facili da gestire.
Il metodo che abbiamo scelto per ottenere un sistema più agevole è stato di nuclearizzare quello vecchio, per poi riscriverlo da zero. Era l'unico modo per essere sicuri.

PIAZZA PULITA

La riscrittura ha seguito quattro principi base:
• Le funzionalità simili devono essere nello stesso punto del codice, per facilitare la comprensione.
• Le dipendenze tra i diversi gruppi funzionali devono essere minimali ed esplicite.
• Il ragionamento su cosa fanno i proiettili in generale dovrebbe essere semplice.
• I casi con comportamenti speciali devono essere nettamente separati dal percorso di esecuzione principale.
Il team ha iniziato a identificare i problemi chiave dei proiettili, mettendosi al lavoro per scrivere componenti in grado di affrontarli indipendentemente. Amo fare liste di cose, quindi ecco una lista con tutto quello che fanno i proiettili:
• Movimento: i proiettili vanno in giro.
• Collisione: i proiettili colpiscono cose.
• Tracciamento bersagli: i proiettili vanno verso cose che si possono muovere.
• Interfaccia script: i proiettili hanno bisogno di designer che dicano loro cosa fare.
• Visibilità: i proiettili vengono visti da alcune cose, ma non da altre.
• Effetti e suoni: dovete vedere e sentire cosa succede.
Abbiamo iniziato a riscrivere la lista, con un componente per ogni oggetto che potevamo preparare al volo o cambiare in corsa. Continuando a lavorare così, abbiamo valutato le divisioni, intervenendo quando le astrazioni non servivano più. Per esempio, abbiamo abbinato la logica del tracciamento dei bersagli al codice del movimento, visto che i problemi erano strettamente legati, e abbiamo unito l'interfaccia degli script nei proiettili base, perché abbiamo realizzato che non era necessario differenziare i proiettili.
Alla fine ci siamo trovati con un sistema simile:

resize


COSA COMPORTA PER LOL

Arrivando al succo, questo lavoro dà due benefici principali. In primo luogo, il codice dei proiettili non spaventa più i programmatori, con difetti più facili da trovare e sistemare. Su questo fronte il sistema ha già dato i suoi frutti, permettendoci di risolvere dei problemi considerati irrisolvibili da molto tempo.
Per esempio, siamo rimasti molto perplessi vedendo dei video nei quali i proiettili passavano attraverso i loro bersagli. Era un evento molto raro, ma che aveva un grande impatto sulle partite in cui si verificava. Non avendo modo di riprodurre il problema e non avendo indizi per indagare, siamo stati costretti ad accantonarlo e a proseguire. In ogni caso, avendo tutte le collisioni dei proiettili in un unico punto, con più ordine, è stato facile individuare un paio di scenari nei quali le collisioni potevano fallire. Dopo aver fatto pulizia, siamo molto più sicuri che i proiettili colpiranno quello che devono.
Prima di causare dei flame, specifico che è possibile che esistano ancora situazioni nelle quali i proiettili attraversano i bersagli. Sospetto però che sia per errori di sincronizzazione della posizione delle unità, e non per il rilevamento delle collisioni dei proiettili.
Avere dei programmatori felici e un sistema con meno difetti è ottimo, ma il più grande beneficio è che possiamo sperimentare con i proiettili, molto più rapidamente. Senza dover creare nuove classi di proiettili per avere dei proiettili che si muovono diversamente, possiamo inventarci follie di ogni tipo. Quelle che vedete non sono delle idee di produzione: sono il risultato di ingegneri con un po' di tempo libero e qualche rotella fuori posto.

resize


Ci siamo divertiti a mettere in loop gli auto-attacchi, con risultati spettacolari con Draven

resize


E con un ritocco al punto di controllo della spline centrale (è un tipo di funzione), abbiamo fatto qualcosa anche per Varus

resize


Gli esagoni sono i poligoni più belli

Vai e spara a tutto \o/

Articolo originale scritto da:
• Brian "Riot Penrif" Bossé
• Anoop "Noopmoney" Kamboj
• Kevin "kbox" Borer
• Vasiliki "vLemon" Siakka
• Abe "Riot Meyea" Nguyen
• Jessica "Safelocked" Nam
• Richard "Riot Asyrite" Henkel

Quest’articolo fa parte di un progetto esclusivo per il forum e sito italiano di League of Legends che ha come scopo quello di ampliare i contenuti in lingua italiana del sito, spostandoci dai classici temi per affrontare aspetti più particolari inerenti a LoL e a quello che ci gravita attorno.
Per fare in modo di aiutarci a capire se questo tipo di argomenti possono stuzzicare il vostro interesse, ci sarebbe immensamente utile un vostro commento sotto questo articolo con un vostro parere in proposito.
Se poi avete domande inerenti all’argomento di questo articolo, fate anche queste nei commenti e vedrò di contattare le persone apposite e cercare di avere una risposta in merito.
 
Stato
Discussione chiusa ad ulteriori risposte.