Utilizzare un'architettura data driven in un gioco sviluppato con Unity, per realizzare un semplice sistema di minimodding, basato sui dati e di facile implementazione. Utilizzeremo gli streaming assets e json per creare una struttura di dati modificabile dagli utenti, al fine di realizzare un sistema di user generated content che possa garantire al gioco maggiore longevità e varietà.
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Ivan Preziosi - Sviluppare un'architettura data driven in unity - Codemotion Rome 2019
1. Sviluppare un'architettura data driven in
unity, un approccio semplice e leggero al
game modding.
Ivan Preziosi
Rome | March 22 - 23, 2019
2. IVAN PREZIOSI
● Classe 1976
● Di giorno: full stack web
developer
● Di notte: indosso le vesti
del game developer
● Quasi sempre lavoro da
solo
3. HARD TIMES - TEMPI DURI
Hard Times - Tempi Duri è un videogioco survival
urbano, nel quale ci si pone nei panni di un
senzatetto, alle prese con la sopravvivenza, in una
grande metropoli indifferente.
4. GAME MODDING
Un mod (abbreviazione dell'inglese modification,
modifica; in italiano usata sia al maschile sia al
femminile) è un insieme di modifiche estetiche e
funzionali a un videogioco, create da professionisti
oppure da giocatori appassionati, allo scopo di
aggiornare, migliorare o semplicemente rendere diverso il
gioco. (Wikipedia)
Counter Strike - Half Life
mod
PLAYERUNKNOWN's Battle Royale - Arma 3 mod
5. GAME MODDING
Grazie al modding possiamo trasformare il concetto
stesso di endgame: non più accesso a contenuti
sempre più difficili e prima preclusi, ma acquisizione
graduale di competenze utili a traslare il giocatore dal
ruolo di fruitore a quello di creatore.
RimWorld has a great support for modding the game
La creatività è una componente
imprescindibile di qualsiasi
attività ludica: senza di essa
fenomeni come la sospensione
dell’incredulità, l’immersione, la
simulazione, l’immedesimazione
proprie delle esperienze ludiche
non sarebbero possibili.
6. UNA DISTINZIONE (ARBITRARIA) TRA
APPROCCI AL GAME MODDING
DATA DRIVEN MODDING
Un approccio al game modding basato sulla modifica ed estensione
dello strato di dati di un gioco. In fase di progettazione si deve
cercare di rendere le logiche e le meccaniche del gioco modificabili
attraverso l’uso dei dati.
FUNCTIONAL MODDING
Si può modificare lo strato dati del gioco come sopra, ma
meccaniche e logiche vengono estese attraverso sistemi che
prevedano l’interpretazione e/o la compilazione runtime di codice
sorgente o di scripting fornito dall’utente.
7. FUNCTIONAL MODDING:
● Realizzazione di un
sandbox engine
● Maggiore complessità di
uso
● Maggiore flessibilità
● Potenziali problemi di
sicurezza
● Spesso utilizzo di software
proprietario (Unity assets
package/dll/interpreti)
● Documentazione? :(
DATA DRIVEN MODDING
vs
FUNCTIONAL MODDING
DATA DRIVEN MODDING:
● Logiche guidate dai dati
● Esposizione via JSON
● No total conversion
● Minore flessibilità
● Minori rischi di sicurezza
● Maggiore facilità di
implementazione
● Facilità di utilizzo
● Non richiede strumenti
terzi
8. DATA DRIVEN PROGRAMMING
La programmazione basata sui dati (Data Driven Programming)
è un paradigma di programmazione che prescrive una struttura
del software che renda possibile alterare il flusso e la logica
applicativa semplicemente andando a modificare lo strato dati,
senza andare a toccare il codice sorgente.
Si tratta di realizzare un'architettura di modding che esponga e
renda possibile agli utenti finali la modifica, l'espansione e la
manipolazione dell'intero strato dei dati di un gioco. Le
meccaniche di gioco devono essere progettate in modo da
poter essere modificate ed estese modificando
solo lo strato dei dati.
MINIMODDING
(DATA DRIVEN MODDING)
9. MINIMODDING IN HARD TIMES
● FACILITÀ DI IMPLEMENTAZIONE (passo più lungo della gamba!)
● SICUREZZA (non si possono iniettare logiche maliziose nel codice
sorgente)
● FACILITÀ DI UTILIZZO (modificare o aggiungere contenuti
originali al gioco diventa un’operazione semplice che non
richiede elevate competenze tecniche)
● NESSUNA NECESSITÀ DI SOFTWARE ESTERNI (il sistema si basa
su file json, png ed ogg, bastano un blocco note e degli editor
liberi come Gimp o Audacity)
● FACILITÀ DI DISTRIBUZIONE (i mod così realizzati sono auto
contenuti in uno zip, sono costituiti da formati semplici - testo e
dati -, non contengono codice e per importarli è sufficiente
scompattarli nella giusta cartella)
10. JSON SERIALIZATION
In informatica, la serializzazione è un processo per salvare un
oggetto in un supporto di memorizzazione lineare (ad esempio,
un file o un'area di memoria), o per trasmetterlo su una
connessione di rete. La serializzazione può essere in forma
binaria o può utilizzare codifiche testuali (ad esempio il formato
JSON) direttamente leggibili dagli esseri umani. Lo scopo della
serializzazione è di trasmettere l'intero stato dell'oggetto in
modo che esso possa essere successivamente ricreato nello
stesso identico stato dal processo inverso, chiamato
deserializzazione.
11. Full Serializer
<<Full Serializer is an easy to use and robust JSON serializer that just
works. It'll serialize pretty much anything you can throw at it and work
on every major Unity platform, including consoles.>>
12. PLAYER EFFECTS
Un esempio di come l’approccio al
modding data driven sia usato
nello sviluppo del gioco: i
PlayerEffects.
Tutte le interazioni tra il
personaggio e l’ambiente
circostante vengono mediate
dall’entità PlayerEffects, ovvero
effetti che si applicano al
personaggio modificandone le
statistiche. Tali entità sono
progettate per cercare di
descrivere il loro comportamento
attraverso i dati con cui sono
inizializzate.
14. STREAMING ASSETS IN UNITY
La maggior parte delle risorse in Unity vengono
combinate nel progetto quando viene creato. Tuttavia,
a volte è utile mettere i file nel normale filesystem sul
computer di destinazione per renderli accessibili
tramite il proprio path.
Qualsiasi file inserito in una cartella denominata
StreamingAssets verrà copiato letteralmente in una
determinata cartella sul computer di destinazione. È
possibile recuperare la cartella utilizzando la proprietà
Application.streamingAssetsPath.
(Unity Manual)
15. USO DEGLI STREAMING ASSETS
BOOTSTRAPSTREAMING ASSETS FILES
LOAD
VANILLA
LOAD BASE
LANG
LOAD USER
MODS
VANILLA MOD
BASE LANG
PERSISTENT DATA PATH
EXTRA LANG
USER MODS
LOAD MODS
LANG
16. MOD DATA FILESYSTEM
Anatomia di un Mod
All’interno della cartella del singolo Mod, è possibile
trovare la struttura contenente tutte le varie entità che
si possono manipolare tramite la modifica e l’aggiunta
di file json.
Application.persistentDataPath
MyMod
17. STRUTTURA RELAZIONALE MOD
CRAFTING
FURNITURE
Lo strato dati del gioco viene impostato rifacendosi al
concetto di database relazionale. Tutte le entità (items,
furniture, doors, scenes, ecc, ecc) sono organizzate in classi
Manager che ne tengono una lista aggiornata e, per ognuna,
una definizione data driven. Come se fossero tabelle e record
in relazione tra loro.
RECIPE
COLLECTION
ID_COLLECTION ITEMS ID + TYPE
REQUIRED ITEMS
RESULTING
ITEMS
18. STRUTTURA RELAZIONALE MOD
Oltre che dai dati le meccaniche di
gioco sono definite anche dalle
relazioni tra di essi. Il data layer
funziona un po’ come un database
relazionale.
19. INIZIALIZZAZIONE MOD ENGINE
Come se fosse un sistema di fixture in un
database, il motore di modding caricherà
ogni mod in fase di bootstrap.
Tale operazione è di fatto un’operazione di
import dati analoga al caricamento di una sql
fixture in fase di inizializzazione
dell’applicazione.
Lo strato dati del gioco viene interamente
popolato in questa fase.
20. INIZIALIZZAZIONE MOD ENGINE
BOOTSTRAP
LOAD MODS
SIGNATURE
VALIDATE MODS
SIGNATURE
LOAD ACTIVE
MODS DATA
DATA LAYER IS
READY
START GAME
La mods signature
descrive mod attivi ed
ordine di caricamento.
Viene conservata
localmente in un
PlayerPref
Cambiamenti fatti ai mod
attivi o aggiunte di nuovi
mod rendono necessario
un restart.
Tramite delle API
possiamo gestire il
download dei mod
sottoscritti e modificare i
mod attivi
L’ordine di caricamento dei
mod influisce sul loro
funzionamento. I mod
caricati dopo, possono
sovrascrivere i precendenti
Vanilla, il gioco base,
viene sempre caricato per
primo. Eventuali mod
successivi possono
sovrascriverne i valori.
21. INIZIALIZZAZIONE MOD ENGINE
BOOTSTRAP
MOD DATA - FILE SYSTEM GAME DATA LAYER
PNG SPRITES
JSON FILES
OGG AUDIO
LOAD MOD
DATA
CHECK MODS
AVAILABILITY
FULL
SERIALIZER
DESERIALIZE
DATA LAYER
MANAGERS
CONTENT
INITIALIZATION
RAM
POOLING
GAME
22. ORDINE DI CARICAMENTO
Un fattore importante nell’architettura di un sistema di mod è
quello di prevedere in che modo gestire il caricamento dei vari
mod, e come il loro ordine di caricamento influisca sul loro
funzionamento.
23. APPROCCIO ADDITIVO
vs
APPROCCIO SOSTITUTIVO
(un’altra distinzione arbitraria)
I vari manager oltre a mantenere una lista aggiornata di entità
(record) gestiscono anche le logiche di aggiornamento e
caricamento incrementale dei dati (aggiunta dei dati e/o
sovrascrittura degli stessi qualora si renda necessario).
24. APPROCCIO ADDITIVO
In Hard Times si è scelto di utilizzare, il più delle volte, un
approccio di tipo additivo. I dati caricati vanno, quando
possibile, ad aggiungersi ed a fondersi con quelli caricati in
precedenza.
Tuttavia, quando ciò non è possibile od auspicabile, essi
sovrascrivono eventuali impostazioni definite
precedentemente.
Per questo è di fondamentale importanza tenere a mente e
controllare l’ordine in cui i vari mod si caricheranno durante le
operazioni di bootstrap.
25. ESEMPIO ADDITIVO
Aggiungendo un nuovo
oggetto nella categoria
ClothingItem, stiamo
procedendo ad
un’operazione di aggiunta
additiva, in quanto
l’elemento si aggiunge
agli altri presenti nella
categoria.
26. ESEMPIO ADDITIVO
ITEMS
VANILLA
LOAD MOD
DATA
ITEMS_CATEGORY
ITEM 1
(Vanilla)
ITEM 2
(Vanilla)
ITEM 3
(Custom Mod)
ITEM 4
(Custom Mod)
ITEMS_CATEGORY
ITEM 1
(Vanilla)
ITEM 2
(Vanilla)
ITEM 3
(Vanilla)
CUSTOM MOD
ITEMS_CATEGORY
ITEM 3
(Custom Mod)
ITEM 4
(Custom Mod)
LOAD
VANILLA
DATA
LOAD
CUSTOM
MODS DATA
27. APPROCCIO SOSTITUTIVO
In taluni casi si procede ad utilizzare un tipo di approccio
sostitutivo nel caricamento di determinate entità.
Ad esempio, inserendo un WeatherDescriptor nel nostro mod
package, esso andrà a sovrascrivere eventuali istruzioni ed
impostazioni presenti in altri WeatherDescriptor che fossero
stati caricati precedentemente.
28. ESEMPIO SOSTITUTIVO
Nel caso del WeatherDescriptor
si è scelto di mantenere l’unità
e la coerenza interna del
componente. Si è ritenuto che
altrimenti potessero emergere
comportamenti anomali o
disorientanti nel caso in cui
fossero stati fusi tra loro due
descrittori, prendendo parte
delle impostazioni da un file e
parte dall’altro.
29. ESEMPIO SOSTITUTIVO
ITEMS
VANILLA
LOAD MOD
DATA
ITEMS_CATEGORY
ITEM 3
(Custom Mod)
ITEM 4
(Custom Mod)
ITEMS_CATEGORY
ITEM 1
(Vanilla)
ITEM 2
(Vanilla)
ITEM 3
(Vanilla)
CUSTOM MOD
ITEMS_CATEGORY
ITEM 3
(Custom Mod)
ITEM 4
(Custom Mod)
LOAD
VANILLA
DATA
LOAD
CUSTOM
MODS DATA
30. MOD REPOSITORY
PER MOD REPOSITORY SI INTENDE UNA
PIATTAFORMA ADIBITA ALLA RACCOLTA,
VALUTAZIONE, DISTRIBUZIONE DEI MOD. ESSA
PUÒ ANCHE OFFRIRE SERVIZI SOTTO FORMA DI
ACCESSO A DELLE API (MOD SUBSCRIPTION,
VOTI, UPLOAD, TAG, ECC)
31. MOD REPOSITORY
Scegliere il corretto approccio e la corretta
piattaforma per le proprie esigenze è molto
importante!
Nel mio caso ho preso in considerazione diverse
opzioni, valutandone pro e contro:
● Piattaforma proprietaria sviluppata ad hoc
● Steam Workshop
● ModDb.com
● Mod.io
32. Piattaforma proprietaria sviluppata ad hoc
● Costruita su misura per le mie esigenze
● Sicurezza da implementare
● Possibilità di integrazione e creazione API ad hoc
● Impegno elevato in termini di tempo e lavoro
● Trattamento di dati personali e privacy
● Possibilità di bug o problemi di solidità (!!!111!1!)
MOD REPOSITORY
33. ● Proprietario e disponibile solo per utenti
Steam
● Sicurezza già parzialmente implementata
● API integrabili con il proprio gioco
● Non richiede un impegno elevatissimo in
termini di integrazione
● Diffuso e familiare tanto per gli utenti quanto
per gli sviluppatori
MOD REPOSITORY
34. ● Indipendente e platform agnostic
● Sicurezza non pervenuta
● Non possiede API
● Non permette integrazione, si usa solo
tramite interfaccia web
● Diffuso e familiare
MOD REPOSITORY
35. ● Indipendente e platform agnostic
● Sicurezza: Antivirus Integrato
● Possiede un esteso sistema di API ed
integrazioni per l’autenticazione
● Integrazione piuttosto semplice
● Possibilità utilizzo anche via web
● Progetto relativamente nuovo e ancora poco
rodato (solo 10 giochi lo integrano)
● Strumenti di gestione del repository:
moderazioni, commenti, voti, sottoscrizioni,
donazioni ecc
MOD REPOSITORY