Open Creator13 opened 4 years ago
Klinkt al vrij ambitieus! Mijn belangrijkste tip is denk ik dat je echt de allersimpleste versie van wat je wil hebben zou moeten verzinnen. Bijv. Je kan als game designer in een level een trigger box maken die een gameplay variabele op 1 zet, deze wordt "gezien" door het dialoog systeem, en dit veranderd of je teskt 1 of 2 te zien krijgt.
State Machines zijn inderdaad vrij standaard voor dialogue, omdat je eigenlijk altijd ergens "bent", en dan een keuze maakt en ergens anders "heen gaat". Ideaal voor states, dus.
Ik heb ook ooit met game variabelen gewerkt die in een scene-omgeving te editen waren. Dit kwam eigenlijk neer op een Dictionary van int-waardes, die je via een editor window kon bevragen of instellen. Dat bevragen gebeurd dan via het letterlijk sequences van comparisons (gequal/lequal/equal/nequal), en dan met OR/AND deze dingen weer combineren. Dan kreeg je bijvoorbeeld: "boss1IsDead Equal 1 AND talkedToSomeNPC NotEqual 1 THEN StartCinematicGoTalkToNPC" (dit was visueel, kan ik wel een keer laten zien).
Eind op weg! Ben benieuwd hoe het je af gaat met de gamedata integreren als conditions. Enige tijd geleden was via het lectoraat interactive narrative Michael Mateas uitgenodigd, en die doet onderzoek naar "content selection architectures". Dus wellicht is zijn werk voor jou interessant om (eens, niet per se nu) er op na te lezen. Hij heeft met een aantal studenten/medewerkers ook recent nog iets gepubliceerd: https://mkremins.github.io/publications/StoryAssembler.pdf
En misschien heeft Christian Roth (van het lectoraat) nog wel toegang tot de presentatie slides van zijn CSA framework.
Dialogue system
Voor deze opdracht wil ik een dialogue system maken. Ik heb voor een eerder project al een beetje geprobeerd hier iets mee te doen en toen heb ik een rudimentair systeem in elkaar kunnen zetten op basis van het xNode framework. Dit was echter heel specifiek gemaakt voor die ene game en het bood heel weinig schaalbaarheid. Bovendien was de interface niet snel en daarom vervelend om mee te werken (tot op het punt van crashes).
Bestaande systemen
Er bestaan al verschillende systemen voor dialoog in Unity. Helaas is het merendeel betaald. Het eerste resultaat op de Asset Store als je zoekt op "Dialogue" heet letterlijk Dialogue System en kost rond de 60 euro. Deze tool ziet er nuttig uit, maar ook erg groot en de interface ziet er onoverzichtelijk uit.
Een ander systeem op de Asset Store is Discourse. Deze heeft de behoorlijke prijs van 80 euro. Ze claimen een simpel, lichtgewicht maar wel krachtig systeem te leveren. In de beschrijving staat dat er een state machine wordt gebruikt om de dialoog te leveren. Ook hebben ze gefocust op uitbreidbaarheid; ze claimen dat je meet enkele lijnen code nieuwe nodes kan toevoegen.
Iets wat alle systemen die ik tot nu toe heb gezien met elkaar gemeen hebben is dat ze een node-based state machine gebruiken om het systeem te implementeren. De systemen bieden ook node editors die in Unity draaien. Uit mijn ervaring met xNode heb ik geleerd dat zo'n interface niet altijd snel is.
Features en doelgroep
Mijn inspiratie kwam toen ik een game speelde waarbij het dialoog altijd klopte met de world state. In dat spel maakte het niet uit in welke volgorde je de quests speelt, het dialoog klopt altijd. Bij eerdere spellen was het vaak wel duidelijk dat bepaalde dingen vermeden werden, of dat er een hele specifieke volgorde voor quests was. Maar in dit spel was het spel duidelijk afhankelijk van de world state. Dit is natuurlijk moeilijk om te maken, dus ik zag er een mooie uitdaging in.
Mijn hoofddoelgroep is grote open-world games. Dit is het soort spellen waarbij asynchrone quests het meest voorkomen. Ik wil het echter niet alleen hierbij laten en ook simpelere games binnen de doelgroep trekken. Het belangrijkste is dat complexe dialogue trees simpel te maken zijn met het systeem wat ik ga maken.
De volgende features moeten er minimaal in zitten:
De volgende features zou ik er graag in willen verwerken:
Met de volgorde features wil ik rekening houden om ze in de toekomst nog toe te kunnen voegen:
Technologie
Toen ik ging zoeken naar manieren om een graafeditor te maken met custom styling kwam ik al gauw uit bij UIElements, het nieuwe UI-systeem van Unity. Waar xNode - dat gemaakt is op basis van IMGUI - langzaam wordt als er veel nodes in de editor zitten, zou UIElements een betere oplossing moeten zijn. Er worden namelijk veel minder volledige repaints van het scherm uitgevoerd. Daarnaast is UIElements flexibeler met custom styling. Het grote nadeel aan UIElements is dat er op dit moment niet zoveel documentatie voor is. Ook zou de hoeveelheid boilerplate die nodig is voor simpele vensters veel groter zijn. Dit is een probleem als ik deze tool binnen twee weken moet maken. Ik ben al tegen een library genaamd UIEX aangelopen die dit zou moeten versimpelen, maar ook hiervoor is er maar minimale documentatie beschikbaar.
Als ik het lichtgewicht en tegelijk snel wil houden lijkt de beste oplossing om zelf aan een UIElements venster te beginnen.