SlideShare a Scribd company logo
1 of 37
Sviluppare un'architettura data driven in
unity, un approccio semplice e leggero al
game modding.
Ivan Preziosi
Rome | March 22 - 23, 2019
IVAN PREZIOSI
● Classe 1976
● Di giorno: full stack web
developer
● Di notte: indosso le vesti
del game developer
● Quasi sempre lavoro da
solo
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.
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
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.
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.
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
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)
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)
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.
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.>>
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.
PLAYER STATS
HUNGERSTAMINASPEEDHEALTH
PLAYER EFFECTS
PLAYER EFFECTS
PASSIVE
ACTIVE
ENVIRONMENT
MISC EVENTS
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)
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
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
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
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.
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.
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.
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
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.
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).
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.
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.
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
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.
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.
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
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)
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
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
● 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
● Indipendente e platform agnostic
● Sicurezza non pervenuta
● Non possiede API
● Non permette integrazione, si usa solo
tramite interfaccia web
● Diffuso e familiare
MOD REPOSITORY
● 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
MOD REPOSITORY
APPROFONDIMENTI E FONTI
● http://www.tempi-duri.net/
● https://mod.io/ -
● https://en.wikipedia.org/wiki/Mod_(video_gaming)
● https://en.wikipedia.org/wiki/List_of_video_games_derived_from_mods
● https://en.wikipedia.org/wiki/Data-driven_programming
● https://www.moddb.com/
● https://forum.unity.com/threads/making-a-moddable-game.312490/
● https://www.reddit.com/r/Unity3D/comments/2dsxqm/how_easy_is_it_to_allow_for_modding_in_a_unity/
● https://github.com/jacobdufault/fullserializer
● https://erikchampion.wordpress.com/2012/12/20/game-mods-design-theory-and-criticism-book/

More Related Content

Similar to Ivan Preziosi - Sviluppare un'architettura data driven in unity - Codemotion Rome 2019

Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBSteve Maraspin
 
Deploy MongoDB su Infrastruttura Amazon Web Services
Deploy MongoDB su Infrastruttura Amazon Web ServicesDeploy MongoDB su Infrastruttura Amazon Web Services
Deploy MongoDB su Infrastruttura Amazon Web ServicesStefano Dindo
 
Deftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT Linux
Deftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT LinuxDeftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT Linux
Deftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT LinuxDeft Association
 
Deftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT Linux
Deftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT LinuxDeftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT Linux
Deftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT LinuxSandro Rossetti
 
Da A a Bot con un pizzico di Cognitive
Da A a Bot con un pizzico di CognitiveDa A a Bot con un pizzico di Cognitive
Da A a Bot con un pizzico di CognitiveAlessio Iafrate
 
Sistemi operativi proprietari
Sistemi operativi proprietariSistemi operativi proprietari
Sistemi operativi proprietariGiadarossi
 
Extended summary of 'Deep Learning for Video Game Playing'
Extended summary of 'Deep Learning for Video Game Playing'Extended summary of 'Deep Learning for Video Game Playing'
Extended summary of 'Deep Learning for Video Game Playing'kevinvargu
 
Node js dev day napoli 2016
Node js dev day napoli 2016Node js dev day napoli 2016
Node js dev day napoli 2016Michele Nasti
 
J2Me Il Micro Mondo Java
J2Me Il Micro Mondo JavaJ2Me Il Micro Mondo Java
J2Me Il Micro Mondo JavaAntonio Terreno
 
Elementidi informatica
Elementidi informaticaElementidi informatica
Elementidi informaticagiu89
 
MySQL 5
MySQL 5MySQL 5
MySQL 5jekil
 
Android Introduzione All Architettura Programmazione Sicurezza Serate A Tema ...
Android Introduzione All Architettura Programmazione Sicurezza Serate A Tema ...Android Introduzione All Architettura Programmazione Sicurezza Serate A Tema ...
Android Introduzione All Architettura Programmazione Sicurezza Serate A Tema ...jekil
 
Pomeriggio Entity Framework - WP7 e SQL Compact Edition
Pomeriggio Entity Framework - WP7 e SQL Compact EditionPomeriggio Entity Framework - WP7 e SQL Compact Edition
Pomeriggio Entity Framework - WP7 e SQL Compact EditionDomusDotNet
 
Hadoop [software architecture recovery]
Hadoop [software architecture recovery]Hadoop [software architecture recovery]
Hadoop [software architecture recovery]gioacchinolonardo
 

Similar to Ivan Preziosi - Sviluppare un'architettura data driven in unity - Codemotion Rome 2019 (20)

Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
 
Deploy MongoDB su Infrastruttura Amazon Web Services
Deploy MongoDB su Infrastruttura Amazon Web ServicesDeploy MongoDB su Infrastruttura Amazon Web Services
Deploy MongoDB su Infrastruttura Amazon Web Services
 
Deftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT Linux
Deftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT LinuxDeftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT Linux
Deftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT Linux
 
Deftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT Linux
Deftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT LinuxDeftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT Linux
Deftcon 2012 - Marco Giorgi - Acquisizione di memorie di massa con DEFT Linux
 
Da A a Bot con un pizzico di Cognitive
Da A a Bot con un pizzico di CognitiveDa A a Bot con un pizzico di Cognitive
Da A a Bot con un pizzico di Cognitive
 
Sistemi operativi proprietari
Sistemi operativi proprietariSistemi operativi proprietari
Sistemi operativi proprietari
 
3rd 3DDRESD: DB
3rd 3DDRESD: DB3rd 3DDRESD: DB
3rd 3DDRESD: DB
 
Extended summary of 'Deep Learning for Video Game Playing'
Extended summary of 'Deep Learning for Video Game Playing'Extended summary of 'Deep Learning for Video Game Playing'
Extended summary of 'Deep Learning for Video Game Playing'
 
Node js dev day napoli 2016
Node js dev day napoli 2016Node js dev day napoli 2016
Node js dev day napoli 2016
 
J2Me Il Micro Mondo Java
J2Me Il Micro Mondo JavaJ2Me Il Micro Mondo Java
J2Me Il Micro Mondo Java
 
Elementidi informatica
Elementidi informaticaElementidi informatica
Elementidi informatica
 
MODULO 1-Informatica di Base
MODULO 1-Informatica di BaseMODULO 1-Informatica di Base
MODULO 1-Informatica di Base
 
Game2vec
Game2vecGame2vec
Game2vec
 
MySQL 5
MySQL 5MySQL 5
MySQL 5
 
Android Introduzione All Architettura Programmazione Sicurezza Serate A Tema ...
Android Introduzione All Architettura Programmazione Sicurezza Serate A Tema ...Android Introduzione All Architettura Programmazione Sicurezza Serate A Tema ...
Android Introduzione All Architettura Programmazione Sicurezza Serate A Tema ...
 
couchbase mobile
couchbase mobilecouchbase mobile
couchbase mobile
 
Pomeriggio Entity Framework - WP7 e SQL Compact Edition
Pomeriggio Entity Framework - WP7 e SQL Compact EditionPomeriggio Entity Framework - WP7 e SQL Compact Edition
Pomeriggio Entity Framework - WP7 e SQL Compact Edition
 
Hadoop SAR
Hadoop SARHadoop SAR
Hadoop SAR
 
Hadoop [software architecture recovery]
Hadoop [software architecture recovery]Hadoop [software architecture recovery]
Hadoop [software architecture recovery]
 
Dbms
DbmsDbms
Dbms
 

More from Codemotion

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Codemotion
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyCodemotion
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaCodemotion
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserCodemotion
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Codemotion
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Codemotion
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Codemotion
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 - Codemotion
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Codemotion
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Codemotion
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Codemotion
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Codemotion
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Codemotion
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Codemotion
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Codemotion
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...Codemotion
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Codemotion
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Codemotion
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Codemotion
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Codemotion
 

More from Codemotion (20)

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending story
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storia
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard Altwasser
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
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.
  • 13. PLAYER STATS HUNGERSTAMINASPEEDHEALTH PLAYER EFFECTS PLAYER EFFECTS PASSIVE ACTIVE ENVIRONMENT MISC EVENTS
  • 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
  • 37. APPROFONDIMENTI E FONTI ● http://www.tempi-duri.net/ ● https://mod.io/ - ● https://en.wikipedia.org/wiki/Mod_(video_gaming) ● https://en.wikipedia.org/wiki/List_of_video_games_derived_from_mods ● https://en.wikipedia.org/wiki/Data-driven_programming ● https://www.moddb.com/ ● https://forum.unity.com/threads/making-a-moddable-game.312490/ ● https://www.reddit.com/r/Unity3D/comments/2dsxqm/how_easy_is_it_to_allow_for_modding_in_a_unity/ ● https://github.com/jacobdufault/fullserializer ● https://erikchampion.wordpress.com/2012/12/20/game-mods-design-theory-and-criticism-book/