Latest / Der GameDev Podcast (Game Dev) (MP3) / 89 - DROVA: Jetzt wird's Technisch!
Transcript
- 0:00Hallo kleine vorwarnung diese folge
- 0:03wird ein bisschen technischer zumindest teilweise und ich
- 0:06wollte nur noch mal darauf hinweisen dass es gibt kapitelmarken und
- 0:10ihr könnt gerne wenn ein thema irgendwie euch nicht ganz interessiert oder es
- 0:14irgendwie zu schwierig nachzuvollziehen ist weil gerade nicht auf ein bild gucken
- 0:18könnte was hier eingeblendet ist dann könnte auch das käme gerne überspringen
- 0:21also es wechselt immer mal so zwischen auch teilweise sehr technische sachen
- 0:24und dann kommen wieder so sachen die einfach super interessant zum zuhören sind
- 0:27und nicht so super technisch deep.
- 0:29Und genau, also nur falls ihr in der ersten Stunde schon irgendwas hört und
- 0:34dann sagt, okay, das ist mir zu krass und dann hört ihr auf.
- 0:39Das lohnt sich auf jeden Fall weiterzuhören, würde ich jetzt schon manchmal sagen.
- 0:44Und bezüglich Bilder übrigens, das hat alleine zwei Stunden gedauert,
- 0:47diese ganzen Bilder zusammenzutragen.
- 0:48Deswegen guckt die Bilder bitte an und erlaubt euch an ihn, damit sich das auch
- 0:52gelohnt hat, diese investierte Zeit.
- 0:54Und insgesamt hat die Folge zwölf Stunden, zwölfeinhalb Stunden Produktion gekostet.
- 0:59Aber das ist noch relativ wenig, weil nämlich da die ganze Research-Sache gar
- 1:03nicht mit reingezählt ist, denn das war ja in der letzten Folge.
- 1:06Also ich habe die ganze Research gemacht und es hat sich jetzt gelohnt,
- 1:10dass ich daraus zwei Folgen machen konnte sozusagen, weil wir ja nicht alle Fragen.
- 1:16Abgehandelt hatten. Allerdings muss ich sagen, habe ich jetzt,
- 1:19ihr werdet auch sehen, es gibt glaube ich vier noch extra Einsprecher.
- 1:22Ich habe nämlich noch ein bisschen extra Research gemacht mit ein paar Themen,
- 1:26die noch so on the fly aufgekommen sind. So, jetzt geht's aber los.
- 1:36Hallo und herzlich willkommen beim GameDiff-Podcast. Heute mit Kai. Hallo Kai.
- 1:41Hallo Simon, willkommen.
- 1:45Ja, du, nee, aber herzlich willkommen. Schön, wir sind hier bei,
- 1:49genau, wir kommen hier beide zusammen.
- 1:51Wir heißen uns beide willkommen. Und du bist nämlich da für,
- 1:54also Drova 2. Das ist mein Clickbait-Titel übrigens, Drova 2.
- 1:59Weil das ist die zweite Episode, wo wir über Drova reden.
- 2:03Aber ich habe echt überlegt, ob ich in dem YouTube-Thumbnail dann irgendwie
- 2:08so Drova 2.0 hinschreibe, um da noch ein paar Klicks abzugrasen.
- 2:14Wenn das jetzt irgendwelche Köder sind, dazu kann ich bisher aber selber noch nichts sagen.
- 2:18Achso, nee, du, keine Köder. Es ist einfach so, dass ich, ach,
- 2:22Marketing ist wirklich immer so ein schwieriges Thema.
- 2:25Und wenn ich diese YouTube-Thumbnails mache, dann auf der einen Seite bin ich
- 2:30immer so ein Fan von, ich möchte die Informationen,
- 2:33die im Podcast besprochen werden, zum Beispiel jetzt Pathfinding,
- 2:37Tools und Grafik, so auf der Thumbnail packen als Wörter, damit man einfach
- 2:42weiß, was man kriegt. so, ja.
- 2:44Aber gleichzeitig langweile ich mich selbst schon, weil das irgendwie so,
- 2:48weißt du, das ist nicht catchy, das macht keinen nicht irgendwie so richtig Lust auf mehr.
- 2:51Aber wenn da jetzt so was steht wie Drowa 2, dann denken alle,
- 2:54wow, Drowa 2, und dann klicken die drauf und dann.
- 2:58Ja, ich drücke die Daumen, dass es funktioniert auf jeden Fall.
- 3:01Du hast dir Gedanken gemacht.
- 3:02Ja, mal gucken, mal gucken. Du, genau, also du,
- 3:06okay, das würde es nicht überraschend sein, du hast auch an Drohwe mitgearbeitet
- 3:10und dein Name ist schon sehr, sehr oft gefallen in der letzten Episode,
- 3:17wo ich mit Chris schon sprechen konnte, aber irgendwann ist die Zeit ausgegangen
- 3:21und außerdem hast du ja ganz, ganz viel auch in Bereichen gearbeitet,
- 3:26wo er nicht gearbeitet hat.
- 3:27Und deswegen dachten wir, hey, es sind noch so viele Fragen übrig geblieben,
- 3:30da wollen wir noch mal einen Blick reinmachen.
- 3:33Ich bin sehr gespannt, ich freue mich auf jeden Fall, dass wir noch mal so ein
- 3:36bisschen die technische Seite dann auch noch mal erleuchten können.
- 3:40Genau, genau, genau. Es ist so spannend, was da noch alles kommt.
- 3:43Mal gucken, was wir alles heute
- 3:44abarbeiten können. Wir können aber noch ein, zwei Worte zu dir sagen.
- 3:50Dein Lebenslauf ist überraschend kurz auf LinkedIn.
- 3:53Also du hast studiert, ne? Dann Scientific Assistant und dann Prova.
- 3:59Ja, genau so war es.
- 4:03Genau, aber was ich gefunden habe, ist eine Website. Das fand ich nochmal interessant. Warte.
- 4:10Hä, wo ist es denn jetzt? Ah, genau, weiter unten. Und zwar …,
- 4:15gibt es eine Seite von, genau, eine Virtual and Augmented Reality Group.
- 4:21Und da taucht dein Name auf. Und da gibt es verschiedene Scientific Publications.
- 4:27Und da steht überall dein Nachname da.
- 4:29Und ich frage mich, ist das alles, hast du da überall mitgemacht?
- 4:32Also, weil das, das sind so ganz viele medizinische Applikationen mit Augmented
- 4:37Reality und Virtual Reality und sowas.
- 4:39Nee, da habe ich tatsächlich überall mitgemacht. Meine Bachelorarbeit,
- 4:42Ich glaube, das ist das dritte von unten, die Konzepte zur Diefendarstellung,
- 4:47bla bla, das war im Endeffekt meine Bachelorarbeit.
- 4:49Das da drüber war ein Paper und das da drüber war dann, glaube ich, meine Masterarbeit.
- 4:55Und über diese ganze VR, AR-Geschichte und über die Uni bin ich im Endeffekt
- 4:59nicht zur Spielentwicklung, aber zu Shadern und grafischen Effekten und so weiter
- 5:03gekommen, weil ich hier viel mit Shadern gearbeitet hatte.
- 5:06Und genau, nee, da habe ich überall mitgearbeitet, ja.
- 5:09Ach, das ist ja spannend, weil die letzte Episode oder eine vorherige,
- 5:14die 86, die gerade rausgekommen ist, ist nämlich die Vero zu Gast gewesen und
- 5:17sie ist Game Designerin für ein, also nicht direkt,
- 5:22jetzt muss ich überlegen, das ist nichts falsch zu sagen, doch genau,
- 5:25an der Uniklinik in Aachen.
- 5:26Und da geht es nämlich auch ganz viel um so medizinische Sachen.
- 5:30Und das passt ja einfach sehr, sehr gut zusammen gerade.
- 5:34Die haben dann dort auch mit so einem Holo-Table gearbeitet und damit wird auch
- 5:38rumprobiert, dann irgendwelche Visualisierungen zu machen und sowas.
- 5:40Aber es war halt einfach super spannend auch zu erfahren, dass es an einem Uniklinikum
- 5:44halt eine Game-Designerin gibt.
- 5:47Also die kümmern sich dann so um Applikationen eben auch so oder um Spiele,
- 5:51um Wissen zu vermitteln.
- 5:53Naja, Fenster, ja.
- 5:54Und was war denn dann deine Shader-Arbeit da?
- 5:57Also es hat relativ simpel angefangen mit der Bachelorarbeit,
- 5:59da war es einfach nur was quasi, also ich abstrahiere jetzt mal von der Medizin
- 6:02weg, du hast quasi einen Punkt im Raum gegeben,
- 6:04wo du dich sozusagen befindest und basierend auf diesem Punkt im Raum hat man
- 6:08dann bestimmte 3D-Modelle ein- oder ausgeblendet, ein- oder ausgefadet oder
- 6:12distanzcode-technisch verwendet.
- 6:17Wie nah bist du an dieser Struktur dran von diesem Punkt aus.
- 6:20So hatte das damals angefangen und später dann mit dem AR-VR war es auch viel,
- 6:27ich hatte viel später mit 3D-Volumendatensätzen gearbeitet und hatte dafür einen
- 6:31Shader programmiert, um den halt zu visualisieren.
- 6:33Und dieser Volumendatensatz wurde dann verzerrt und verschoben,
- 6:37um aus der Position deines Kopfes seinen Visualisierung so anzupassen,
- 6:42dass es tatsächlich so wirkt, als ob du um eine Projektion in 3D herumgehen kannst.
- 6:48Hat nur für eine Person leider funktioniert. Aber genau, und da habe ich viel dann mitgemacht.
- 6:54Und dann auch in dem Shader zum Beispiel
- 6:56Clipping Planes eingefügt oder verschiedene Sachen auf jeden Fall.
- 7:01Aber alles so grob dieselbe Richtung.
- 7:04Also Clipping Planes, damit man zum Beispiel so ein Gehirn in Streifen schneiden
- 7:08kann und dann einfach gucken kann, wie es drin aussieht oder so?
- 7:11Genau, in dem Fall war es der Oberkörper, der Torso.
- 7:15Und wenn du einen 3D-Volumendatensatz gegeben hast, gibt es ja an jedem Voxel,
- 7:19sage ich mal, eine Farbe.
- 7:21Und deswegen kannst du zum Beispiel gar nicht reingucken, weil du siehst zum
- 7:23Beispiel vielleicht erst das Fleisch oder die Haut, aber du willst vielleicht
- 7:26dir die Knochen angucken.
- 7:27Und dann kannst du entweder die Transferfunktion, nennt sich das,
- 7:30so verändern, dass halt Strukturen mit höherer oder niedriger Intensität dargestellt werden.
- 7:34Aber du könntest auch einfach von oben einfach was wegschneiden,
- 7:38sodass du einfach so zack, weg.
- 7:39Und dann kannst du einfach die Hälfte des Thorses angucken als Beispiel.
- 7:42Ja, genau, so ein bisschen wie, na gut, im Bio-Unterricht haben sie immer das
- 7:47Plastikmodell auseinandergenommen, aber es gibt sowas in Houdini auch, wer es kennt,
- 7:52so eine Slice-Funktion, dass man halt in Volumen schneiden kann,
- 7:56um da eben so ein Volumen betrachten zu können. Aber das andere habe ich nicht verstanden.
- 8:01Du hast ein Volumen und abhängig von wo dein Kopf ist.
- 8:05Es ist ein bisschen tricky am besten, warte, ich versuche mal,
- 8:07es gibt glaube ich ein Video dazu in meinem besten Englisch.
- 8:13Ich weiß nicht, was ich glaube, man muss es runterladen, aber ich glaube,
- 8:15man kann es hier runterladen auf der Website.
- 8:18Also im Endeffekt, wenn du sagen, gehen wir mal weg von diesem Anwendungsfall,
- 8:21du hast einen Projektor und der Projektor projiziert ein 3D-Modell an die Wand.
- 8:25Wenn du dann drum herum gehst, um diese Projektion, dann bleibt ja der Punkt,
- 8:30von wo aus es projiziert wird, gleich, aber du veränderst deine Position.
- 8:34Das heißt, du siehst es irgendwann verschoben.
- 8:36Nicht so, wie wie es 3D-technisch tatsächlich wäre. Und durch die Kopfposition
- 8:40konnte man Visualisierung so anpassen, dass sie sich sozusagen mitbewegt hat,
- 8:45während du dich bewegst.
- 8:46Aber auf die Art und Weise, dass es eigentlich dann 3D-perspektivisch korrekt ist.
- 8:52Ah, okay. Das heißt, ich stehe in einem steileren Winkel zur Wand,
- 8:56gucke so von der Seite auf diese Beamer-Projektion sozusagen.
- 9:00Und ich sehe dann aber zum Beispiel den Tor so von der Seite irgendwie.
- 9:05Genau, genau.
- 9:06Ah, das ist ja interessant, ja.
- 9:08Funktioniert vor allem hier sehr gut im Video, wenn du das Video anguckst.
- 9:11Wir hatten ein paar Leute, mit denen hatten wir so Tests gemacht,
- 9:14die haben das irgendwie, auch als sie es verwendet haben, nicht so ganz gecheckt
- 9:18und waren irgendwie so, wie das soll sich mitbewegen und so.
- 9:21Man muss zuerst sich so ein bisschen reindenken, damit es wirklich funktioniert,
- 9:24aber so auf Video-Ebene klappt das tatsächlich sehr gut.
- 9:26Das ist übrigens eine Sache, die auch bei dem Holotable interessant war,
- 9:30weil da hast du genau dasselbe Problem.
- 9:31Dieser Holotable, der würde ja auch ein Rendering machen von einer Perspektive
- 9:37und damit verschiedene Menschen das aus verschiedenen Perspektiven sehen können,
- 9:42hat jeder eine Brille auf und der Holotable sendet mehrere Renderings auf verschiedene
- 9:46Lichtwellen aus und dann kann man das so filtern und alle Brillen holen sich
- 9:50dann eine andere Welle rein und dann kann man das so sehen.
- 9:52Das hat man tatsächlich ja auch gemacht. Wir hatten auch so eine Shutterbrille.
- 9:55Da hätte man es theoretisch für zwei Leute quasi darstellen können,
- 9:58weil halt so für linkes und rechtes Auge.
- 10:00Man konnte sie dann so konfigurieren, dass zum Beispiel eine Person auf beide
- 10:03Augen nur die linke Sicht sehen oder auf beiden Augen nur das rechte.
- 10:06Und dann hätte man zwei verschiedene Projektionen auch starten können.
- 10:10Aber das war dann nicht mehr Teil des Themas.
- 10:12Okay, interessant. Ich habe wegen den Schädern übrigens gerade gefragt,
- 10:16weil während der Research mit der Aufnahme Vero bin ich auf dieses Video gestoßen,
- 10:21und zwar Realistic Tissue Rendering for VR.
- 10:24Da geht es halt eben darum, dann eben Schädler zu schreiben,
- 10:28die möglichst realistisch sind,
- 10:29so wie Haut oder innere Organe aussehen, aber eben in VR, was ja nochmal eine
- 10:34Herausforderung ist, weil man eben nicht so viel Performance hat,
- 10:39aber es muss ja möglichst realistisch aussehen, damit man gut ausgebildet werden kann.
- 10:43Sieht auf jeden Fall sehr, sehr cool aus. Auch ein bisschen eklig,
- 10:45die eine Stelle, aber schon krass, wo wir so gelandet sind heutzutage.
- 10:50Ja, das stimmt, genau. Ja, cool, spannend. Und ich muss sagen,
- 10:54Respekt, du hast acht Publications hier. Also acht Publications.
- 10:58Einträge, das ist ja schon ...
- 11:00Ich hatte halt, als ich an der Uni angefangen habe, war auch so ein bisschen
- 11:03ein Thema, ob ich einen Doktor mache oder nicht.
- 11:05Ich wollte eigentlich von Anfang an nicht. Der Prof hätte gern gewollt,
- 11:08dass ich eins gemacht hätte, sag ich mal.
- 11:10Ein Doktorandenstatus, wie auch immer.
- 11:13Aber dann kam leider Drova dazwischen und dann musste ich sagen, tut mir leid.
- 11:17Diese Videospiel-Fame.
- 11:18Weiß ich, ohne Drova, muss ich zugeben, hätte ich vielleicht einen Doktor gemacht, aber ...
- 11:22Aber so, also, also, aber, ja, ich frag mich halt, also, war, also ...
- 11:28Wie kam denn so die Entscheidung dann für Drova? Weil das ist ja schon eine
- 11:32Unternehmung, die sehr risikobehaftet ist. Man weiß ja nie, was läuft.
- 11:36Es ist ein super Spiel geworden, aber auch Superspiele können leider untergehen.
- 11:41Vor allem, das war ja auch unser erstes Projekt, man hatte ja gar keine Glaskugel,
- 11:45um irgendwie in die Zukunft zu schauen.
- 11:46Genau.
- 11:47Im Endeffekt hat sich das eigentlich sehr organisch entwickelt.
- 11:49Ich hatte halt während der Uni schon mit Chris ein paar kleinere Spiele gemacht.
- 11:53Und dann haben wir halt auch in Mandrova angefangen. Aber da hatten wir nur
- 11:56nicht das Ziel, was es jetzt im Endeffekt geworden ist.
- 11:59Und hatten das so auch in, wir kommen aus Magdeburg, da gab es so einen kleinen Videospielpreis.
- 12:04Und da hat Mandrova eingereicht und das hat sehr gut funktioniert.
- 12:06Hatten dann auch ein paar Kontakte mit Leuten aus der Spieleentwicklungsszene,
- 12:10die dann auch sagen, hey, es hat Potenzial, ganz cool, sah bei weitem nicht so cool aus wie heute.
- 12:14Und dann haben wir Johannes und Julia mit ins Team bekommen und irgendwie hat
- 12:18sich das so organisch immer weiterentwickelt, ist immer größer geworden und
- 12:22dann kam ja auch Deck 13 irgendwann dazu, die dann auch Entgesser hatten.
- 12:25Und dann hat sich das schon so angefühlt, wie eigentlich sind alle Schienen
- 12:28und alle Straßen eigentlich schon gut gelegt.
- 12:30Eigentlich muss man die Straße jetzt nur so ein bisschen entlang gehen.
- 12:33Ob es einen Erfolg hat oder nicht, ist was anderes, aber initial fühlte sich
- 12:37das für mich eigentlich schon,
- 12:39nach einem schönen Weg an, als ich mich dann dazu entschieden hatte,
- 12:43dort, also dann nicht weiter an der Uni zu arbeiten.
- 12:47Und genau, jetzt, was sind so deine Gedanken jetzt? Bereust du es?
- 12:52Oder sagst du, nee, das war schon der richtige Entscheidung?
- 12:55Ach nee, war schon die richtige Entscheidung. Natürlich, also ich erhabe das
- 12:58manchmal so, was wäre, wenn, aber eigentlich bin ich kein Mensch,
- 13:00der was wäre, wenn Fragen stellt, weil was wäre, wenn,
- 13:03kann man nie richtig beantworten, weil du kennst ja nur die Perspektive,
- 13:06die du hast, weil du den Weg gegangen bist, den du gegangen bist und angenommen,
- 13:09im Kopf stelle ich mir irgendwas schöner vor,
- 13:12dann gibt es aber auch negative Punkte, die es dann irgendwie vielleicht runtergezogen hätten.
- 13:15Ich bin auf jeden Fall sehr froh, dass ich den Weg gegangen bin.
- 13:18Auch jetzt, also diese technischen Sachen an der Uni haben mir echt Spaß gemacht
- 13:22und auch so viel auch mit Hardware gearbeitet und dann auch zu sehen,
- 13:25dass es verwendet wird irgendwo.
- 13:26Aber so dieses ganze Paper Schreiben und wissenschaftliche Arbeiten und Zitieren
- 13:31und dieser ganze Schmarrn, nenne ich es mal, das war so gar nicht meins.
- 13:35Ja, ja.
- 13:36Okay. Ja, wäre vielleicht eine Frage, die ich am Anfang hätte stellen können,
- 13:40aber eigentlich so, wie geht's dir denn eigentlich gerade so?
- 13:44In Klammern, also so gerade in dieser Post-Release-Phase, Droh war es raus,
- 13:49ihr habt jetzt auch die ersten Patches schon da, das heißt, jetzt sollte ja
- 13:52ein bisschen Ruhe eingekehrt sein, so wie geht's dir, wie fühlst du dich,
- 13:55wie fühlt sich das alles gerade an?
- 13:56Ja, mir geht es gerade super soweit. Hatte jetzt aber, glaube ich,
- 14:00viel durch die Weihnachtsferien zu tun. Hättest du mich vor den Weihnachtsferien
- 14:02erwischt, wäre meine Antwort vielleicht anders gewesen.
- 14:05Aber nee, gerade bin ich tatsächlich eigentlich sehr entspannt.
- 14:07Es ist jetzt auch deutlich ruhiger geworden.
- 14:09Vor den Weihnachtsferien hatten wir nochmal einen Patch rausgehauen.
- 14:12Der war nochmal ein bisschen intensiver, weil wir da nur wenige Wochen Zeit
- 14:15hatten, um ihn rauszuhauen. Wir wollten den so ein bisschen teilen mit dem Steam-Sale.
- 14:18Da war viel Inhalt drin. Das war nochmal ein bisschen stressig.
- 14:21Und genau, alles in einem war natürlich auch der Release irgendwo sehr stressig
- 14:24und dann auch die ganzen Sachen nachzupatchen und so weiter und so fort,
- 14:27aber allmählich und stetig, stetig,
- 14:32stetig, stetig, whatever, ist es dann immer entspannter geworden und gerade
- 14:36ist es eigentlich eine sehr, sehr schöne Phase.
- 14:38Okay, warte, jetzt muss ich aber mal, ich hab's ja durchgezockt,
- 14:42jetzt will ich natürlich immer wissen, was war denn in dem Patch drin?
- 14:45Das ist das Problem, man darf Spiele nicht zu früh spielen, weil dann kommen
- 14:48die ganzen coolen Inhalte nicht, also zu spät, an, die hat man ja noch nicht gehabt.
- 14:52Mal sehen. Oh, es gibt eine neue Difficulty.
- 14:55Genau.
- 14:56Insane Hardcore. Wow. Ich glaube, ich habe es auf Classic gespielt und ich sehe,
- 15:01es gibt ein, zwei, drei, vier, fünf noch andere Schwierigkeitsstufen.
- 15:06Was gibt es noch? Was ist denn noch Neues, Cooles dazu?
- 15:08Im Großen und Ganzen haben wir Hardcore und Insane eingebaut.
- 15:11Hardcore ist im Endeffekt, wenn du stirbst, Game Over.
- 15:13Kannst du aber auch spielen auf Klassisch, das heißt dem Bekannten Schwierigkeitsgrad oder auf Insane.
- 15:18Und Insane ist eigentlich, da haben wir eigentlich alles nochmal an Werten angepasst.
- 15:21Also die Gegner haben teilweise auch andere Graphen, also die verhalten sich auch aktiv anders.
- 15:26Jeder Gegner oder fast jeder Gegner hat eine neue Attacke. Es gibt auch neue
- 15:28Gegnervarianten und auch einen neuen Gegner.
- 15:31Und insgesamt sind einfach sagen wir mal die Schadenswerte der Gegner hochgeschraubt.
- 15:34Es gibt auch ein paar andere Balancing-Anpassungen, wie zum Beispiel,
- 15:37dass Lehrer mehr Geld wollen, um dann auch da so ein bisschen nochmal nachzuprobieren.
- 15:43Weil manchmal war es doch sehr leicht, irgendwie an den Lehrer zu kommen.
- 15:45Und im Großen und Ganzen ist es einfach nochmal ein Schwierigkeits für Leute,
- 15:48die einfach Bock haben. Jo, drüber habe ich durchgespielt.
- 15:51Jetzt hätte ich gerne mal eine neue Challenge. Möchte aber nicht nur,
- 15:53dass einfach Gegner stärker sind, sondern es soll sich auch noch ein bisschen
- 15:57anders und uniker anfühlen. Und das haben wir da vor allem eingebaut.
- 16:01Und sonst sind die anderen Changes, was den klassischen Modus angeht,
- 16:04habe ich gerade auch nicht ganz im Kopf, aber das ist, glaube ich,
- 16:07eher Richtung Bugfixing und Co.
- 16:08Auf jeden Fall gibt es hier eine Challenge No-Hit-Run. dass man da nicht einmal
- 16:13getroffen wird. Okay, ich bin raus.
- 16:17Okay, cool. Ja, schön. Das ist doch schön.
- 16:22Ja, finde ich auch.
- 16:23Gut zu hören, ja. Habt ihr jetzt mal Plan für,
- 16:28also ich meine, klar, ihr habt jetzt gerade Weihnachtsferien,
- 16:30aber Weihnachtsferien sind ja auch immer so ein bisschen hin,
- 16:32man fährt zur Familie und so und dann ist Silvester und so richtig ganz dolle Urlaub ist es ja dann,
- 16:38also zumindest bei mir dann auch nicht unbedingt, Weil eben dieses ganze Reisen
- 16:42und Festivities sind halt teilweise auch ein bisschen, also schön,
- 16:46aber auch irgendwie anstrengend.
- 16:48Habt ihr denn jetzt eigentlich mal einen Plan zu sagen, okay Leute,
- 16:50jetzt haben wir fünf Jahre durchgeackert, wir haben jetzt geil gepatcht so und
- 16:54jetzt machen wir mal drei Wochen wirklich richtig Urlaub?
- 16:58Also für mich hat sich das tatsächlich jetzt schon so angefühlt über die Weihnachtsfeiertage,
- 17:02weil es für mich jetzt mal irgendwie so zwei Wochen am Stück war,
- 17:05wo ich jetzt eigentlich gar nicht das Projekt geöffnet habe oder nichts wirklich
- 17:09dran gearbeitet habe, deswegen hat es sich für mich schon so angefühlt,
- 17:12entsprechend ist da zumindest jetzt erstmal demnächst nichts weiter geplant,
- 17:15außer halt private Urlaube, die man halt irgendwie so einpflegt ins Jahr, sage ich mal.
- 17:19Okay, ja, ich finde das tatsächlich immer gar nicht mehr so einfach,
- 17:23weil auf der einen Seite, also man denkt ja…,
- 17:25Ich finde, es ist auch schön, zusammen zu feiern. Und wenn man dann released
- 17:29hat, dann ist, wenn man, sagen wir mal so, wir nehmen jetzt mal an,
- 17:33das Spiel wäre perfekt an dem Status, also wie es früher war,
- 17:36dass man auch auf Cartridge released, und dann muss das Spiel ja wirklich,
- 17:38wirklich fertig sein zu dem Punkt.
- 17:40Und an diesem Punkt könnte man ja sagen, so, und jetzt alle in Urlaub.
- 17:43Alle gehen jetzt in Urlaub. Und das fühlt sich dann aber auch für mich so ein
- 17:47bisschen leer an, weil man da ja gar nicht mehr so die Zeit zusammen verbringt.
- 17:50Und dann noch, oh, und wir gucken jetzt gemeinsam Streams oder so was.
- 17:54Und jetzt ist natürlich die realistische Herangehensweise meistens,
- 17:58dass man dann eben nicht zu Release in Urlaub gehen könnte, wegen,
- 18:01weil noch Patches und Community-Management zu tun ist und sowas.
- 18:04Aber irgendwann rutscht man
- 18:06dann auch so wieder in die nächste Projektentwicklung schon wieder rein,
- 18:09weil man zu lange wartet und dann ist auch wieder so der Zeitpunkt nicht da,
- 18:14um zu sagen, okay, jetzt machen wir mal wirklich so eine kleine Durchartenpause
- 18:18und kommen dann später nochmal zusammen.
- 18:20Also wir hatten ja eine Release-Party, da sind wir auf jeden Fall einmal zusammengekommen
- 18:23und haben zumindest mal einen Abend richtig ordentlich gefeiert.
- 18:26Ja.
- 18:26Und jetzt, wo auch ein bisschen der Stress raus ist, wollen wir auf jeden Fall
- 18:30auch mehr so ein bisschen im Team wieder ein bisschen vielleicht auch mal zocken
- 18:33abends. Das hatten wir auch vor Weihnachten einmal gemacht.
- 18:35Und es steht auch im Raum, ob wir vielleicht so ein bisschen zusammen als Team wegfahren.
- 18:39Als Blockhütte haben wir das ein bisschen deklariert.
- 18:41Aber müssen wir mal gucken, da ist noch nichts Konkretes geplant.
- 18:44Aber auf jeden Fall wollen wir so ein bisschen in diese Richtung auch gehen.
- 18:47Ich blende zumindest gerade mal ein Bild ein von eurem Release-Kuchen.
- 18:50Ihr habt nämlich einen tollen Release-Kuchen.
- 18:53Kuchen gehabt.
- 18:53Der war echt ziemlich fancy.
- 18:55Mit Drova-Logo. War das von der Bäckerei nehme ich an, ne?
- 18:57Ich glaube nicht. Ich glaube, es hat Chris' Freundin gemacht.
- 19:01Ja, schön.
- 19:02Ich war sehr beeindruckt, auf jeden Fall.
- 19:05Okay. Du, es gibt eine große Kontroverse, über die wir reden müssen.
- 19:08Und zwar habe ich ein TikTok gefunden, wo du sagst, dass du kein C++ magst.
- 19:13Oh ja, das stimmt. Kontroverse, also ich würde sagen, das ist Fakt quasi.
- 19:18Ach so, okay. Na gut, also, okay. Damit du das besser verstehst,
- 19:22ich bin ja eigentlich 3D-Artist und habe mich dann in die VFX-Richtung entwickelt.
- 19:26Und so ein bisschen Programmierung mache ich auch am besten mal,
- 19:29aber das ist dann eher so ein bisschen Scripting. Aber ich bin jetzt nicht so ganz tief im Code.
- 19:34Und deswegen, aus meiner Perspektive, ist es immer so, weiß ich nicht, alle machen C++.
- 19:38Oder jetzt halt C-Sharp, aber C++, wenn man cool ist, macht man C++. Das ist so meine naive,
- 19:46Einstellung oder Wahrnehmung. Deswegen dachte ich, das wäre eine Kontroverse, aber ...
- 19:49Also ich glaube, das ist es auch, je nachdem, wen du so ein bisschen fragst.
- 19:52Natürlich, wenn du mich fragst, gibt es da nicht so viel Spielraum.
- 19:56Aber es gibt auf jeden Fall, also wir haben ja auch zum Beispiel genau in diesem
- 19:59TikTok-Video, wo wir das, glaube ich, auch thematisiert haben.
- 20:02Und wenn man mal in die Kommentare schaut, wenn ich mich recht erinnere,
- 20:03ist es schon eine kleine Kontroverse auch. Aber ich glaube, es liegt daran,
- 20:06dass viele Menschen sich einfach sehr stark mit ihrer Programmiersprache identifizieren,
- 20:10die sie so am liebsten mögen.
- 20:11Ich dann ja natürlich auch mit C-Sharp. Und die dann entsprechend auch verteidigen,
- 20:15wenn andere Leute nicht der Meinung sind.
- 20:17Und für mich fühlt sich C++ einfach ein bisschen altbacken an.
- 20:21Das hat sehr viele so, ich nenne es mal Artefakte, wo man so merkt,
- 20:24ja, das hat man wahrscheinlich damals so gemacht und das ist jetzt halt noch
- 20:27so drin, weil die Sprache ist halt noch, wie die Sprache ist.
- 20:30So ein bisschen technisch zum Beispiel dieses Pragma-Once oder If-and-Dev,
- 20:33was du mal am Anfang von diesen Dateien machst, das finde ich super nervig und
- 20:35warum macht er das nicht automatisch, muss man eh immer tun.
- 20:38Oder auch Sachen in Header und Source-Files auslagern, gerade wenn man da mit Vererbung arbeitet,
- 20:43hast du plötzlich vier Dateien, die du anpassen musst, wenn du deine Methode
- 20:46vielleicht umnennen möchtest und das alles sind für mich so Produktivitätsstopper,
- 20:52die mich primär nerven, weshalb ich C-Sharp deutlich angenehmer finde,
- 20:56weil ich da mehr das Gefühl habe, in einen Flow zu kommen und einfach Sachen zu schaffen quasi.
- 21:00Wobei natürlich, wenn man wahrscheinlich in C++ sehr, sehr gut ist,
- 21:03man da wahrscheinlich auch reinkommt.
- 21:04Da war ich dann vielleicht noch nicht auf dem Level, dass das irgendwann so
- 21:07zur Second Nature geworden ist.
- 21:08Ja, aber so ist meine Meinung dazu.
- 21:11Ja, ich finde es ganz interessant, dass du sagst, dass das Ding das ja automatisch
- 21:17machen könnte, weil das ist das Erste, was man vor allem so,
- 21:20wenn man das erste Mal programmiert und diese doofe Meldung kommt, da fehlt ein Semikolon.
- 21:25Und das zeigt dir aber auch an wo. Dann denkt man sich ja auch, dann mach es doch hin!
- 21:31Das ist so der erste Gedanke, warum geht das nicht mehr automatisch?
- 21:35Ja, wobei ich da wieder, weil ich bin es wahrscheinlich wieder gewohnt,
- 21:38Semicolons zu machen, da würde ich sagen, da mach halt eins.
- 21:40Das würde mich darum weniger stören, ich glaube, weil ich das schon so in meinen
- 21:43Workflow so integriert habe wahrscheinlich.
- 21:45Aber ich kann verstehen, was du meinst mit diesen Header und Source-Files,
- 21:48die man dann irgendwie rumliegen hat und dann an verschiedenen Stellen was ändern muss.
- 21:52Weißt du, ich habe nämlich mit, also eigentlich habe ich mit QBasic angefangen,
- 21:55aber bin später auch in Pascal.
- 21:56Und da war es dann immer so, da musste man auch immer, wenn man eine Funktion
- 22:00machen wollte, muss man den Header der Funktion ganz oben einmal definieren
- 22:05und dann unten die Funktion halt auch nochmal, also nochmal denselben Header
- 22:09und dann die Funktion schreiben.
- 22:10Da habe ich auch immer gedacht so, ey, warum?
- 22:13Das macht wirklich keinen Spaß.
- 22:16Ja, so ist das bei C++ auch, nur dass es dann nochmal in verschiedenen Dateien liegt.
- 22:19Ach, schön.
- 22:20Ja, oder?
- 22:21Ja, das klingt wirklich ein Traum. Ich bin ganz froh, dass ich da nicht so tief drin stecke.
- 22:26Aber ich dachte mal, das bringe ich hier mal an, weil es ganz,
- 22:28Ich finde es ein spannendes Thema, wie verschiedene Leute auf sowas blicken
- 22:31und vielleicht ist es ja auch eine schöne Diskussion.
- 22:34Wir haben ja einen Discord-Channel und für jeden Podcast gibt es auch einen
- 22:37eigenen kleinen Thread dort und dann könnt ihr eure Meinung zu C++ und C und
- 22:42C-Sharp und so weiter gerne mal reinschreiben.
- 22:45Nur vielleicht nochmal als Disclaimer so hinterher, ich würde natürlich nicht
- 22:48sagen, dass C-Sharp objektiv die bessere Sprache ist oder C++ objektiv die schlechtere,
- 22:53kommt natürlich auf dem Anwendungsfall darauf an und je Hardware-H du bist Hardware näher, so rum,
- 23:00desto eher geht man auch in C++-Richtung und C++ hat auch schon so ein bisschen
- 23:03so seine Beauty irgendwie mit Pointern und so weiter rum zu hantieren,
- 23:07ja, aber ich brauche es halt in meinem Alltag einfach nicht.
- 23:10Was ich halt, aber das ist vielleicht auch nicht nur sprachenabhängig,
- 23:14gehört habe, ist, auf der einen Seite hat man keine Wahl je nach Engine,
- 23:17die man benutzt, weil zum Beispiel Unreal ist halt C++ und wenn man da,
- 23:20also abgesehen von Blueprints natürlich und dann muss man das halt,
- 23:23da hat man keine Wahl und was ich immer mal gehört habe, das habe ich aber nie
- 23:26selbst am eigenen Leib, aber das wäre ja auch ein spannendes Thema vielleicht, um über Drova zu reden.
- 23:32Es gibt ja die Garbage Collection, also dass man eben nicht den Speicher manuell
- 23:37anfordert und freigibt wie in C++, dort muss man alles manuell machen.
- 23:43C-Sharp ist dann so ein bisschen, ja, komm, ich handle das, aber irgendwann
- 23:46kommt das große Müllauto und räumt alles mal weg, was nicht mehr gebraucht wird
- 23:52und dann kann es aber auch zu Zuckeln kommen.
- 23:54Ja, ja.
- 23:56Und das war bestimmt auch ein Problem in Drohwar, oder?
- 23:59Auf jeden Fall. Also man weiß das ja so ein bisschen, wenn man es viel scharf entwickelt.
- 24:04Hey, irgendwo ist ein Garbage-Collector, irgendwo gibt es da mal ein bisschen
- 24:07Zeug und irgendwann räumt er so ein bisschen auf. Ja, ja, passt schon,
- 24:09passt schon, passt schon.
- 24:10Aber unser Spiel ist dann irgendwann doch sehr groß geworden und wir simulieren
- 24:14sehr viel, zum Beispiel wo NPCs wann hingehen in der ganzen Welt,
- 24:17auch wo der Spieler nicht ist.
- 24:18Und die machen da sehr viel Stuff auch offscreen. Und wenn man dann die Chunks
- 24:22rein- und rauslädt, kommt auch sehr viel Garbage rein und ja,
- 24:26irgendwann schlägt's halt zu und man weiß halt nicht wann, ist so ein bisschen unpredictable.
- 24:31Das mussten wir dann natürlich auch gegen Ende, haben wir sehr viel daran gearbeitet,
- 24:34diese Garbage, also alles, was Garbage erzeugt, zu reduzieren.
- 24:37Also nicht alles in C-Sharp macht Garbage, nur bestimmte Sachen und die,
- 24:40die diesen Garbage erzeugen, das haben wir dann am Ende auch sehr viel profiled,
- 24:44optimiert, möglichst weit reduziert, dass das halt möglichst wenig ist und dann
- 24:48auch, man kann so Pings geben an den Garbage-Collector, zu sagen,
- 24:51hey, jetzt wäre ein guter Zeitpunkt, das aufzuräumen.
- 24:54Das heißt nicht, dass er dann aufräumt, das heißt nur, dass du jetzt sagst,
- 24:57dass es jetzt ganz gut wäre.
- 24:59Und das nutzen wir natürlich auch in der Hoffnung, dass er das dann möglichst
- 25:02zeitnah tut und gerade in Dardoscreens als Beispiel.
- 25:05Aber so hundertprozentige Kontrolle hat man da leider nicht drüber.
- 25:10Das heißt leider auch so Vorteil, dann braucht man sehr wenig Zeit da natürlich
- 25:13auch reinstecken, das alles manuell irgendwie zu managen.
- 25:16In der Informatik ist leider alles immer so, hat Vor- und Nachteile.
- 25:19Dann kriegst du irgendwo einen Plus, dann kriegst du auch irgendwo einen Minus.
- 25:21Und da muss man immer so ein bisschen so einen Pay-Off angucken, was man halt tun möchte.
- 25:26Genau, und für den Kontext, was du mit Chunks meinst, ihr habt nämlich ja ein
- 25:31Streaming-System eingebaut in das Spiel, ne?
- 25:34Genau, genau. Also man muss sich ja vorstellen, wir haben ja eine Open World,
- 25:37das heißt, du kannst jederzeit in jede Himmelsrichtung gehen.
- 25:39Und obwohl es nur 2D-Pixel-Grafiken sind, nimmt das alles schon sehr viel Arbeitsspeicher
- 25:44und RAM weg und auch auf der Grafikkarte und die Atletik,
- 25:49Texturen und Atlase, die dort dann geladen sind, die man braucht,
- 25:52um dieses Objekt dann zu rendern, das Spiel wäre viel zu groß,
- 25:55würde man alles zeitgleich quasi geladen lassen.
- 25:58Und deswegen müssen wir halt zu bestimmten Zeitpunkten im Spielen neue Content
- 26:01reinladen und rausladen. Und das haben wir über ein Chunk-System.
- 26:05Das sind quasi so Quadrate in der Welt, die dann immer so geladen sind,
- 26:08dass man immer genau die Kamera quasi ausfüllt, bestmöglich.
- 26:11Und dann werden die halt rein- und rausgeladen.
- 26:13Ach so, genau. Und das war noch eine Sache. Ich glaube, das hatte Chris erwähnt,
- 26:16dass dieses Problem vor allem mit der Switch aufgetreten ist,
- 26:20weil alles über zwei Gigabyte, da stürzt das Ding einfach ab.
- 26:23Und wahrscheinlich auf PC wäre es vielleicht noch ohne Chunk-System gegangen, oder?
- 26:28Also vielleicht, aber dann würde man natürlich auch die Low-End-Geräte nicht so gut bedienen können.
- 26:33Also ich fand es eigentlich ganz praktisch im Nachhinein, dass wir die Switch
- 26:36mit im Kurs hatten, weil wir dann doch so viel optimiert haben,
- 26:39dass es hoffentlich auf jedem Rechner möglichst gut läuft, sofern man irgendwie
- 26:43ein bisschen Hardware verbaut hat.
- 26:45Und deswegen bin ich eigentlich ganz froh, dass es so ist. Und andererseits
- 26:49gibt es auch manchmal Spiele, die sehr viel Hardware-Anforderungen haben,
- 26:52wo man sich so fragt, warum?
- 26:54Ich finde, das kommt auch nicht so gut an, so ein bisschen. Deswegen bin ich
- 26:57eigentlich sehr froh darum, dass wir gezwungen waren, das ein bisschen runter zu skalieren.
- 27:00Ich denke trotzdem nicht, dass wir die ganze Welt hätten geladen lassen können.
- 27:03Aber wir hätten auf jeden Fall mehr laden können, sagen wir,
- 27:06das Vierfache oder sowas.
- 27:07Ich finde es auch immer super spannend, wie einfach man den PC immer noch auslasten kann.
- 27:13Also es ist relativ einfach, einfach schlechte Performance zu erreichen.
- 27:17Überraschend einfach dafür, dass die Hardware ja schon extrem leistungsfähig
- 27:20ist eigentlich, aber es ist,
- 27:22Doch überraschend einfach alles. Und dann sieht es trotzdem nicht gut aus.
- 27:26Aber sag mal, warum, das frage ich mich jetzt, warum kostet es es denn so viel
- 27:32Speicher, NPC-Simulationen zu machen?
- 27:34Also nicht unbedingt die spezifisch. Also an NPCs hängt bei uns sehr viel mit dran.
- 27:40Also theoretisch, wenn sie geladen werden würden, hätten sie ihre Kleidung.
- 27:42Das sind dann wiederum Texturen, die geladen sind.
- 27:45Die haben dann ihre Items, die sie bei sich tragen. Und die Items haben zum
- 27:49Beispiel Referenzen auf eine Fähigkeit, die sie feuern. und sagen wir mal ein
- 27:53Feuerball oder so und dann muss ja auch die Grafik von dem Feuerball geladen
- 27:56sein und weil der Feuerball geladen ist, der macht ja auch einen Sound.
- 27:59Also im Endeffekt eine Kette und im Großen und Ganzen beginnt ein NPC bei uns
- 28:03diese ganze Kette an Dingen, die er benötigt, damit er für sich vernünftig funktioniert.
- 28:08Gegen Ende haben wir es sehr stark noch vereinfacht, dass dann tatsächlich nicht
- 28:11so viel Stuff geladen werden muss, aber es hat ein bisschen gedauert,
- 28:15um die ganzen Sachen rauszukicken.
- 28:17Und ein NPC, damit er sich gut bewegen kann, braucht dann ja auch Pathfinding,
- 28:20Das heißt, er muss Informationen über seine Umgebung haben. Die Umgebung ist gar nicht geladen.
- 28:24Dazu haben wir quasi auch so einen Graph. Der war am Anfang auch noch ein bisschen
- 28:27anders und hatte sehr viel Speicher an sich gefressen.
- 28:30Und jetzt haben wir aber das auch noch mal umgebaut gehabt, dass das eher über
- 28:33Polygone läuft, die dann so ein bisschen weicher, freundlicher sind.
- 28:38Genau. Und im Endeffekt sind das gerade, glaube ich, 150 NPCs ungefähr ohne
- 28:42Gegner. Das heißt, wenn man die Gegner ... Also, es ist einfach die schiere
- 28:44Anzahl im Großen und Ganzen.
- 28:46Ah, okay, klar. Wenn man alles dazu ...
- 28:50Klar, da macht das Sinn, genau. Aber das finde ich interessant,
- 28:53weil ich hatte, ich erinnere mich bei X-Rebirth, was manchmal so,
- 28:57dass wenn du das Spiel gestartet hast und du hast das erste Mal zum Beispiel
- 29:00geschossen, dann kann es sein, dass du deine Bullet nicht gesehen hast,
- 29:03weil die Textur noch nicht geladen war.
- 29:05Und bei der zweiten kam es dann, und das hat mich sehr geärgert als WFX-Artist dann.
- 29:09Und dann konnte ich sagen, ich konnte manche Texturen forcen,
- 29:14also erzwingen, dass die immer geladen werden.
- 29:16Weil alles andere war sehr dynamisch, sozusagen. Und ich finde es interessant,
- 29:21dass es bei eurem System, ist das normal in Unity oder ist das euer System,
- 29:26was gesagt hat, nö, nö, wenn wir hier irgendwie nur einen kleinen Fitzel von
- 29:30irgendwas laden, zum Beispiel ein NPC,
- 29:32dann nehmen wir aber auch bitte alles, also alle Grafiken, alle Audio und so und auch alle Effekte.
- 29:36Ist das von Haus aus bei Unity so oder?
- 29:39Also ich denke, wenn man von Haus aus Tutorials folgt, die man online sieht, dann ja.
- 29:44Ich würde aber nicht sagen, dass Unity sagt, das ist the way,
- 29:47der gegangen werden muss.
- 29:49Aber es ist entsprechend auch der, also ich hatte das ja mit Chris damals angefangen,
- 29:52Drovo, und es hat einfach Quellkau-technisch sehr viele Altlasten.
- 29:55Heutzutage würden wir diese ganzen Systeme vermutlich auch deutlich anders und
- 29:57optimierter aufziehen und das dann ähnlich machen wie bei dem Beispiel,
- 30:00das du gebracht hattest, dass man die Textur und die Grafik nochmal explizit
- 30:03entkoppelt von dem Rest der Logik und dann nur on demand zum Beispiel lädt.
- 30:07Dann hoffentlich ein bisschen smarter, dass man die Textur dann auch sieht.
- 30:10Aber nee, im Großen und Ganzen hat das einfach einen Seiteneffekt durch unsere
- 30:12Softwarearchitektur und wir haben tatsächlich auch recht spät angefangen.
- 30:15In Unity nennt sich das Addressables, dass Dinge quasi adressiert werden können
- 30:20und deswegen können sie dann zu einem bestimmten Zeitpunkt rein- und rausgeladen
- 30:23werden, streamed werden quasi.
- 30:25Und das System haben wir einfach sehr spät eingebaut und wir hätten diese Kette
- 30:29unterbrechen können, aber das hätte sehr viele Seiteneffekte gehabt.
- 30:32Wir hätten sehr viel mehr noch programmieren müssen, um dann die ganzen Problemcases,
- 30:35die dadurch auftreten, zu verhindern. Und das haben wir einfach zu spät angefangen.
- 30:40Ja gut, aber jetzt ist es ja super, denn jetzt werden ja eh nur die geladen, die in der Nähe sind.
- 30:44Genau, genau.
- 30:45Äh, passt das. Aber hier, Spezialfall, es gibt ab und zu mal NPCs,
- 30:51die laufen einen ganzen Weg.
- 30:54Also es gibt in dem Spiel, vielleicht sollte man auch ganz kurz mal beschreiben,
- 30:57worüber wir überhaupt reden.
- 30:58Drova ist ein 2D, äh, 2D Rollenspiel von Vogelperspektive mit einer Open World.
- 31:06Und in dieser Open World gibt's, ähm, zwei große Lager.
- 31:09Und es gibt manchmal den Fall, dass ein NPC sagt, jo, ich geh mal zu einem anderen
- 31:13Lager. Und dann laufen die da wirklich hin.
- 31:15Und jetzt wäre die Frage …
- 31:17Was bedeutet das für dieses System? Weil sobald der NPC dann aus dem Bildschirm
- 31:23raus ist, könnte er ja eigentlich rausgeschmissen werden aus dem Speicher.
- 31:28Aber die Logik muss ja irgendwie weiterlaufen, dass der jetzt zu einem anderen
- 31:31Lager läuft und irgendwann dann auch dort ankommt.
- 31:33Genau, bei uns ist das so, also es stimmt nicht ganz, dass sie 100 Prozent rausgeladen,
- 31:37also sie werden irgendwann bei uns rausgeladen, aber vor allem auch viel diese
- 31:40grafische Repräsentation.
- 31:41So ein Platzhalter bleibt in der Welt quasi zurück, der dann tatsächlich auch
- 31:46diesen Weg entlang läuft und wenn du denen dann näher kommst,
- 31:48dann wird der Platzhalter wieder ausgetauscht durch den tatsächlichen NPC,
- 31:51aber der hat zum Beispiel weniger Informationen, der würde zum Beispiel durch
- 31:54Wasser gehen als Beispiel oder der geht nicht richtig durch Pathfinding oder
- 31:58mancher läuft da durch Wände oder so und erst wenn man denen dann näher kommt,
- 32:01stellt er irgendwie fest, okay, Pathfinding wo bin ich denn?
- 32:03Und dann geht er wieder so back on track quasi und läuft auch viele Wegpunkte
- 32:06entlang, um aber auch diese Cases zu vermeiden.
- 32:10Und... Harte, worauf wollte ich hinaus? Aber ja, deswegen ist das,
- 32:13so wird das erstmal bei uns gehandhabt.
- 32:15Es gibt bestimmte Spezialfälle, wenn der Spieler weit genug weg ist,
- 32:18dass wir ihn tatsächlich zum Beispiel teleportieren.
- 32:21Oder wenn zu viel Zeit vergangen ist, dass er nicht wirklich den ganzen Weg
- 32:24läuft, sondern was weiß ich, ich laufe als Spieler irgendwie vor und bin dann
- 32:28in Nemeton zum Beispiel angekommen, ist ein Lager bei uns in der Welt.
- 32:30Der NPC-Ast muss sein, den du am Anfang triffst.
- 32:33Und jetzt ist er, vielleicht wird er für einen Dialog benötigt,
- 32:36aber er ist einfach zu weit weg in der Welt und dann sagen wir,
- 32:38ja, dann porten wir einfach her. Und dann ist er dann halt auch einfach da.
- 32:41Aha, interessant. Weil wir über Memory gesprochen haben. Also,
- 32:46ihr habt verschiedene Tools benutzt.
- 32:48Ich habe eine ganze Liste, zum Beispiel den Odin-Inspektor oder das A-Star Pathfinding
- 32:54Project und anderes davon, das passt gerade, weil wir über Speicher gesprochen
- 32:58haben, ist das Memory-Pack.
- 33:00Das gibt's auf GitHub und das ist ein Memory-Pack-Serializer.
- 33:09Was macht das?
- 33:11Erstmal als so ein bisschen Disclaimer, es geht ein bisschen in die Johannes-Richtung.
- 33:14Ich weiß zumindest inhaltlich, worum es da geht, aber der könnte auf jeden Fall
- 33:16technisch da besser drüber erzählen.
- 33:18Im Großen und Ganzen, warum NPCs auch sehr teuer waren am Anfang,
- 33:22sind die Dialoge von denen.
- 33:24Da steckt ein Dialogtree dahinter, der hat Knoten, die sind verbunden,
- 33:27da sind Choices drin, da sind Bedingungen drin, wann diese Knoten im Dialog
- 33:31gesagt werden dürfen oder wann ich mich dafür entscheiden kann und wann nicht.
- 33:34Und dann gibt es Subgrafen für verschiedene Kapitel oder für Quests und so.
- 33:39Und im Großen und Ganzen war auch ein großes Performance-Problem einfach die
- 33:43Größe von diesem Dialoggrafen.
- 33:46Da haben wir ein Tool benutzt von Unity, also nicht von Unity selbst,
- 33:50sondern aus dem Asset Store.
- 33:51Also jemand hat das entwickelt und in Unity im Store zur Verfügung gestellt.
- 33:54Das haben wir für dieses Grafentool verwendet. Und das hat einfach sehr,
- 33:57sehr schlecht skaliert mit sehr vielen NPCs und mit sehr vielen Grafen.
- 34:00Und was wir dann dort umprogrammiert haben, ist quasi die Art und Weise,
- 34:03wie dieses Grafensystem seine Daten serialisiert und deserialisiert.
- 34:07Und dafür haben wir dieses Memory Pack Tool quasi verwendet,
- 34:10weil das einfach deutlich performanter war als das, was dort schon quasi gegeben war.
- 34:15Das Serialisieren, Deserialisieren muss man sich so vorstellen,
- 34:18im Endeffekt liegt da, sagen wir, das ist jetzt übertrieben,
- 34:20es ist kein Textdokument so direkt, aber ein Textdokument auf dem PC,
- 34:23der sozusagen diesen Graphen mit diesen Knoten in den Verbindungen repräsentiert.
- 34:28Und man muss dann ja aus diesem serialisierten Text, also serialisiert insofern,
- 34:32er ist einfach so Line für Line hintereinander angeordnet, dann ja irgendwie
- 34:37ein Objekt erzeugen, was nicht mehr so Line-by-Line ist. Und das nennt sich
- 34:41dann Deserialisierung.
- 34:43Ja, weil man ja von der ersten Zeile zur 50. springen kann, je nachdem,
- 34:47was ich aussuche in dem Dialog. Baum oder ...
- 34:51Nicht gar nicht. Also, wie man es sich eher vorstellen muss,
- 34:55stell dir vor, du hast eine Textur. Und eine Textur, sagen wir mal, ist zweidimensional.
- 34:59Das heißt, du hast ja pro Pixel einen Eintrag.
- 35:02Und du möchtest es jetzt aber auf die Festplatte ablegen. Und die Festplatte
- 35:05kennt nur linearen Speicher.
- 35:07Also du kannst nur Dinge in linear ablegen sozusagen.
- 35:11Das heißt, du musst ja irgendwie deine 2D-Textur nehmen und es so darstellen,
- 35:15dass es jetzt in eine Line passt oder in den Speicher passt.
- 35:18Und dieser Vorgang vom Serialisieren, also zum in den Speicher packen oder deserialisieren,
- 35:24aus dem Speicher quasi ein tatsächliches Objekt erzeugen, das anders miteinander,
- 35:28ist recht technisch auf jeden Fall.
- 35:30Das meint Serialisieren, deserialisieren. Also wie kommt es auf die Festplatte
- 35:34und wie wird es von der Festplatte geladen sozusagen? Ich glaube, das ist einfacher.
- 35:38Aber ist nicht der Speicher, also RAM oder Grafikkanspeicher oder Festplattenspeicher
- 35:45dieselbe Art im Sinne von, wie die Daten draufliegen, nämlich einfach linear?
- 35:49Das stimmt. Die liegen dann trotzdem natürlich linear beieinander, aber ...
- 35:54Jetzt wird es recht technisch. Das stimmt schon, aber sie können an verschiedenen
- 35:59Speichern im Speicher liegen und dadurch dann zum Beispiel auch unterbrochen sein.
- 36:03Aber dann brauchst du ja einen bestimmten Speicher, der auch wiederum sagt,
- 36:05dass die beiden in Verbindung stehen.
- 36:07Und das ist zum Beispiel mit diesem Knotensystem, dass man sagt,
- 36:09okay, dieser Knoten hat zwei Verbindungen zu zwei anderen Knoten und jeder Knoten
- 36:12ist ein Part im Speicher und die Verbindungen sind ein Part im Speicher.
- 36:15Und irgendwie muss es ja eine Verbindung geben, welche Teile des Speichers liegen
- 36:20beisammen und welche nicht.
- 36:21Und dass die jetzt nicht mehr linear beieinander liegen, das ist quasi der deserialisierte Part.
- 36:25Und wenn ich das aber auf die Festplatte speichern würde, dann ist es der serialisierte
- 36:29Part und dann liegen alle Sachen auch nah beieinander, damit es auch als eine
- 36:32Datei zum Beispiel vorliegen kann.
- 36:34Ja, also man kennt das ja so ein bisschen unter Fragmentierung auch.
- 36:37Also wenn die Daten fragmentiert sind, dann liegen halt sie überall in kleinen
- 36:41Fetzen verteilt im Speicher. und dann gab es früher das wunderbare bei 95D-Fragmentierungstool, was so,
- 36:50es hat so eine Befriedigung ausgelöst, zu sehen, wie die kleinen Blöcke zusammengerückt
- 36:54werden und so und Ordnung gemacht wird.
- 36:56Ja, das kenne ich auch, da habe ich auch viel verwendet früher oder mein Vater
- 36:58wollte immer, dass wir es verwenden oder so.
- 37:00Weiß nicht, ob es wirklich was getan hat, aber was du schon meinst,
- 37:02die Visualisierung war auf jeden Fall dabei auch sehr, sehr schön.
- 37:04Ja, aber was ich mich jetzt frage, also dieses, ich zitiere,
- 37:09das Memory-Pack-Ding, Da steht da auf der GitHub-Page Zero Encoding Extreme
- 37:14Performance Binary Serializer for C-Sharp und Unity.
- 37:17Und da steht einfach nur so eine kleine Grafik, dass das 200 mal schneller ist
- 37:21wie irgendwelche JSON-Response-Model, whatever.
- 37:25Warum ist das nicht von Haus aus dann einfach drin in Unity?
- 37:29Wenn das so super ist.
- 37:31Also Unity, also warum es das spezifisch nicht hat, ist eine gute Frage,
- 37:34das kann ich nicht beantworten.
- 37:37Unity selbst hat natürlich auch eine Art zu serialisieren und die Art,
- 37:40wie Unity serialisiert ist, auch schneller als wie unser Asset-Pack,
- 37:43was wir verwendet hatten für die Graphen, was irgendein Grund haben die ihr
- 37:46eigenes Serialisierungstool, Pipeline, wie auch immer programmiert und die war vor allem nicht so gut.
- 37:51Die von Unity ist auf jeden Fall besser, aber ich glaube, der Memory-Pack bla
- 37:54bla bla ist wahrscheinlich trotzdem deutlich besser als der von Unity.
- 37:57Warum der so schnell ist, ist weil der sehr viele Predictions,
- 38:00nicht Predictions, Vorwissen voraussetzt.
- 38:03Zum Beispiel markiert man bestimmte Attribute in seiner Klasse und sagt,
- 38:06alles klar, das liegt an der Stelle 0, das liegt an der Stelle 1.
- 38:10Also es gibt quasi Conditions oder Voraussetzungen, wann man es verwenden kann,
- 38:14damit es so schnell ist. Und das macht es aber wiederum weniger flexibel.
- 38:19Das ist das, was ich auch vorhin schon mal meinte, in der Programmierung hat
- 38:21alles leider immer Vor- und Nachteile.
- 38:24Und Unity ist da, glaube ich, einfach den Weg gegangen, einfach die möglichst
- 38:28große Gruppe an Usern anzusprechen.
- 38:31Ich habe übrigens auf diese GitHub-Page einen Satz gelesen, den möchte ich einfach
- 38:36gerne mal vorlesen, weil es einfach so lustig ist.
- 38:38Ich finde es immer lustig, ich bin jetzt irgendwie seit 15 Jahren in der Branche
- 38:40und wie gesagt, kein richtiger Programmierer und so, aber so ein ganz bisschen
- 38:44technisches Wissen habe ich ja auch.
- 38:46Und dann lese ich diesen Satz und ich sehe einfach nur Worte und verstehe gar
- 38:49nichts. Was habe ich denn lesen vor?
- 38:51Mal gucken, ihr könnt euch in den Kommentaren ja melden, ob ihr jetzt versteht, was ich sage.
- 38:56Zero Encoding ist ähnlich wie Flatbuffer, aber es braucht einen besonderen typen.
- 39:02Memory Pack Serialization Target ist Poco.
- 39:05Okay, ich meine, das Einzige, was ich daraus mitnehme, ist, dass es anscheinend
- 39:09was mit einem Möbelhaus zu tun hat, weil es gibt dieses Poco-Möbelhaus.
- 39:13Ja, also toll, das ist doch eine tolle Erklärung, oder? Da wissen wir doch genau, was gemeint ist.
- 39:18Ja, willkommen in der Welt der Informatik.
- 39:22Genau, du hast verschiedene Dinge jetzt schon erwähnt eben, auf die ich jetzt
- 39:27Bezug nehmen könnte und ich weiß gar nicht, welches das erste ist,
- 39:30doch wir fangen mit etwas Kleineren an, was auch nochmal ganz humoristisch war.
- 39:33Ihr habt nämlich ein schönes Beispiel
- 39:35für alten Code bei euch auf TikTok vorgestellt. Das fand ich ganz toll.
- 39:40Und zwar ging es da um das Waffenziehen. Warte, jetzt muss ich noch gucken, wo ist das denn jetzt?
- 39:46Also ich kann es kurz beschreiben. Ihr habt da irgendwie geguckt,
- 39:50welche Musik läuft und abhängig davon konnte der NPC die Waffe ziehen oder nicht.
- 39:54Irgendwie sowas in die Richtung war. Das war ein schönes Beispiel,
- 39:56wie Code natürlich wächst und irgendwann vielleicht nicht mehr ganz so optimal ist.
- 40:03Also das Beispiel dort war, wir wollten einmal herausfinden,
- 40:07hey, befindet sich dieser oder befindet sich der Spieler gerade im Kampf oder nicht?
- 40:11Weil das war im Endeffekt so die programmiertechnische Abfrage,
- 40:13die wir dort machen wollten.
- 40:14Und wir hatten etwas Ähnliches programmiert, um dann halt Combat-Musik abzuspielen.
- 40:18Und die Abfrage ist im Endeffekt sowas gewesen wie Musik-Händler.ist-Player-in-Combat.
- 40:23Und natürlich ist die Abfrage, ob der Spiel am Combat ist, nicht relevant,
- 40:27also relevant fürs Musiksystem.
- 40:29Aber das Musiksystem sollte nicht dafür verantwortlich sein,
- 40:32zu sagen, ob der Spiel am Combat ist oder nicht.
- 40:34Und das war das, was wir dann gepostet haben, was halt so historisch so ein
- 40:38bisschen gewachsen ist. Mittlerweile tut das übrigens nicht mehr.
- 40:40Und da haben sich dann die Leute auch sehr drüber amüsiert oder auch so gesagt,
- 40:43ey, was seid ihr denn für Leute? Problemieren wir richtig.
- 40:47Genau, das Video hat 60 Kommentare. Das scheint getriggert zu haben.
- 40:50Ja, aber ich finde so eine Beispiele
- 40:51ganz toll. Und das ist auch schön bei euch, dass ihr so offen zeigt.
- 40:56Weil am Anfang in dem Video sagt Chris auch so, ja, man glaubt ja immer,
- 40:59dass die Leute, die Spiele machen, dann immer alles perfekt machen,
- 41:02aber nee, nee, der Code ist manchmal auch.
- 41:05Da können vielleicht auch nochmal vielleicht Zuhörer googeln.
- 41:08Es gibt sehr schöne Kommentare im GTA 5 Quellcode, glaube ich.
- 41:12Das kann man einfach mal googeln.
- 41:14Von sehr, sehr witzigen Sachen, wo man dann auch sieht, ja, vielleicht ist da
- 41:18nicht alles immer so perfekt.
- 41:19Ich habe gerade keinen richtigen Beispiel im Kopf, aber das sind sehr,
- 41:21sehr witzige Kommentare, sowas wie, ja, ich mach das jetzt hier,
- 41:24weil ich weiß auch nicht, aber wenn ich es nicht mache, funktioniert es halt nicht.
- 41:27Und dann kommt irgendein Methodenaufruf oder sowas.
- 41:29Und das sind schon schöne Sachen dabei, auf jeden Fall.
- 41:32Aber wer ist denn da an den Quellcode von GTA gekommen?
- 41:36Das ist eine gute Frage, das kann ich darum nicht beantworten.
- 41:37Weil die Kommentare werden ja immer weggelöscht, wenn man dann,
- 41:41also selbst wenn man jetzt die Echse,
- 41:45disamplizieren, heißt das, glaube ich, also dekompilieren, dekompilieren würde,
- 41:49dann würden die Kommentare ja nicht drinnen.
- 41:51Das ist eine gute Frage, da bin ich mir gerade selber nicht so sicher.
- 41:54Eventuell wurde es auch geleakt oder so?
- 41:56Ja, kann schon sein. Oder halt einer der EntwicklerInnen hat das geteilt.
- 42:02Kann ja auch sein, dass es von intern kam.
- 42:04Nein, kam es nicht. Der Quellcode wurde geleakt.
- 42:08Und das ist natürlich ein bisschen unangenehm. Da kann man die ganzen schönen
- 42:11Kommentare nämlich lesen. Und das ist ein kleiner Rückblick auf die Jahresrückblicksfolge.
- 42:15Da haben wir darüber gesprochen, warum es bei Epic Richtlinien für Code gibt.
- 42:19Und das ist ein wunderbares Beispiel dafür, warum man auch, wenn man glaubt,
- 42:23dass die Öffentlichkeit niemals
- 42:25lesen wird, sich vielleicht doch an so ein paar Regeln halten könnte.
- 42:28Denn ja, wenn man dann eben den Code geleakt bekommt, zeichnet das vielleicht
- 42:33ein bisschen ein blödes Bild von der Firma.
- 42:35Denn ich werde jetzt mal gleich ein paar Kommentare einspielen,
- 42:38die wirklich ganz witzig sind. Im Grunde genommen fluchen sie die ganze Zeit.
- 42:41Das wirkt natürlich jetzt auch nicht so super professionell,
- 42:44aber werde ich jetzt nicht einspielen. aber es ist halt so, dass auch ein paar
- 42:47Kommentare benutzen halt das Wort retardet als Schimpfwort und das ist ja so
- 42:52ein bisschen verbraucht, sag ich mal, ne?
- 42:55Und genau, und ich finde es aber gerade einfach ein schönes Beispiel,
- 42:58weil wir haben ja in der Jahresrückblicksfolge genau darüber gesprochen und
- 43:02uns dann gefragt, ja, ist das jetzt zu wichtig, weil das ist ja eigentlich nur
- 43:06für intern, bla bla bla und so.
- 43:08Und hier ist ein gutes Beispiel, warum Dinge von intern plötzlich zu extern
- 43:13wechseln können. Aber jetzt die Kommentare. Das muss man sein,
- 43:17das Schittes-Code in der gesamten Spiel ist. Just fucking kill me.
- 43:23Hackfix, bis die Arten zuhören, um auf der fucking Luft zu legen,
- 43:27unter der Cut-Off-Height, die wir alle aufschlossen haben.
- 43:31Ich werde nicht sogar beginnen zu sagen, dass ich weiß, was da ist hier passiert.
- 43:36Das macht das Schiff wirklich lang. Aber ohne es, es wird Krass.
- 43:40Wenn das Fails, wir sind. Aber es sollte niemals verlieren, als es nur vier Shows gibt.
- 43:47Aber ich wollte noch eine Frage dazu. Ach genau, weil dieses System festzustellen,
- 43:53ob man im Combat ist, das ist ja auch ein interessantes Thema,
- 43:56weil das ist ja gar nicht so einfach. Äh ...
- 44:01Oder?
- 44:01Nee, also es kommt natürlich auch so ein bisschen, also so, wir hatten dafür,
- 44:04wir haben auch jetzt auch immer noch sehr viele Probleme, also das System,
- 44:07ob man im Combat ist oder nicht,
- 44:09bezieht sich momentan, so fragen wir es, glaube ich, auch wieder Johannes so
- 44:12ein bisschen in Richtung, ist, wenn ein Gegner den Spieler als Ziel hat,
- 44:18mit der Intention, ihn anzugreifen.
- 44:19Das ist gerade aktuell unsere Definition von, ob der Spieler im Combat ist oder
- 44:22nicht. Aber wenn ich einfach durch die Spielwelt tingle und meine Waffe nicht
- 44:25mal gezogen habe, dann würde ich mich als Spieler nicht fühlen,
- 44:29als ob ich gerade im Combat bin.
- 44:30Und deswegen gibt es da so verschiedene Clashes, die manchmal passieren,
- 44:34wo das Spiel entweder denkt, du bist im Combat und du fühlst dich nicht im Combat
- 44:37oder manchmal bist du im Combat, aber das Spiel denkt nicht, dass du im Combat bist.
- 44:41Da gibt es manchmal so false positives, sage ich mal so ein bisschen.
- 44:44Aber im Großen und Ganzen ist das gerade aktuell unsere Definition,
- 44:47ob man im Combat ist oder nicht.
- 44:49Das war mir das erste Mal bewusst geworden, als ich an einer Raumschiffssimulation mitgearbeitet habe.
- 44:54Und da ist es so, dass die feindlichen Schiffe, die siehst du im Weltall ja
- 44:58schon auf krasse Distanzen.
- 45:00Also ist halt ein 3D-Spiel. Bei euch ist es ja so, wenn das Monster außerhalb
- 45:04des Bildschirms ist, ist es so gefühlt maximal 20 Meter weg oder so.
- 45:07Und im Weltraum kann es sein, dass du ein Schiff halt in 10 Kilometer Entfernung siehst.
- 45:12Und es kann schon sein, dass das jetzt gerade umdreht und auf dich zufliegt
- 45:15und dich angreifen will.
- 45:16Aber es fühlt sich gar nicht wie Kampf an, wenn das Ding 10 Kilometer weit weg ist.
- 45:21Das war nochmal eine ganz besondere Herausforderung, dann so ein Gefühl dafür zu bekommen.
- 45:25Weil wenn diese coole Musik einsetzt und diese kleine Pixel bewegt sich so gerade
- 45:31auf die Zug, das fühlt sich nicht sehr episch an.
- 45:33Ja, kann ich mir vorstellen.
- 45:35Und teilweise ist es auch so, dass in dem Moment kannst du dich ja auch noch
- 45:38entscheiden, habe ich jetzt eigentlich Bock auf Kämpfen?
- 45:40Ach nö, weißt du, ich drehe mich einfach zur Seite und fliege zu irgendeiner Station und so.
- 45:44Und das fühlt sich dann auch nochmal weniger wie Kämpfen an.
- 45:47Deswegen finde ich das schon sehr spannend, wie man sowas...
- 45:50Macht aber ja, bei einem Top-Down-Spiel ist es auf jeden Fall ein bisschen einfacher,
- 45:53weil man diese krassen Distancen ja nicht hat.
- 45:56Ich finde, man kennt das auch manchmal aus anderen Spielen, irgendwie,
- 45:59man läuft durch die Welt, man erkundet, plötzlich setzt die Kampfmusik ein,
- 46:01also du weißt gar nicht, warum und woher, aber einfach schon mal pro Format
- 46:04ziehst du die Waffe, machst dich bereit, da kommt bestimmt gleich irgendwas.
- 46:07Obwohl das ja auch gut sein kann, um einfach vorgewarnt zu sein,
- 46:10nicht, dass dich da irgendwie einen Wolf von hinten einfach anspringt und denkst,
- 46:14hä, woher kommt der denn jetzt plötzlich? Genau, das gibt es ja tatsächlich
- 46:17manchmal in Trova wirklich.
- 46:19Also ich will jetzt nicht spoilern, aber es gibt so ein, zwei Bereiche,
- 46:22wo wirklich manchmal dann was aus dem Busch springt.
- 46:26Das war ich doch schon.
- 46:27Sehr zu Horror von manchen Spielern auf jeden Fall.
- 46:30Also wir haben sehr viel auf jeden Fall polarisierendes Feedback bekommen,
- 46:33was diese Gegner angeht, von denen du sprichst.
- 46:36Da muss ich mal sagen, da bin ich mal gespannt, ob jemand den No-Hit-Run schafft.
- 46:40Und dann will ich mal gucken, wie das dort, ja, also wie man an solchen Stellen damit klarkommt.
- 46:45Ja, muss man vielleicht auch nochmal sagen, wir haben den No-Hit-Bread ins Leben
- 46:48gerufen, ohne zu wissen, ob es wirklich möglich ist.
- 46:52Aber ich denke schon, dass man das auf jeden Fall hinbekommt,
- 46:54wenn man das Spiel gut kennt, wenn man weiß, wo diese Gegner sind,
- 46:56wenn man vielleicht eine Werkenkampfhafe dabei hat, vielleicht Feuerpult oder was auch immer.
- 47:00Ich denke, es wird auf jeden Fall Mitteln Wege geben, dort dran vorbeizukommen.
- 47:03Aber ja, wir sind da auf jeden Fall auch sehr gespannt.
- 47:05So, und dann hast du vorher noch was anderes erwähnt. Das ist auch ein ganz
- 47:07interessantes Thema. Und zwar diese Atlanten.
- 47:10Diese Atlanten, da hatten wir nämlich schon drüber gesprochen in der Folge mit
- 47:13Chris. Das sind also große Texturen, auf denen ganz viele einzelne Sprites draufliegen.
- 47:19Und davon gibt es welche für, ich blende jetzt auch mal ein Bild ein,
- 47:23davon gibt es welche für zum Beispiel Architektur.
- 47:26Also sieht man jetzt auf dem Bild ganz viele Holzpalisadenwände in verschiedenen Orientierungsstufen.
- 47:32Und die sind halt alle auf einem großen Bild. Und dann, ich hatte hier noch
- 47:35ein anderes Schönes, das hatte ich auch bei Chris erwähnt, wo die ganzen Animationen drauf waren.
- 47:39Wo ist das denn? da waren halt alle Animationsstufen von den Charakteren,
- 47:44die man spielen kann und die erste Frage,
- 47:48die ich mir gestellt habe, wie sind diese Atlanten erstellt worden?
- 47:52Weil das sieht automatisiert aus und nicht manuell zusammengeschoben.
- 47:56Das wäre auch, glaube ich, Horror.
- 47:57Ja, genau. Also wir nutzen im Großen
- 47:59und Ganzen einfach Unity kommt mit Sprite-Atlas, nennt sich das dort.
- 48:04Und dann kann man quasi definieren, welche Ordner oder auf welche Texturen in
- 48:08diesen Atlas kommen sollen.
- 48:10Und der packt das dann für ein. Man hat nur ein paar Einstellungsmöglichkeiten,
- 48:13aber im Großen und Ganzen sind fast, eigentlich sind alle Atlanten quasi automatisch gepackt.
- 48:19Er hat auch manchmal witzige Nebeneffekte. Manchmal kann er sie besser packen,
- 48:22wenn mehr Sprites drauf sind, statt weniger. Ich weiß nicht genau,
- 48:25man hat da leider sehr wenig Einfluss drauf.
- 48:27Und manchmal frickle ich einfach nur eine Option so ein bisschen um oder verschiebe
- 48:30irgendwo mal ein Pixel, damit es irgendwie nochmal die nächst kleinere Stufe erreicht.
- 48:34Aber die Sprites selbst kommen von unseren Artists quasi. Also im Großen und
- 48:39Ganzen, wir arbeiten ja mit A-Sprite, das ist ein Tool zur Erstellung von den Grafiken.
- 48:42Wir nutzen dann ein persönliches, kustomisiertes Export-Skript,
- 48:46was dann bestimmte Sprites und Layer und Label nimmt aus dieser Datei und sie
- 48:52dann einfach horizontal in Unity,
- 48:55also auch in Atlanten packt, oder also in eine Textur,
- 48:59sagen wir mal in der Animation, wie der Spieler zuschlägt, dann ist horizontal
- 49:02der Schlag einfach abgebildet.
- 49:03Und in Unity selbst nehmen wir dann diese Texturen und packen sie dann in diese
- 49:07Atlanten und sehen dann so aus wie das Beispiel, das du jetzt hier gezeigt hast.
- 49:12Aber wenn auf der Textur, die aus Esprite kommt, alle Animationsstufen nebeneinander
- 49:17sind, dann weiß Unity ja nicht, wo hier was aufhört, oder?
- 49:21Also dann kann Unity doch nicht die Einzel-Sprites wieder in dem großen Atlas
- 49:25schön rumschieben, sondern es hätte dann eine riesige, lange,
- 49:28vertikale Textur, oder?
- 49:30Doch, das kann Unity schon. Weil wenn wir quasi ... Also wir slicen das ja.
- 49:34Also wenn es dann, sagen wir, dieser Angriff, sagen wir mal,
- 49:37sind zehn Frames, dann sind es auch zehn Einzel-Sprites.
- 49:39Und was Unity sehr smart macht, ist, er findet quasi das kleinstmöglichste Mesh,
- 49:46was bestmöglich nur die Farbkanäle in der Textur quasi abbildet.
- 49:52Das heißt, es ist nicht tatsächlich ein Rechteck von, sagen wir mal,
- 49:5464x64, was als Sprite gilt, sondern ein viel, viel kleinerer Part,
- 49:58sagen wir mal, 12x12, was auch ein bisschen ein weirdes Shape haben kann.
- 50:02Was dann eigentlich tatsächlich der eigentliche Sprite ist.
- 50:06Und nur diese kleinere Variante nutzt er dann, um sie dann vernünftig zu packen.
- 50:11Ah, genau. Also das heißt, aller Leerraum um das Sprite drumherum wird einfach weggeschnitten.
- 50:16Ja, du hast es einfach ausgedrückt, äh, sich.
- 50:19Genau, aber da habe ich mich auch gefragt, aber woher, also irgendwie muss ja
- 50:23irgendwo deine Datenbank existieren.
- 50:25Oder nee, warte mal, du hast gerade Polygon gesagt. Also wird irgendwie ein
- 50:27Polygon erstellt, was dann halt UVs hat, die genau auf diese Stelle gemappt sind?
- 50:32Genau, genau.
- 50:32Aber,
- 50:34Also, aber hä? Aber das heißt, dass ich, also, okay, ich habe mir das jetzt so vorgestellt.
- 50:39Ich habe meinen kleinen NPC und dieser NPC, der ist einfach auf ein Quadrat
- 50:45oder ein Rechteck gemappt.
- 50:46Aber das passt dann ja nicht. Irgendwie muss dann doch, also.
- 50:50Also wie genau das jetzt Unity intern macht, weiß ich auch nicht hundertprozentig.
- 50:54Meine Vermutung ist, jeder Sprite hat eine eindeutige ID.
- 50:58Und im Editor existiert beides zeitgleich. Sowohl die Textur,
- 51:03die wir exportiert haben, als auch der Atlas.
- 51:05Und man kann auch Abfragen machen wie Textur.Atlas oder Atlas.Textur.
- 51:10Das heißt, es gibt in Unity zur Edit-Zeit quasi noch die Möglichkeiten,
- 51:14dass die beiden in Referenz zueinander stehen.
- 51:17Wenn man das Spiel dann final baut, dann fliegt quasi diese Grundtextur raus
- 51:21und nur der Atlas bleibt übrig.
- 51:22Und meine Vermutung ist, dass es so eine Art Manager, wie du es auch beschrieben
- 51:26hast, quasi gibt, der dann einfach sagt, alles klar, hier ist ein Sprite mit dieser ID.
- 51:30Gib mir, wo auch immer der Herr kommt, quasi zurück. Irgendwie sowas in dieser
- 51:33Richtung. Aber da haben wir nichts explizit programmiert.
- 51:36Das ist ja interessant. Das ist alles Unity schon direkt drin.
- 51:39Das ist kein crazy Plugin.
- 51:41Genau, genau.
- 51:42Ich habe jetzt noch mal geguckt, wie das jetzt genau funktioniert.
- 51:44Hatte mich noch mal interessiert.
- 51:45Und zwar ist es so, dass es bei Unity eben die Sprite-Atlanten gibt.
- 51:49Und es gibt verschiedene Optionen, die man sagen kann.
- 51:51Und das eine ist Tightpacking und das andere eben nicht. Und wenn man das Tightpacking
- 51:55nicht anwählt, dann wird jedes Sprite quasi mit einem Rechteck,
- 51:59also mit einem Quad dargestellt.
- 52:00Ein Polygon mit vier Punkten und geraden Linien eben. Also, ja, Quad.
- 52:06Und dann ist es halt so, dass die Sprites auf dem Atlas so angeordnet sein müssen,
- 52:09dass die nicht sich sozusagen überlappen. Also wenn man jetzt um einen Sprite
- 52:14mit geraden Linien rechts, links, oben, unten malt, dann darf kein anderes in
- 52:17diesen Bereich reinragen.
- 52:19Ansonsten würde man das ja dann sehen, wenn das im Spiel dargestellt wird,
- 52:23dass da irgendwie irgendwelche Pixel an den Kanten überlappen.
- 52:26Von dem Sprite. Und das ist das normale Packing. Ich glaube,
- 52:30das kennt man auch eigentlich so.
- 52:32Und es gibt aber diesen Tide-Packing-Mode. Und da ist es tatsächlich so,
- 52:35dass die Sprites viel näher zusammengerückt werden können, sodass sich dann
- 52:39Sachen so richtig nah zusammenliegen können.
- 52:41Und das, wenn man sich jetzt um einen Sprite wirklich so ein Viereck vorstellen
- 52:44würde, also wie so eine Bounding-Box quasi, dann würden halt andere Sprites da auch reinragen.
- 52:49Und deswegen muss man für diesen Modus auch noch anwählen. Der Modus heißt Use Sprite Mesh.
- 52:55Und das ist ganz spannend, weil dann wird nämlich nicht ein Viereck benutzt,
- 52:59um das Sprite dann zu rendern, also ein Polygon quasi, dann später im Spiel,
- 53:03sondern es ist ein Mech, was viel, viel mehr Polygone hat, als zum Beispiel 5, 6 oder 7 oder 8 oder so.
- 53:08Und ich blende jetzt auch mal ein Bild ein, da sieht man verschiedene Positionen
- 53:11von einem Drover-Charakter und da könnt ihr richtig gut sehen,
- 53:14wie verschieden das Mech dann aussieht, je nachdem. Also der Algorithmus versucht
- 53:18dann eben mit den Polygonen die Form des Sprites möglichst genau nachzuarbeiten.
- 53:22Und deswegen kann man die Sachen dann halt auch viel, viel mehr zusammenschieben.
- 53:26Und ganz witzig ist noch ein kleiner Edge Case, zumindest in 2022 war das so,
- 53:31ich verlinke euch da auch einen Thread vom Unity Forum.
- 53:33Da hat nämlich jemand im UI bemerkt, ich habe doch mein Tight Packing angewählt
- 53:38und auch mein Use Sprite Mesh Modus.
- 53:41Warum in meinem UI habe ich genau dieses Problem,
- 53:45dass ich da ein Icon darstelle und dann unten rechts und links ragen da so Pixel
- 53:51von anderen Sprites rein, die
- 53:53auf dem Atlas gemalt sind und die halt schön nahe daran geschoben sind.
- 53:56Und stellt sich raus, dass zumindest
- 53:58damals das für UI hat dieses Sprite-Mesh-Ding nicht funktioniert.
- 54:04Das heißt, der Atlas wurde zwar schön eng aneinandergerückt,
- 54:07die ganzen Sprites, aber im UI wurde dann das Icon mit einem Vieieck dargestellt,
- 54:12also ein Quad halt normal.
- 54:14Und dann war der Atlas aber zu eng gepackt und dann ragen eben die Pixel da
- 54:18unten noch rein. Genau, da habe ich jetzt auch mal ein Bild gezeigt.
- 54:22Und ja, so funktioniert das. Ja, genau.
- 54:26Das ist auf jeden Fall auch sehr, sehr smart, auch dieses Texturenpacken,
- 54:29dass er diesen Freiraum rausnimmt, das ist wunderschön, also das ja,
- 54:33möchte ich auch gar nicht mehr missen.
- 54:35Das hat, wie gesagt, ein paar Quirks, aber so im Großen und Ganzen gefällt mir
- 54:37das eigentlich sehr gut.
- 54:38Ja, das sieht sehr effizient aus, auf jeden Fall. War ich sehr beeindruckt, genau.
- 54:45Wobei wir da noch mal ein bisschen nachgehakt hatten, was die Ektoren angeht,
- 54:49also unsere Menschen. Die sind an sich eigentlich auch in einem Atlas.
- 54:52Ja.
- 54:53Aber der Atlas war zu groß. Unity macht mehr Spielraum, als wir eigentlich brauchen.
- 54:58Und wir haben sehr, sehr viele Animationen von Actoren, ich glaube,
- 55:03über 1200 Frames für die Animation, die ein Actor durchführen kann.
- 55:07Und das war dann einfach von der Texturgröße zu groß.
- 55:09Und da haben wir noch mal sehr viel eigenen Stuff gemacht, zum Beispiel,
- 55:13Kann es sein, dass der erste Frame von Stehen identisch aussieht wie der zweite
- 55:18Frame von Ich stehe auf oder sowas.
- 55:21Und dann haben wir, das habe ich dann programmiert, quasi nochmal einen kleinen
- 55:23Algorithmus gebastelt, der mir detektiert, ob Sprites quasi inhaltlich identisch sind.
- 55:28Und wenn ja, dann schmeißt er den einen raus und nutzt stattdessen den anderen.
- 55:32Und auch nochmal einen kleinen Algorithmus, der quasi das Padding,
- 55:35also der Abstand zwischen zwei Sprites auf dieser Textur auch nochmal reduziert.
- 55:39Und das Ganze ist dann am Ende aber nur eine Texturen, kein Atlas,
- 55:42wobei aus Unity-Sicht das bei ist so ein bisschen identisch und das habe ich
- 55:45dann Baked Texture genannt, um da einfach noch mal ein bisschen was rauszusqueasen.
- 55:50Das war auch auf jeden Fall sehr spannend.
- 55:52Das war eine reine Optimierung um die Atlanten kleiner zu halten.
- 55:56Genau, genau, genau.
- 55:58Aber warum musstest du das Padding jetzt verändern?
- 56:00Auch einfach um die Größe, das wäre wie gesagt 1200 Sprites gewesen,
- 56:04jeder hat irgendwie einen Border von zwei Pixel, ein Pixel würde mir eigentlich ausreichen.
- 56:08Ach so.
- 56:08Sagen wir, auf einer Horizontal liegen 100 Sprites. Dann würde ich ja schon
- 56:12allein 50 Pixel sparen, auf jeder Ebene zum Beispiel.
- 56:16Und auch je kleiner die sind, desto anders packen würde Unity die auch noch mal.
- 56:21Weil da mehr Möglichkeiten hat, sie auch noch mal optimierter zu placen.
- 56:25Okay, ja gut. Das ist natürlich super intern, was Unity da macht. Aber ja, spannend.
- 56:29Und dann ist mir aber noch eine Sache aufgefallen. Und zwar,
- 56:32über so eine Sache macht man sich dann ja wenig Gedanken.
- 56:35Und zwar, die Schatten von Objekten sind auf einem eigenen Atlas.
- 56:39Also zum Beispiel, wenn man jetzt einen Baum hat, dann hätte man das Baum-Sprite
- 56:44und dann hätte man nochmal einen Sprite für den Schatten unter dem Baum und
- 56:47ja, das sind zwei verschiedene Objekte.
- 56:50Das fand ich jetzt spannend, weil du hast ja gesagt, dass man gibt einen Ordner
- 56:54an und dann packt Unity alles zusammen.
- 56:56Aber das bedeutet ja, dass ihr einen Ordner habt, der heißt dann Schatten.
- 56:59Und da sind alle Schatten drin oder so.
- 57:02Das ist was auch ... Wir haben es nicht immer durchgeführt. Das war ...
- 57:07Also viel Unerfahrenheit steckt
- 57:09hier auch natürlich drin und viele verschiedene Ansätze und so weiter.
- 57:11Es gibt auf jeden Fall auch Atlanten, wo die Schatten mit zu dem eigentlichen Objekt kommen.
- 57:16Ah, okay.
- 57:16Die Idee generell ist, warum wir das hier gemacht hatten, auch in dem Bild,
- 57:19was du jetzt hier hast, um nicht nur ... Also es gibt verschiedene Arten zu optimieren.
- 57:23Du kannst einerseits entweder den Arbeitsspeicher optimieren oder auch dann
- 57:26GPU-RAM, aber du kannst auch optimieren, wie Objekte gezeichnet werden, also gebatcht werden.
- 57:32Und unsere Schatten liegen alle auf einem gemeinsamen Layer.
- 57:35Und Unity kann Objekte badchen, wenn sie auf einem gemeinsamen Layer liegen
- 57:39und sie dieselbe Textur verwenden.
- 57:41Dadurch, dass Schatten eh immer auf demselben Layer sind, kann man einfach sagen,
- 57:43alles klar, lass uns einmal einfach den Schatten rendern. und dann kann Unity
- 57:46einen einzigen Dior Call draus machen, aus einem Screen, wenn alle Schatten
- 57:50in einer Textur sind. Ist halt deutlich effizienter fürs Rendering.
- 57:53Genau, und das ist das, was wir hier versucht hatten dann zu machen,
- 57:55dass wir sagen, alles klar, die Schatten kommen alle in eine Textur,
- 57:58um einfach das Rendering selber zu begünstigen.
- 58:02Haben wir nicht für alle gemacht. Ich glaube, das haben wir primär für Bäume
- 58:05gemacht. Wir haben ja auch noch Gräser und Steine und andere Objekte.
- 58:08Da haben wir es nicht mit den Schatten gemacht.
- 58:09Wäre im Nachhinein vielleicht auch nochmal eine Möglichkeit,
- 58:11Sachen zu optimieren. Aber das kommt sich dann leider in die Quere,
- 58:14weil zum Beispiel zwei verschiedene Bäume, verschiedene Typs vielleicht niemals
- 58:19zusammen auf einem Screen sind, durch diese Schattentextur aber ihre Schatten
- 58:22zeitgleich geladen werden.
- 58:24Und da muss man auch wieder das Payoff treffen, was möchte man eigentlich haben.
- 58:28Ja, genau. Also hätte man eine Wüste und da steht ein Baum drin,
- 58:31würde man trotzdem die gesamte Schatten-Atlas-Textur laden müssen. Von allen Bäumen.
- 58:35Und das sind dann eben, weiß ich nicht, zehn Megabyte oder keine Ahnung wie
- 58:37groß oder fünf oder ... Ja, das mit dem Batching ist übrigens signifikant.
- 58:43Also ich habe einen kleinen Prototyp gemacht in Godot,
- 58:46Da habe ich einfach so, weiß ich nicht, 500 Sprites oder so.
- 58:49Die bewegen sich einfach vom Rand des Bildschirms auf dich zu.
- 58:51Und wenn sie in der Mitte sind, sterben sie und werden neu gespawnt.
- 58:54Also man kann relativ viele Sprites
- 58:56darstellen. Und das funktioniert auch wunderbar, das läuft flüssig.
- 58:59Und im Rendering ist es eben so, dass die alle auf einmal gezeichnet werden.
- 59:03Und dann habe ich mal gemacht, dann habe ich eine Random-Farbe zuweisen lassen.
- 59:07Also jedem Sprite einfach eine Random-Farbe im Material zugewiesen.
- 59:11Und plötzlich bricht das das Batching. Jeder Sprite wird jetzt in einem eigenen
- 59:15Draw-Call gerendert und plötzlich ist es irgendwie auf drei FPS runtergebrochen.
- 59:19Also das ist ein riesiger Unterschied, wenn man für das Rendering,
- 59:22wenn man da nicht aufs Batching achtet. Das kann einem richtig die Performance versauen.
- 59:26Absolut. Da macht sich Unix zum Glück auch viel Haus aus und scheinbar auch
- 59:30Godot, ohne dass man da jetzt so viel dran macht.
- 59:33Aber bestimmte Sachen kann es halt leider auch breaken.
- 59:36Und an manchen Stellen mussten wir es sogar explizit breaken,
- 59:39weil sonst bestimmte grafische Effekte bei uns nicht funktioniert hätten.
- 59:43Weil durch das Batching auch bestimmte Informationen verloren gehen,
- 59:46die unter Umständen interessant sein können für bestimmte grafische Effekte.
- 59:50Ja, zum Beispiel Random Farbe. Random Color.
- 59:52Zum Beispiel Random Farbe. Aber da gibt es wieder auch andere Tricks,
- 59:55damit du trotzdem Random Farben zuweisen kannst, ohne das Batching zu zerstören.
- 59:59Aber da muss man wieder so ein bisschen smart und optimiert denken und arbeiten,
- 1:00:02was dann so ein bisschen, glaube ich, auch die Krux ausmacht,
- 1:00:04damit ein Spiel wie, was weiß ich, Doom oder so was flüssig läuft.
- 1:00:08Also Doom ist ja krass optimiert und läuft tatsächlich auch auf relativ alten
- 1:00:12Geräte, also jetzt auch das Aktuellste.
- 1:00:14Oder ID.Soft generell macht sehr optimierte Spiele und da steckt viel Magic
- 1:00:18dahinter und viel Durchdachtheit.
- 1:00:20Genau, man muss dann sehr schlau sein. Und oft ist es dann so,
- 1:00:23dass diese Workarounds oder diese Techniken, die man dann implementiert,
- 1:00:27dann den Workflow aber auch wiederum behindern können und dann ein bisschen
- 1:00:30nervig sind, diese ganzen Äste zu erstellen und zu managen und so.
- 1:00:33Aber dafür läuft es dann flüssig.
- 1:00:36Spielewicklung, wie du sagst. Es gibt halt Vor- und Nachteile.
- 1:00:38Ja, wir haben das auf jeden Fall versucht, möglichst weit nach hinten zu schieben,
- 1:00:41dass während wir an der Welt gearbeitet haben, da sich niemand Gedanken drum gemacht hat.
- 1:00:45Und viele von den Optimierungen, die wir auch haben, passieren dann auch erst
- 1:00:50zur Bildzeit, auch teilweise automatisiert.
- 1:00:52Zum Beispiel können wir da auch gleich zu dem Thema, ich möchte das jetzt mal
- 1:00:55vorwegnehmen, aber zum Beispiel hast du ja diese Bodentextur und hast dann dazu
- 1:00:58geschrieben, warum ist das denn eine komplette Textur?
- 1:01:01Das ist zum Beispiel auch eine unserer Optimierungsmöglichkeiten,
- 1:01:03wo sich aber Leute, die Level-Design betrieben haben, keinerlei Gedanken drüber
- 1:01:06machen mussten, weil wir es erstens spät gemacht haben und dann auch erst zur
- 1:01:09Bildzeit einsetzen quasi.
- 1:01:11Genau, also worum es jetzt geht, das wäre nämlich auch mein nächstes Thema gewesen,
- 1:01:15ist, dass wir wissen, dass dieses Spiel 2D ist und aus verschiedenen Teilmaps
- 1:01:20besteht für den Boden, also kleinere Texturen, die einfach aneinander gekachelt werden und so.
- 1:01:25Und dann gibt es eben verschiedene für Gras und für Sand und so weiter und so weiter.
- 1:01:29Und jetzt könnte man ja annehmen, weiß ich nicht, zum Beispiel,
- 1:01:33also wenn man jetzt zum Beispiel Minecraft sieht, könnte man ja denken,
- 1:01:37dass jeder kleine Würfel einzeln gerendert wird, weil es ein eigenes Objekt
- 1:01:42ist, mit dem man interagieren kann oder so.
- 1:01:43Und bei euch hatte ich dann gedacht, naja, wahrscheinlich wird,
- 1:01:46wenn man sich das Rendering anguckt, ja, weiß ich nicht.
- 1:01:50Vielleicht jeder Typ von Textur, also Stein und Sand und Gras einzeln gerendert
- 1:01:55werden oder irgendwie sowas oder eine Grundbasis und darauf kommt dann alle Objekte.
- 1:02:00Aber was wir hier sehen, das blende ich jetzt auch mal ein, ist,
- 1:02:04dass wir schon, also das komplette Terrain ist eigentlich schon da,
- 1:02:07innerhalb eines Drawcords gerendert.
- 1:02:09Das bedeutet, wir sehen Erde, wir sehen Gras, wir sehen kleine,
- 1:02:13kleine gemalte Steinwege, wo Leute langlaufen können.
- 1:02:16Und wir sehen sogar schon das Innere eines Hauses, also den Holzboden,
- 1:02:20darauf liegen Teppiche und noch ein paar Klippen. sind sogar auch schon da,
- 1:02:25von irgendeiner Steinstruktur.
- 1:02:27Also relativ viel. Und warte mal, ich sehe da glaube ich sogar,
- 1:02:29ach genau, die Wurzeln von ein paar Bäumen sind auch schon da.
- 1:02:32Also relativ viel, auf was alles in einem gerendert wird.
- 1:02:35Und das hat mich überrascht, weil ich dachte so, das ist ja ein großer Chunk,
- 1:02:40schon irgendwie zusammengefasst da.
- 1:02:42Ja, tatsächlich repräsentiert das im Großen und Ganzen eigentlich ein Chunk.
- 1:02:45Also auch eine Chunkgröße ist genau die Größe von dem Bild, was du hier siehst.
- 1:02:50Und im Endeffekt, ich möchte nicht sagen, dass das immer besser ist oder es
- 1:02:55ist immer effizienter, es so zu machen, wie wir es tun. Aber in unserem Case hat es sich ausgezahlt.
- 1:02:59Wir hatten initial ein Shader, der den Boden, nur den Boden zeichnet.
- 1:03:04Aber das Resultat wäre trotzdem gewesen, du würdest Steine sehen,
- 1:03:08du würdest Gras sehen, du würdest Erde sehen und so weiter.
- 1:03:10Weil der Ansatz, den wir dort haben, das nennt sich Texturesplatting.
- 1:03:14Und man kann sich quasi vorstellen, dass es eigentlich ein buntes Bild ist,
- 1:03:17wo Rot und Grün und keine Ahnung, verschiedene Farben drin sind.
- 1:03:20Und die Farben repräsentieren dann Terrain und werden dann gemischt.
- 1:03:23Dieser Shader war nicht sonderlich optimiert und war im Rendering-Prozess relativ weit oben.
- 1:03:30Also wenn man das Rendering, sagen wir, braucht irgendwie 16 Millisekunden,
- 1:03:34dann war vom Rendering nur des Bodens, was weiß ich, acht davon oder sowas.
- 1:03:39Und das war halt sehr unoptimiert. Und dann hatten wir die erste Idee,
- 1:03:44hey, wie wäre es denn, wenn man das einfach pre-baked, also dass man sagt.
- 1:03:47Es ist nicht dieser Shader auf diesem Mesh, sondern es ist einfach nur eine Textur, ein Quad.
- 1:03:52Ein Quad ist sehr einfach zu zeichnen, Draw Call sehr easy, der Shader ist sehr
- 1:03:56simpel und dann hatten wir das gemacht und das hat sich für uns ausgezahlt,
- 1:03:59das war einfach optimierter und der Boden ändert sich auch nicht dynamisch zur
- 1:04:03Laufzeit, wenn ich irgendwas tue.
- 1:04:05Und dann haben wir weiter optimiert, weiter gearbeitet und dann so weit irgendwann
- 1:04:09zur Switch gekommen und dann festgestellt, irgendwie läuft das da immer noch nicht.
- 1:04:14Und dann sind wir irgendwann auf die Idee gekommen, warum, wenn wir diese ganzen
- 1:04:17Sachen eh schon pre-baken, warum pre-baken wir nicht einfach noch mehr rein
- 1:04:21von Dingen, wo wir wissen, dass sie immer unter dem Spieler liegen,
- 1:04:24weil es sonst keine Verdeckungen gibt oder sowas.
- 1:04:27Deswegen sind zum Beispiel die Wurzeln des Baumes drin, weil der Spieler nie dahinter stehen kann.
- 1:04:31Aber der Spieler kann vor und hinter dem Stamm stehen und deswegen können wir
- 1:04:34das zum Beispiel nicht rein baken.
- 1:04:36Deswegen haben wir dann gesagt, okay, alles, was kleiner ist,
- 1:04:38ist jetzt auch intern gesehen, Ektor 0, ist sozusagen unsere Grenzwerte.
- 1:04:41Alles, was dort drunter liegt, ballern wir da einfach rein und schmeißen es
- 1:04:45dann auch zur Laufzeit wirklich raus.
- 1:04:47Also es liegt dann auch nicht mehr als Szener, als einzelnes Objekt,
- 1:04:49zum Beispiel so kleinen Steine im Wasser oder so. Also da ist noch kein Wasserwasser,
- 1:04:52kommt gleich nochmal extra.
- 1:04:53Aber das sind zum Beispiel schon kleine Steinchen und die Steinchen gibt es
- 1:04:56auch nicht mehr als Objekt.
- 1:04:57Das reduziert die Szenengröße, die Chunkgröße, verbessert das Rendering,
- 1:05:01weil die alle in einem Drawcore gezeichnet werden.
- 1:05:03Und genau, das war dann unser Ansatz, dass wir das deutlich improved haben.
- 1:05:07Aber es hat auch nur funktioniert, weil sie in den Chunks liegen,
- 1:05:11weil die Chunks ja rein und auch wieder rausladen.
- 1:05:13Würden alle diese Texturen, die Textur ist relativ groß, ich glaube 1200.
- 1:05:181600, irgendwie sowas, mal 1600.
- 1:05:20Und angenommen, du hast zehn von diesen Texturen liegen, ist da schon recht
- 1:05:23viel Memory für auch wiederum die Grafikkarte. Aber das gute Ding ist,
- 1:05:27wir laden sie ja eh wieder raus.
- 1:05:29Und so sind in der Regel immer nur vier Chunks zeitgleich geladen und das können
- 1:05:33die meiste Hardtower mittlerweile ganz gut abfangen.
- 1:05:35Okay.
- 1:05:36Und wir haben noch mehr, fällt mir gerade ein, auch noch optimiert.
- 1:05:38Tatsächlich sind diese Sachen das Texture Splatting, der Ansatz,
- 1:05:42den ihr am Anfang meinte, der macht zwar, dass die Sachen Pixelart ähnlich aussehen,
- 1:05:47aber es mischt auch Pixel. Dadurch wirkt es ein bisschen blurry.
- 1:05:50Ja.
- 1:05:51Und das Schöne daran wiederum ist, dadurch, dass es ein bisschen blurry wirkte,
- 1:05:54haben wir noch eine Compression drüber gehauen. Die Compression macht auch,
- 1:05:56dass es blurry aussieht.
- 1:05:58Aber man hat es kaum noch gesehen, diese Compression, wodurch wir auch wieder RAM sparen konnten.
- 1:06:03Und dann liegt es auch auf der Festplatte als JPEG vor. JPEG macht auch ein bisschen was blurry.
- 1:06:08Also ich glaube, 99% ist relativ hoch, weil es wird dann doch recht schnell sehr hässlich.
- 1:06:12Und das haben wir dann auch nochmal drauf gehauen. Und so sind diese Texturen
- 1:06:15im Endeffekt sehr klein geworden, auch wenn sie Texturgrößen sehr groß sind,
- 1:06:19und auch recht optimiert dann auf der Grafikkarte liegen.
- 1:06:22Okay. Ah ja. Okay, ich habe Fragen. Also, für alle, die das jetzt Textosplating noch nie gehört haben,
- 1:06:30die Idee ist im Grunde genommen, dass ich habe eine Sandtextur und eine Grastextur
- 1:06:34und die möchte ich gerne auf dem Terrain gleichzeitig darstellen.
- 1:06:37Und da kann ich ja auf das Terrain malen mit meinem kleinen Brush in einem Tool,
- 1:06:41wie in Photoshop im Grunde genommen.
- 1:06:43Und will halt so ein bisschen das auch miteinander blenden können.
- 1:06:46Und das funktioniert so, dass man eine Splattingtextur nimmt,
- 1:06:50Die Textur hat ja vier Kanäle, R, G, B und A.
- 1:06:55Und was ich machen kann, ist, ich sage im Shader, ich lese aus dieser Splatting-Textur
- 1:07:00den R-Kanal, also den roten Kanal aus und überall da, wo dort weiß reingezeichnet ist,
- 1:07:06Dann zeige ich zum Beispiel eine geteilte Sandtextur und überall,
- 1:07:11wo im Grünkanal weiß reingezeichnet ist, zeige ich eine Grastextur und so kann
- 1:07:16man das auch miteinander blenden.
- 1:07:17Und daher kommt aber auch die Einschränkung, dass man bei manchen Terrain-Systemen
- 1:07:22dann zum Beispiel nur vier verschiedene Texturen miteinander blenden kann.
- 1:07:25Da wäre jetzt die Frage, ist das bei euch auch so? Habt ihr eine Vier oder habt
- 1:07:28ihr da irgendwie zwei Splatt-Texturen, damit es dann acht sind oder irgend sowas gemacht?
- 1:07:32Also im Endeffekt ist bei uns nicht unlimitiert, klingt zu viel,
- 1:07:36aber im Großen und Ganzen rendern wir dort ein Mesh und wir nutzen dann im Endeffekt
- 1:07:41nicht von der Textur die RGBA-Kanäle, sondern von dem Mesh, von den Vertices, die RGBA-Werte.
- 1:07:47Und man kann aber auch mehr angeben, zum Beispiel haben die ja UVs,
- 1:07:50UV1, UV2, UV3, entsprechend haben wir eigentlich mehrfach davon.
- 1:07:55Momentan haben wir pro Splat Mesh quasi elf Kanäle und den Alpha-Kanal.
- 1:08:00Der Alpha-Kanal ist nochmal extra, um tatsächlich auch wirkliches Alpha zu radieren
- 1:08:03oder rein oder rauszumalen und im Endeffekt elf Texturen, die miteinander gemerged werden können.
- 1:08:08Dadurch, dass wir aber tatsächlich einen echten Alpha-Kanal erlauben,
- 1:08:11können wir aber auch einfach mehrere Splat Planes übereinander legen und dadurch
- 1:08:15sind wir eigentlich recht unlimitiert.
- 1:08:16Und dadurch, dass wir es im Endeffekt dann in diesem Boden baken,
- 1:08:19ist uns eigentlich völlig egal, wie viele Meshes und wie viele Layer und was
- 1:08:22auch immer, wir haben am Ende ist es eine Textur und sie wird einmal gezeichnet. That's it.
- 1:08:28Okay, das bedeutet, ihr benutzt gar nicht die Vertex-Color-Informationen der
- 1:08:32Vertex-Color, sondern nur die UV-Color.
- 1:08:34Auch beides. Also die RGBA benutzen wir auch.
- 1:08:38RGB sind dann schon drei Texturen, die da quasi dann drin sind.
- 1:08:41Und dann UV auch wieder XYZW quasi von den verschiedenen UVs dann auch wieder.
- 1:08:46Das ist übrigens eine Sache, die hat eine Weile gebraucht, dass ich das so verstanden
- 1:08:52habe, Denn die UV-Kanäle, genau wie du es eben gesagt hast, die haben auch mehr
- 1:08:56Koordinaten, als man eigentlich kennt.
- 1:08:58Aber manchmal kann man sie nicht nutzen bei, jetzt muss ich überlegen,
- 1:09:02genau, bei Unreal ist es so, dass wenn du die UVs ausliest, dann kriegst du
- 1:09:05immer noch X und Y oder halt U und V und die anderen nicht.
- 1:09:09Und wenn du aus Houdini zum Beispiel in Mech rausschreibst mit mehr,
- 1:09:13also mit Z und Y, du kriegst den halt nicht.
- 1:09:18Und was du dann machen musst zum Beispiel für Pivot Painter ist das interessant,
- 1:09:21also für einen quasi virtuellen Pivot in Mech speichern, müssen wir jetzt nicht
- 1:09:26ganz so tief eingehen, aber da brauchst du ja drei Koordinaten,
- 1:09:29X, Y und Z, um einfach eine Position im Raum zu definieren.
- 1:09:32Und dafür musst du dann eben UV1 definieren mit XY und dann noch den anderen
- 1:09:38UV2-Kanal, um eben das Z auch irgendwie mit zu übergeben.
- 1:09:42Und den anderen musst du dann eben sagen, okay, gib mir mal UV1,
- 1:09:45gib mir jetzt UV2 und dann packe ich das in einen Vektor zusammen.
- 1:09:49Aber in Max zum Beispiel ist es so, in 3D-Studio Max, da kannst du im UV-Editor
- 1:09:54unten irgendwo umschalten, dass du auch zum Beispiel die dritte Koordinate von UV-Editor.
- 1:10:01W, W wär's dann. Also UV, W, genau, das W.
- 1:10:05Könntest du auch, kannst du auch modifizieren ein 3D-Studio-Mex im UV-Editor.
- 1:10:10Also die zeigen dir schon an, dass da auch mehr geht eigentlich.
- 1:10:13Genau, das nochmal als, äh, okay, wo man...
- 1:10:16Aber ich fand das grad ganz interessant eigentlich, dass du meintest,
- 1:10:19dass du Pivots, äh, Bakes quasi in einem Mesh, weil wir tatsächlich was ähnliches tun.
- 1:10:24Und zwar haben wir Wind-Effekte so auf Pflanzen.
- 1:10:28Und, äh, da haben wir quasi so eine Art Textur, die sozusagen angibt, wie sie sich bewegen.
- 1:10:34Also zum Beispiel der unterste Part bewegt sich am wenigsten,
- 1:10:36der oberste Part am häufigsten oder am meisten eher.
- 1:10:38Und das, jetzt kommen wir zu dem Thema von davor, das hat das Batching zerstört,
- 1:10:42weil unsere Pflanzen quasi ihre Position kennen müssen. Wo bin ich in der Welt?
- 1:10:47Um dann zu sagen, wenn an diesem Punkt in der Welt Wind ist,
- 1:10:49dann bewege ich mich accordingly quasi.
- 1:10:52Und wenn man das jetzt baken würde, dann verlieren sie ihre Position,
- 1:10:55weil sie ja mit einem Draw-Coyl gezeichnet werden und alle hätten dann dieselbe
- 1:10:58Position des gemeinsamen Pivot-Punkts.
- 1:11:00Und deswegen brauchte ich dann pro einzelne Pflanze einen Pivot-Punkt und das
- 1:11:05habe ich im Endeffekt dann auch quasi in eine Textur gebakt,
- 1:11:07die dann sozusagen in unserem Fall 2D einfach nur per XY-Offsets angeben zu
- 1:11:12ihrem Pixel, zu seinem gemeinsamen Pivot-Punkt,
- 1:11:15wodurch ich dann diesen Pivot-Punkt wieder auslesen kann pro Pixel und dann den Wind applien kann,
- 1:11:20was ich auch, ja, interessant auf jeden Fall, was hier auch eigentlich alles
- 1:11:24so ein bisschen drinsteckt.
- 1:11:25Ach so, okay, das ist dann eine Textur pro Pflanze oder eine große,
- 1:11:30die ganz viele Pivots irgendwie beinhaltet?
- 1:11:33Im Großen und Ganzen ist es,
- 1:11:34Dadurch, dass wir ja Sprites haben,
- 1:11:36ist es eine Textur, die sozusagen flächendeckend ist zu diesem Sprite.
- 1:11:41In dem Rotkanal steckt, glaube ich, dann drin, wie stark es sich bewegen darf.
- 1:11:45Also sprich, schwarz bedeutet, du darfst dich gar nicht bewegen,
- 1:11:47weil ich zum Beispiel ganz unten am Boden bin.
- 1:11:49Und wenn es hoch ist, eins, dann heißt es, ich darf mich viel im Wind bewegen.
- 1:11:53Und dann habe ich quasi auf den G- und B-Kanälen dann die Pivot quasi gebakt
- 1:11:58zu einem gemeinsamen Punkt, wo er dann tatsächlich steht in der Welt,
- 1:12:01um dann, ja, seine Position wieder rauszubekommen, wenn es gebakt wird.
- 1:12:06Okay. Ich weiß nicht, ob ich es
- 1:12:08ganz genau verstanden habe, aber zu den Pflanzen komme ich auch nochmal.
- 1:12:12Ich wollte nur ganz kurz nochmal bei dem Baking bleiben, weil eine Sache,
- 1:12:15genau, das muss ich hier noch aufschreiben.
- 1:12:17Wann genau wird das gebaked? Also, weil ich mach euer Spiel auf in Unity und
- 1:12:21dann kann ich das ja im Level-Editor noch schön modifizieren.
- 1:12:25Ich kann Objekte rumschieben, ich kann auf den Boden malen und so.
- 1:12:28Und zu diesem Zeitpunkt ist es ja nicht in Texturen gebaked. Wann?
- 1:12:34Also, wahrscheinlich beim Building dann, wenn ihr die Version baut, oder?
- 1:12:38Also, im Endeffekt schon ein bisschen vorher ist es gerade noch ein manueller Prozess.
- 1:12:42Es gibt so einen Button, da klickst du drauf und dann Leta, Chunk für Chunks,
- 1:12:46die Welt, bake das, dann legt das auch tatsächlich als Textur ab.
- 1:12:49Die Texturen werden nur, wenn man alle davon lädt, viel zu groß.
- 1:12:52Deswegen pushen wir es zum Beispiel nicht mit ins Git rein, weil man sie auch rekonstruieren kann.
- 1:12:57Und der Rechner, der dann im Endeffekt baut, braucht zum Bildprozess diese Texturen
- 1:13:02bereits, um sie dann zu replacen.
- 1:13:04Das heißt, vor dem Bild irgendwann muss man mal auf dieses Knöpfchen gedrückt
- 1:13:07haben, dann hat er diese Texturen gebaked und zum Bauprozess kickt er dann die
- 1:13:11ganzen alten Objekte raus, die dann quasi gebaked sind und fügt dann stattdessen
- 1:13:15diese einzelne Textur ein.
- 1:13:17Und jedes Objekt, was rausgeworfen wird, hat halt irgendwo einen Tag.
- 1:13:22Dadurch weiß der Bildprozess erstens, alle diese Objekte mit diesem Tag müssen
- 1:13:26in dieses Bild und dann später weiß der Bildprozess, okay, und das kann jetzt
- 1:13:29alles rausgelöscht werden.
- 1:13:31Genau, genau, genau.
- 1:13:32Ah, okay.
- 1:13:33Genau, und dieses Tagging erfolgt so ein bisschen implizit. Also es hat nicht
- 1:13:36wirklich einen Tag, sondern es wird in eine Methode geworfen,
- 1:13:39hey, darf ich dich kicken? Und die gibt dann ja oder nein zurück quasi.
- 1:13:43Das heißt, zum Bauprozess wird diese Methode auch nochmal angefragt.
- 1:13:46Also wenn man, sagen wir mal, es zu früh gebaked hat und man hat irgendwas verändert,
- 1:13:51dann kann aus falsche Objekte gekekt werden.
- 1:13:53Aber in der Regel passiert das nicht und deswegen, also genau.
- 1:13:56Aber wenn ich jetzt ein neues Objekt male, ich male jetzt ein Kissen,
- 1:14:00was auf dem Boden liegen soll.
- 1:14:02An irgendeinem Punkt muss ich ja sagen, das ist ein Objekt, das möchte ich gerne
- 1:14:05auf dem Boden haben, weil ein Charakter kann nie dahinter sein.
- 1:14:09Irgendwann muss ich das ja definieren. So hier, das ist eins von diesen Dingern,
- 1:14:13die sollen gebaked werden und können dann weg. Wie mache ich das denn?
- 1:14:15Also momentan, also du als Artist musst ja gar keine Gedanken darüber machen,
- 1:14:19du freust dich einfach und playst deine Sachen.
- 1:14:21Okay.
- 1:14:22Oder als Level-Designer oder was auch immer. Entweder wissen,
- 1:14:25also im Endeffekt die Information, ob es gebaked werden soll oder nicht,
- 1:14:29fische ich mir aus dem Objekt selber.
- 1:14:31Also ich gehe zum Beispiel seinen Sprite-Renderer durch, frage ab,
- 1:14:33hey, auf welcher Ebene liegst du, auf welcher Render-Order liegst du.
- 1:14:37Und das Objekt von sich heraus weiß schon, ich bin auf Render-Order 0,
- 1:14:41auf On-Floor als Beispiel. Und dann weiß der Algorithmus, alles klar,
- 1:14:45on Floor 0 darf gekickt werden. Und dann gibt es aber ganz viele Edge Cases.
- 1:14:48Zum Beispiel gibt es auch manchmal Orte, wo zum Beispiel Kissen dynamisch aktiviert
- 1:14:53oder deaktiviert werden.
- 1:14:54Und das dürfte ich ja nicht baken, weil dann sind die immer sichtbar,
- 1:14:58obwohl es nicht sichtbar sein soll oder so. Und die Objekte haben dann nochmal extra Abfragen.
- 1:15:02Eigentlich dürfte es gebaked werden, aber du hattest folgendes Skript dran und
- 1:15:06deswegen darf ich es doch nicht baken als Beispiel.
- 1:15:08Ah, okay. Ja, wenn irgendeine Quest zum Beispiel sagt, dass das Bärenfell,
- 1:15:13was auf dem Boden liegt, dann geklaut wurde oder sowas.
- 1:15:16Genau, genau, genau.
- 1:15:17Krass, ja. Das ist ja alles sehr kompliziert. Aha.
- 1:15:21Ja, es wäre auch echt sehr spät, dass es in der Entwicklung eingebaut hätte.
- 1:15:24Hätte man alles früher machen können, wäre es vielleicht etwas smoother geworden.
- 1:15:27Aber wir haben das ein bisschen unterschätzt, die Performance und die Switch
- 1:15:29und so und mussten am Ende einfach dann mit Kanonen um uns schießen,
- 1:15:33um möglichst viel Performance noch rauszuholen.
- 1:15:35Und dann hast du gesagt, genau, das wird als JPEG abgespeichert,
- 1:15:38aber das ist nur dafür da, damit es auf der Festplatte relativ klein ist, ne?
- 1:15:43Weil im Grafikkartenspeicher wird es da dann eh reingeladen und da ist es ja
- 1:15:47nicht JPEG, sondern es halt,
- 1:15:50uncompressed.
- 1:15:52Wobei, auf der Grafikkarte gibt es auch verschiedene Texturformate und manche
- 1:15:56davon haben auch, also eine Compression nicht im Sinne von, es hat weniger Festplattenspeicher,
- 1:16:00aber es benötigt weniger RAM.
- 1:16:02Inhaltlich bin ich da auch nicht zu deep drin, aber zumindest gibt es,
- 1:16:05also deswegen gibt es quasi zwei Compressions, einmal die für die Festplatte
- 1:16:07und einmal den für den RAM und wir nutzen im Endeffekt beides.
- 1:16:10Ja, jetzt will ich das ja auch noch mal weiter ausbreiten, denn aus irgendeinem
- 1:16:13Grund, und ich weiß nicht warum, woher das kommt, habe ich immer gedacht,
- 1:16:17dass die DXT-Texturen, also die komprimierten Formate, DDS kennt man ja,
- 1:16:23das ist das File-Format und die Kompression ist dann zum Beispiel DXT 1 oder 3 oder 5,
- 1:16:29heute nennt man das BC1 bis BC7 und BC steht für Block Compression,
- 1:16:34dass die nur dafür da sind, dass die Texturen möglichst klein sind,
- 1:16:36wenn man sie zur Grafikkarte lädt und dass sie dann dort uncompressed im Speicher
- 1:16:41rumliegen. Und das stimmt nicht.
- 1:16:43Und ich glaube, das stimmt auch schon eine ganze Weile nicht.
- 1:16:46Und irgendwie habe ich das aber im Kopf drin.
- 1:16:48Es ist so, dass ich verlinke da auch mal ein paar Links eben,
- 1:16:53YouTube-Videos und ein paar Artikel, dass die halt sagen, dass die Grafikkarten
- 1:16:57heute eben on the fly dekomprimieren.
- 1:17:00Das heißt, die Textur, die liegt einfach komprimiert, auch im Speicher, schön klein.
- 1:17:05Und wenn die Grafikkarte da irgendwas rauslesen will, dann macht die da on the
- 1:17:08fly eine Decompression und kriegt die Pixel. Das nur nochmal zur Klarstellung.
- 1:17:13Ich weiß nicht, das ist so ein Urban Legend oder so, die ich mir irgendwie mal
- 1:17:16im Kopf gesetzt habe. Wahrscheinlich habe ich es noch nicht mal irgendwo gelesen,
- 1:17:19sondern mir einfach so vorgestellt, dass man ja, wenn man ein ZIP-File auf dem
- 1:17:22Computer hat, muss man das ja auch erst mal so entpacken, damit man es benutzen kann.
- 1:17:26Vielleicht kommt daher meine Vorstellung, dass auch die Texturen da im Speicher entpackt werden.
- 1:17:31Aber das stimmt halt nicht. Und wenn man das nicht mehr hat,
- 1:17:33dann kann man das nicht mehr so entpacken.
- 1:17:35Mhm, okay, ja, okay, okay. Und dann, genau, und dann kommt, das fand ich ganz
- 1:17:41interessant, es gibt ja in der Welt auch Wasser und das kommt dann obendrauf.
- 1:17:45Also erst wird das ganze Terrain gerendert mit Wiese und alles und ist ja gar
- 1:17:49nicht mal so unrealistisch eigentlich, weil unter einem See ist natürlich auch was,
- 1:17:53also Algen oder so, aber bei euch ist es dann halt zum Beispiel eine Wiese und
- 1:17:57dann wird obendrauf das Wasser gerendert. ähm, ja.
- 1:18:01Genau, das ist vor allem deswegen da, weil das Wasser nochmal ein bisschen,
- 1:18:05eigentlich würde Wasser auch gebaked werden und es war am Anfang in dem Algorithmus
- 1:18:08auch immer unter dem Spieler und deswegen baken wir es auch.
- 1:18:11Das Problem bei Wasser ist, dass es manchmal Objekte gibt, die auf dem Wasser
- 1:18:16sein sollen, aber durchs Baking unter dem Wasser zum Beispiel liegen.
- 1:18:20Und auch ein paar andere visuelle Effekte, zum Beispiel gibt es da so kleine
- 1:18:23Wasserwellen, die sind animiert, deswegen können wir das zum Beispiel nicht baken.
- 1:18:26Oder auch die Kanten von dem Wasser zum Land, Und es sind ja Teils,
- 1:18:31die sind auch animiert. Da gibt es so ein bisschen so Wasser.
- 1:18:36Und entsprechend, genau, haben wir das Wasser einfach nicht gebakt.
- 1:18:39Eigentlich wäre es schöner gewesen, die vermutlich auch zu baken,
- 1:18:42aber das hatte zu viele Seiteneffekte.
- 1:18:44Das ist aber ein guter Punkt. Es gibt nämlich da so Sonderfälle.
- 1:18:48Und da bin ich mal gespannt.
- 1:18:49Also es ist nämlich so, man denkt sich ja so, oh, das ist ja alles easy und Pixelart.
- 1:18:53Das ist ja eh für Babys und das geht alles ganz einfach und so weiter.
- 1:18:56Da gibt es ja immer so Aussagen wie Pixelart ist ja nichts wert und so.
- 1:18:59Und ein schöner Sonderfall, wo man wieder mal merkt, abgesehen von diesen ganzen
- 1:19:02Sachen, die wir jetzt schon besprochen haben, wie die ja alle super kompliziert
- 1:19:05sind, gibt es nämlich manche Objekte, die stecken im Wasser.
- 1:19:10Und das heißt, man sieht zum Beispiel einen Ast, der im Wasser steckt und dann
- 1:19:14sieht man eben einen kleinen Teil, der unter Wasser ist, der ist dann halt dunkel und blau.
- 1:19:18Und dann, wo der Ast eben über das Wasser hinausragt, sieht er halt braun aus,
- 1:19:22wie so ein Ast, wie man sich das halt vorstellt.
- 1:19:25Und da habe ich mich gefragt, so, aha, wie ist das denn?
- 1:19:28Weil, wenn man jetzt aus 3D kommt, easy, das Wasser ist eine eigene Plane,
- 1:19:31steckt man da irgendwie ein Objekt rein, wird das mit dem Scheder eingefärbt,
- 1:19:34bla bla bla, ist ja easy. Das ist ja wie in der echten Welt sozusagen.
- 1:19:37Aber in 2D gibt es ja keine Tief- und Überlagerung in dem Sinne.
- 1:19:43Es ist halt alles eine Fläche. Und der Ast weiß ja gar nicht,
- 1:19:45dass er jetzt unter irgendwas ist.
- 1:19:47Ja, ja, das, ja.
- 1:19:49Und ich habe schon, ich habe sogar schon herausgefunden, wie es bei,
- 1:19:52wie heißt es, Seegras, nee, wie heißt das, was im Wasser steckt mit diesen braunen Dingen?
- 1:19:57Ja, ich weiß, was du meinst, Reeds, ich weiß gar nicht, wie es auf Deutsch heißt.
- 1:20:00See, Farm, Garmen?
- 1:20:02Warte, ich frag kurz, Reeds, Englisch? Schilf.
- 1:20:05Schilf, Schilf, genau. Schilf heißt das.
- 1:20:09Da habe ich schon gesehen, dass der Teil unter Wasser und der Teil über Wasser
- 1:20:14ist ein getrenntes Pride.
- 1:20:16Ja, und das ist eigentlich die ganze Magie da. Also, das sind einfach zwei verschiedene Sprites.
- 1:20:20Da ist gar nichts, steckt gar nichts im Wasser. Das ist einfach,
- 1:20:23das sind einfach zwei verschiedene Sprites. Eins ist eben dann eingefärbt.
- 1:20:27Aber ist das bei dem Ast, den ich beschrieben habe, auch so?
- 1:20:30Das ist einfach am Stück gepixelt. Also, wenn du die Ace Prater dazu aufmachst,
- 1:20:34da ist einfach Holz und dann ist da blau drin und dann ist da wieder Holz und
- 1:20:39dann ist da blau drin und so weiter. Also, es ist einfach so gezeichnet.
- 1:20:41Ähnlich wie man ein Loch pixeln würde. Da ist ja nicht ein wirkliches Loch in
- 1:20:45der Welt, sondern du zeichnest es so, dass es so wirkt, als sei es ein Loch als Beispiel.
- 1:20:49Und so ist das hier auch. Es wurde einfach so gezeichnet, dass es unter Wasser wirkt.
- 1:20:52Deswegen dürftest du dieses Objekt zum Beispiel nicht an Land placen.
- 1:20:55Angenehm, wir würden so einen Ast auch auf Land haben wollen,
- 1:20:58bräuchte man eine zweite Variante, wo das Blau dann nicht drin ist.
- 1:21:01Gut, das ist, das glaube ich, es macht Sinn. Das sind statische Objekte,
- 1:21:05die kann man platzieren und dann ist das alles gut.
- 1:21:08Und solange niemand böse ist und einfach Objekte woanders platziert,
- 1:21:14merkt es keiner. Aber es gibt einen Sonderfall.
- 1:21:16Es gibt Schlamm im Spiel, habe ich gesehen. Und das ist ganz spannend,
- 1:21:20weil Schlamm oder Moor, sage ich mal, da kann man durchlaufen und dann versinkt
- 1:21:27man ein bisschen in diesem Moor und die Füßchen, die sind dann plötzlich schlammig.
- 1:21:31Und das heißt, das ist wahrscheinlich eins der wenigen Objekte,
- 1:21:35die dynamisch, also man selbst halt als Spielfigur, die dynamisch in sowas reinlaufen
- 1:21:39können und dann halt dynamisch müssen die Füßchen schlammig sein.
- 1:21:43Also beziehungsweise, ich glaube, die Darstellung ist quasi,
- 1:21:47dass die Füße unter dem Schlamm sind und dann halt ein bisschen brauner oder grüner werden.
- 1:21:51Wie ist das denn gemacht? Das ist ganz spannend. Weil, nochmal zur Wiederholung,
- 1:21:56es gibt ja keine richtige Tiefe.
- 1:21:57Also man kann ja nicht in so ein Loch fallen, weil es gibt ja nur eine Ebene bei 2D.
- 1:22:01Das heißt, auch dieser Effekt, dass man so das Gefühl hat, dass man so einsackt,
- 1:22:04muss irgendwie gefakt sein.
- 1:22:06Ja, alles ist gefakt. Genau.
- 1:22:10An der Stelle ist es so, tatsächlich wird der Schlamm an sich auch in den Boden
- 1:22:13gebakt. Das heißt, wenn du die ...
- 1:22:15Texture dazu angucken wirst, in diesem Chunk ist es da schon quasi fertig drin.
- 1:22:20Die Umsetzung selber ist im Endeffekt, dass an der Stelle, wo über solcher Schlamm
- 1:22:24ist, wo man einsingen kann, ist zusätzlich auch ein Physik-Collider quasi.
- 1:22:27Und wenn der Spieler diesen Physik-Collider quasi platziert,
- 1:22:30äh, nicht platziert, berührt, kollidiert, dann setzen wir sein Visual ein paar Pixel nach unten.
- 1:22:36Mhm.
- 1:22:36Äh, zwei, drei, ich weiß grad nicht wie viel. Und die Füße sind im Endeffekt ein Shader.
- 1:22:41Und der Shader fragt im Endeffekt ab, hey, auf welchem oder bekommt von diesem
- 1:22:45Collider mitgeteilt, es ist Schlamm und nicht Wasser. Wir haben einen ähnlichen Effekt in Wasser.
- 1:22:49Nur dann ist dann die Fußfarbe blau und hier ist es halt eher so braun.
- 1:22:53Und dann im Shader wird dann quasi von seinem Pivotpunkt alles,
- 1:22:57was x Pixel unter dem Pivotpunkt liegt, quasi eingefärbt in Farbe des Bodens.
- 1:23:03Genau, so haben wir das da quasi umgesetzt.
- 1:23:06Okay, das ist, ja okay. Das heißt, der Shader hat, ja, das ist einfach ein Shader,
- 1:23:10der einen ganz speziellen Modus hat für Wasser und Schlamm. Genau.
- 1:23:14Genau, genau.
- 1:23:15Special Case, ja. Okay. Ja, spannend. Das sind so die kleinen Sachen,
- 1:23:19aber da hab ich dann drauf geachtet beim Spiel. Das ist sehr, sehr schön.
- 1:23:22Da gab's auch einen witzigen Edge Case, wenn man sehr nah an der Kante des Wassers
- 1:23:26oder des Schlammes war und man geht ja rein, hab ich am Anfang den Spieler komplett
- 1:23:29nach unten verschoben. Und nicht nur sein Visual.
- 1:23:32Und dadurch hat sich aber auch sein Collider nach unten nach oben verschoben.
- 1:23:35Und nachdem, wo du standest, konntest dann mal passieren, du betrittst es, du wirst verschoben.
- 1:23:39Durch die Verschiebung betrittst du es aber nicht mehr und wirst wieder rausgeschoben.
- 1:23:42Da gab's so ein da, da, da, da, da, da, da, da.
- 1:23:44Ja.
- 1:23:44Und deswegen habe ich dann irgendwann nur das Visual verschoben und nicht seine Gesamtposition quasi.
- 1:23:49Aber das bedeutet ja jetzt mal wirklich ein Edge Case.
- 1:23:53Wenn es ein Projektil gäbe, was auf mich zufliegt und quasi die obere Hälfte
- 1:23:59meines Kopfes treffen würde, jetzt stecke ich im Schlamm, bin ein paar Pixel weiter runter.
- 1:24:04Visuell würde mich das Projektil jetzt also nicht mehr treffen,
- 1:24:07weil es fliegt gerade so über meinen Kopf hinweg.
- 1:24:09Aber mein Physikobjekt hat sich ja nicht verändert. Das ist ja immer noch an der anderen Stelle.
- 1:24:13Ich wäre also getroffen, obwohl ich visuell, weil ich im Schlamm stecke,
- 1:24:18weil ich visuell ein bisschen weiter unten bin.
- 1:24:20Diesen Edge-Case gäbe es und deswegen verschieben wir auch nicht mehr zwei,
- 1:24:23drei Pixel und die meisten Projektile sind schon groß genug,
- 1:24:27dass das nicht auffällt. Zumindest ist es bisher niemandem aufgefallen.
- 1:24:31Ich hoffe, wir haben jetzt hier kein Secret irgendwie preisgegeben und alle
- 1:24:34Leute beschweren sich ab sofort, wenn sie im Schlamm kämpfen.
- 1:24:36Ja, vor allem wenn der No-Hit-Run failed.
- 1:24:39Deswegen. Ja, genau, genau. Aber ne, das stimmt schon, das ist eigentlich ein
- 1:24:44Edge Case, der auftreten könnte, ja.
- 1:24:46Ah, okay. Du hast eben schon Pflanzen erwähnt und bei den Pflanzen ist mir was
- 1:24:51aufgefallen, das ist jetzt ein bisschen schwierig zu beschreiben,
- 1:24:54weil wir sind halt ein Audio-Podcast, aber ich, also und selbst ein Bild einblenden
- 1:24:58ist gerade ein bisschen schwierig, mache ich trotzdem.
- 1:25:01Aber es ist so, wenn man 2D-Pflanzen hat oder wenn man überhaupt Pflanzen hat,
- 1:25:05dann kann man die ein bisschen hin und her wickeln, damit dort ein bisschen
- 1:25:09Bewegung reinkommt, als wären sie eben vom,
- 1:25:12Vom Wind angeblasen. Und das funktioniert normalerweise über eine kleine, blurry Noise-Textur.
- 1:25:20Und dann distortet man ein bisschen die UVs und dann bewegen sich die Pixel ein bisschen hinher.
- 1:25:25Und bei euch ist mir aufgefallen, dass wenn man da mal ganz nah ran zoomt,
- 1:25:30das ist ein bisschen schwierig zu beschreiben.
- 1:25:32Also ich kann gar nicht genau beschreiben, was da passiert. Aber da sind so
- 1:25:35Pixel, die sich bewegen, übereinander schieben und dann auch kleinere,
- 1:25:43Also, sagen wir mal, nicht pixelperfekt.
- 1:25:46Es ist wirklich schwierig zu beschreiben. Es gibt so Artefakte,
- 1:25:48dass so kleine, dünne Pixellinien entstehen, weil da irgendwas distortet wird.
- 1:25:52Und ich verstehe nicht genau, was da passiert.
- 1:25:54Ja, das ist eine sehr gute Frage, was da eigentlich passiert.
- 1:25:58Das ist vermutlich darauf zurückzuführen, was ich vorhin meinte,
- 1:26:01dass wir diesen Pivot reinbaken.
- 1:26:03Weil diese Pflanzen werden nicht nur von Wind verschoben, sondern auch,
- 1:26:05wenn ich mich als Spieler den nähere und mit ihm kollidiere.
- 1:26:09Und dieses Artefakt ist dann aufgetrieben, als ich dieses Pivot-Baking eingebaut
- 1:26:13hatte. Bevor ich das eingebaut hatte, gab es diese Artefakte nicht.
- 1:26:17Und meine Vermutung ist, dass das einfach Rundungsfehler im Shader sind,
- 1:26:20die dadurch zustande kommen, dass diese Pivot-Map entweder nicht akkurat ist
- 1:26:26oder vielleicht werden Werte interpoliert, wenn sie dann im Shader ausgelesen
- 1:26:30werden, irgendwie sowas.
- 1:26:32Oder vielleicht mal auch im Shader irgendwas völlig falsch. Aber das ist tatsächlich
- 1:26:34einfach ein bisschen buggy.
- 1:26:37Ja, und vermutlich einfach Float-Ungenauigkeiten. Das ist zumindest meine Interpretation
- 1:26:44bisher, warum das auftritt.
- 1:26:46Ja, interessant. Also ich hoffe, das ist nicht zu verwirrend.
- 1:26:48Wenn ihr zuhört, ihr könnt ja, wenn ihr eine ruhige Minute habt,
- 1:26:51mal auf das Handy gucken oder bei YouTube oder so.
- 1:26:54Da kann ich ein Bild einblenden, wo man so das sieht. Ist ganz,
- 1:26:58ganz interessant. Ja, genau.
- 1:27:00Und wahrscheinlich wird es noch verwirrender, aber ich will es trotzdem nochmal
- 1:27:02nachfragen, weil ich habe das mit diesem Pflanzen-Pivotpunkt noch nicht ganz verstanden.
- 1:27:06Also es ist so, wenn man jetzt im 3D, wenn man jetzt einen Baum hat zum Beispiel
- 1:27:11und man möchte die einzelnen Äste bewegen und um den Punkt, an dem sie an dem Stamm ansetzen,
- 1:27:18rotieren, so ein bisschen, einfach so ein bisschen hin und her wickeln lassen,
- 1:27:21dann nehme ich mir die von mir aus den UV-Kanal 1 und 2 und speichere da rein
- 1:27:26einfach die XY- und Z-Koordinaten.
- 1:27:28Ich lade von dem Punkt, wo der Ast am Baumstamm ansetzt und im Shader lese ich
- 1:27:34das dann aus und bewege dann die Wörter von diesem Ast eben um diesen Punkt.
- 1:27:39Und das bedeutet, dass ich mehrere Pivot Points sozusagen für jeden Ast am Baum
- 1:27:43in dem Baummech an sich abspeichere.
- 1:27:46Wenn der Baum 5S hat, habe ich da eben 5 Stamm.
- 1:27:48Datenwerte reingeschrieben, schreibe ich dann in die Vertex-Daten rein.
- 1:27:53So, aber bei euch ist das ja nicht, also es klang für mich so,
- 1:27:58als wäre das so global für alle Pflanzen irgendwo abgelegt oder so.
- 1:28:02Nee, also jede Pflanze hat schon seine eigene Windmap, haben wir es im Endeffekt genannt.
- 1:28:06Ja.
- 1:28:06Und auch gleich nochmal, das ist kein schönes Bild, ich such dir gleich nochmal ein Bild raus.
- 1:28:11Ja.
- 1:28:11Aber ich nehme einfach das hier, ist egal. Schick dir das mal.
- 1:28:16Genau, das sind zum Beispiel jetzt Blätter eines Baumes. Und was man jetzt hier
- 1:28:20visualisiert, sieht, man kann da ja die Farben jetzt nicht interpretieren,
- 1:28:24weil ich die Farbenkanäle wieder als Daten missbrauche.
- 1:28:27Aber im Großen und Ganzen ist im Rotkanal quasi drin, wie sehr oder wie stark
- 1:28:31darf es sich bewegen im Wind, zwischen 0 und 1 sozusagen.
- 1:28:34Und auf dem G- und B-Kanal ist quasi definiert, wo liegt sein Pivotpunkt in
- 1:28:40relativ gesehen zu seinem Pixel an dieser Stelle.
- 1:28:44Und im Großen und Ganzen zeigen alle Pivot-Punkt-Daten eines Pixels auf demselben
- 1:28:49Punkt in der Textur, sagen wir einfach unten in der Mitte.
- 1:28:51Ja, genau, also wo die Pflanze beginnt.
- 1:28:54Genau, und das nutzen wir aus, also wir haben zwei verschiedene Arten,
- 1:28:59Dinge im Wind zu bewegen.
- 1:29:00Das sind einmal die Bäume, die du hier siehst, und dann Objekte am Boden,
- 1:29:03weil Objekte am Boden kann der Spieler auch mit kollidieren.
- 1:29:06Und das sähe sehr merkwürdig aus, wenn wir die Pflanze oder das Blatt an einer
- 1:29:10Stelle bewegen, weil der Spieler so ein bisschen gegen nur dieses Blatt läuft, dann,
- 1:29:13Fühlt es sich nicht so an, als ob sich der Busch bewegt, sondern dieses Blatt.
- 1:29:18Und angenommen, ich stehe in der Mitte des Busches, dann hätte ich so eine kreisförmige
- 1:29:21Distortion in jede Richtung und so verhält sich kein Busch.
- 1:29:24Und deswegen lesen wir quasi nicht jeden einzelnen Pixel aus,
- 1:29:27sondern seinen Pivot-Punkt.
- 1:29:29Und wenn der Spieler mit diesem Pivot-Punkt, ich nenne es mal kollidiert,
- 1:29:32es ist keine echte Kollision, die da stattfindet, dann bewege ich entsprechend
- 1:29:36die Blätter und so weiter.
- 1:29:39Und dafür ist diese Pivot-Map genau da. Die Pivot-Map selbst ist reingekommen,
- 1:29:44weil wir haben einen Ort im Spiel, das ist die Heide, südlich von der Taverne.
- 1:29:47Dort gibt es sehr, sehr, sehr, sehr, sehr, sehr, sehr, sehr,
- 1:29:50sehr, sehr, ich kann jetzt noch ein bisschen so weitermachen, viele Pflanzen.
- 1:29:52Eine von diesen Szenen hat ungefähr so viele Pflanzen oder Objekte in dieser
- 1:29:56Szene wie fast alle anderen Szenen zusammen.
- 1:29:59Da sind unsere Artes Berserk gegangen quasi.
- 1:30:03Und da wollten wir halt Batching einbauen. Aber das Batching hat dann diese
- 1:30:06Windeffekte völlig zerstört, weil dieser Pivot, sein eigentlicher Pivot,
- 1:30:09nicht ausgelesen werden kann, weil sie einen gemeinsamen Pivot bekommen.
- 1:30:12Für alles, was gebatcht wird und deswegen kam dann quasi diese Pivot-Map rein,
- 1:30:16damit wir die Objekte in der Heide wieder batchen können und damit schnell rendern. Genau.
- 1:30:21Genau, also für alle, die die Batchen jetzt zum ersten Mal hören,
- 1:30:24das ist im Grunde genommen, wie wenn man in Blender alle Objekte selectiert
- 1:30:28und dann joint oder in, jetzt muss ich überlegen, genau,
- 1:30:32in 3ds Max wäre es attached und dann hat man ein großes Objekt,
- 1:30:35aber das hat ja nur noch einen Pivot-Point und nicht,
- 1:30:37viele, wie man sie eben haben wollen würde, wenn man die Objekte einzeln rumdrehen
- 1:30:42oder rotieren möchte oder so.
- 1:30:44Genau, aber die Map, die du gezeigt hast, ist eben für eine Texture für einen Baum.
- 1:30:50Genau, genau.
- 1:30:50Aber im Batching, also und die beinhaltet sozusagen den Pivot,
- 1:30:55lokal im Local Space sozusagen zu diesem Baum.
- 1:31:00Aber wenn du die jetzt alle Bäume zusammenmergst in einen oder zusammenbatchst,
- 1:31:06dann weißt du ja nicht mehr, wo die ganzen Pivots sind, weil das war ja sozusagen
- 1:31:10nur für die lokale Szene abgespeichert.
- 1:31:13Aber wir reden ja jetzt dann plötzlich von WorldSpace.
- 1:31:15Das Gute ist, prinzipiell erstmal ja. In unserem Fall ist so ein bisschen WorldSpace
- 1:31:20und LocalSpace, ich sag mal, identisch.
- 1:31:23Weil im Endeffekt der Sprite, den wir rennen, der hat seine Position auf der CPU sozusagen.
- 1:31:28Aber was wir nicht mehr haben auf der GPU, ist dann sozusagen,
- 1:31:32oder andersrum. Den Shader, den wir verwenden, der kennt seine World Position.
- 1:31:35Also er weiß, in welcher World Position liegt mein Pixel. und dadurch kann ich
- 1:31:40dann in Word Position seine Local Position einfach abziehen,
- 1:31:42weil wir skalieren die Bäume nicht oder rotieren sie auch nicht oder sowas.
- 1:31:46Und deswegen kommen wir dann sozusagen von seiner Word Position des Pixels,
- 1:31:51Durch Addition, Subtraktion, was auch immer sein, ist Local Pivot Offsets trotzdem
- 1:31:55auf die Global Position in der Welt.
- 1:31:58Aber auch nur, wie gesagt, weil wir nicht rotieren, weil wir nicht skalieren und so weiter.
- 1:32:01Weil wir skalieren und zwar auf x-Achse, entweder plus oder minus eins,
- 1:32:04das ist tatsächlich auch nochmal da reingecodet in diese Textur.
- 1:32:07Ob es geflippt ist oder nicht.
- 1:32:08Ach so, okay, zum Flippen, ja, okay, genau.
- 1:32:10Weil sonst bewegt sich der Wind plötzlich für diesen Baum in eine andere Richtung
- 1:32:13und für alle anderen Bäume, also unser Wind geht in der Regel von links nach
- 1:32:16rechts und hätten wir das nicht eingebaut, dann gäbe es Bäume,
- 1:32:18wenn wir sie flippen und wir flippen, um einfach Aufwand zu sparen,
- 1:32:21damit wir eine Variation mehr haben,
- 1:32:23dann würde er genau andersrum seinen Wind bewegen. Also von rechts nach links dann.
- 1:32:26So, und ich hoffe, jetzt hören noch Leute zu. Es ist alles wahrscheinlich sehr,
- 1:32:30sehr deft, aber ich finde es total spannend.
- 1:32:33Genau. Und für alle, die auch so ein Spiel machen wollen, ist es,
- 1:32:35glaube ich, auch sehr spannend.
- 1:32:37Aber wir gehen jetzt noch mal in Pflanzen-Thema.
- 1:32:41Und das ist tatsächlich ganz spannend. Ihr habt Höhenfog eingebaut.
- 1:32:45Und das sieht man ganz besonders gut bei eben großen Bäumen.
- 1:32:48Und da habe ich mich, also die erste Frage ist für mich, also,
- 1:32:51oder andersrum, wir reden ja über ein 2D-Spiel.
- 1:32:54Das heißt, ich kann natürlich jetzt einen halbtransparenten Layer über das gesamte
- 1:32:57Spiel legen und dann sieht das so neblig aus.
- 1:33:00Und das hätte auch total ausgereicht, glaube ich. Das hätte man so machen können,
- 1:33:05so einfach so, um eben so einen Nebeleffekt zu machen.
- 1:33:07Aber ihr habt gesagt, nö, wir wollen mehr. Ja,
- 1:33:10und jetzt ist es so, dass so ein großer Baum, der kann tatsächlich unter,
- 1:33:15also der untere Teil des Baumes so in Nebel eingehüllt sein und der Baumwipfel
- 1:33:21guckt oben über dem Nebel raus,
- 1:33:24wie auch hier in 3D, total easy.
- 1:33:27Ja, ich meine, man hat die 3D dann so, aber wir reden ja über ein 2D-Spiel,
- 1:33:30da ist das ja noch nicht so einfach.
- 1:33:32Und das habe ich nämlich zufällig bei euch im Stream gesehen.
- 1:33:35Ich glaube, der Johannes hatte das gezeigt und ich habe gesagt,
- 1:33:37hey, warte mal, da ist ja Höhenfunk drin, wie macht denn ihr das?
- 1:33:40Und genau, das ist total, total cool. Und du hast jetzt hier so Sachen gepostet.
- 1:33:45Kannst du mal erzählen, wie ihr das macht?
- 1:33:48Genau, genau. Also die Inspiration war von Graveyard Keeper.
- 1:33:51Das sind jetzt hier die Bilder von Graveyard Keeper, nicht von uns.
- 1:33:53Die haben es einfach technisch ein bisschen schöner.
- 1:33:55By the way, die haben einen sehr schönen Beitrag bei damals noch Gamasutra.
- 1:33:58Ich weiß gar nicht, wie die Seite gerade heißt, aber die ist irgendwie anders.
- 1:34:00Für ein paar visuelle Effekte, die sie verwendet haben. Und da haben wir uns
- 1:34:02initial auch sehr stark inspirieren lassen.
- 1:34:05Unter anderem an diesem Fog-Effekt. Und Chris war ein unglaublicher Fan von diesem Fog-Effekt.
- 1:34:09Für mich hätte es tatsächlich so ein bisschen gereicht, wie auch in der Vision-Demo,
- 1:34:11da hatten wir das schon, was du meinst, so ein bisschen, es wird einfach grob
- 1:34:14drübergelegt überall und dann hat man so ein bisschen, ja, Fog.
- 1:34:17Aber Chris fand diesen Effekt so geil, dass wir den halt für Drova eingebaut haben.
- 1:34:20Und ich habe mich genau dasselbe gefragt, hey, wie machen die das eigentlich?
- 1:34:23Weil auch durch den Artikel bin ich irgendwie, irgendwie check ich es nicht.
- 1:34:25Aber was machen die? Okay.
- 1:34:27Und bin dann im Endeffekt, was du wahrscheinlich auch hier mit Drova gemacht hast, mit so einem GPU,
- 1:34:32Profiler-Tool, ich weiß gerade nicht, wie sie heißen, rangegangen und habe mir
- 1:34:36einfach mal geguckt, wie drauen die eigentlich ihre Sachen.
- 1:34:38Ein kleiner Hinweis hier, diese Profiler-Tools, also ich kenne zum Beispiel
- 1:34:42Nvidia Insight, Intel GPA und RenderDoc ist auch sehr bekannt.
- 1:34:47Es gibt auch noch eins Pix, P-I-X, aber was wollte ich sagen?
- 1:34:51Ach ja, genau, ich wollte darauf hinweisen, dass ich einen kleinen Vortrag gemacht
- 1:34:55habe, wo es genau darum geht.
- 1:34:57Also ich zeige in diesem Vortrag, wie man die drei Tools, Inside,
- 1:35:01RenderDoc und GPA einsetzt, um dann eben in meinem Fall Acoustic Space Survivors
- 1:35:06und Elden Ring, das sind immer zwei Spiele, die man so gleich nebeneinander nennt,
- 1:35:11auf jeden Fall habe ich die beiden tatsächlich genommen, um diese Tools zu demonstrieren
- 1:35:17und ich zeige dann wirklich Schritt für Schritt, wie das geht,
- 1:35:19weil es ist manchmal nicht so ganz klar, wie kriege ich das überhaupt zum Laufen
- 1:35:22und so und manchmal gibt es eben auch Probleme,
- 1:35:25zum Beispiel, dass der das Kopierschutz bei Elden Ring, der mochte das gar nicht
- 1:35:30und dann zeige ich halt kurz, wie man die Detail umbenennt, damit der Kopierschutz
- 1:35:34eben da nicht dazwischen funkt und so.
- 1:35:36Und der Vortrag heißt Being a Tech Art Detective und ja, genau, da zeige ich das.
- 1:35:43Und vielleicht ist das ja hilfreich für jemanden hier, denn ja,
- 1:35:46das ist sehr praktisch damit, die Spiele zu untersuchen.
- 1:35:50Und bin dann Step by Step durchgegangen, hab dann gesehen, wie sie es gemacht haben.
- 1:35:53Der Ansatz im Großen und Ganzen ist einfach, dass du so, ich nenne es mal Bänder
- 1:35:58in die Szene liegst, die sozusagen den Fog darstellen und zwar von unten,
- 1:36:03nee, von oben nach unten, warte, halt in die Ränder reinfolge,
- 1:36:06ich glaube von oben nach unten.
- 1:36:07Das heißt, im Endeffekt hast du ein paar Bänder von Nebel, die sind jetzt an
- 1:36:11der Position wo auch immer, da machst du ein paar davon, dann kommt irgendwie
- 1:36:15dein nächstes Objekt, ist zum Beispiel der Baum und dann machst du die nächsten
- 1:36:18Layer vom Fog und dadurch layert sich das dann quasi so,
- 1:36:22weil einfach von einer Render-Order Teile des Fox dahinter liegen und andere
- 1:36:27Teile des Fox tatsächlich einfach davor liegen.
- 1:36:29Einfach weil es tatsächlich Sprites sind, die in der Szene zusätzlich gerendert werden.
- 1:36:33Ah, okay. Ja, klar. Ich meine, die Sprites können sich ja auch überlagern.
- 1:36:36Das heißt, es gibt eine Render-Reihenfolge.
- 1:36:38Also ein Haus ist irgendwo ganz hinten, dann kommt davor der Baum,
- 1:36:42dann kommt davor der Zaun und so.
- 1:36:44Und dazwischen haut man jetzt nochmal so Fogplanes, also mehrere Fogplanes.
- 1:36:49Das ist nicht nur eine Fogplane mit irgendeinem Magic Shader,
- 1:36:51der da irgendwelche Höhendaten aussieht, sondern es sind einfach verschiedene
- 1:36:54Planes dazwischen gesteckt.
- 1:36:56Das ist im Grunde wie, wenn man so manche Scheibenkäse gibt,
- 1:37:01da hat man zwischen jeder Käsescheibe so eine kleine Plastikfolie.
- 1:37:07So ist das im Grunde genommen.
- 1:37:08Ja, also ich wäre nie auf die Metapher gekommen, aber ja, im Großen und Ganzen ist das so.
- 1:37:13Das ist eigentlich ziemlich exakt so und jeder Käse ist ein Sprite.
- 1:37:16Ja, stimmt, stimmt. Und jetzt stell dir einfach vor, ein paar von diesen Käsescheiben
- 1:37:20werden weg, aber die Plastikdinger waren trotzdem da. Die sind ja auch so ein
- 1:37:22bisschen semi-transparent.
- 1:37:23Ja, genau, genau.
- 1:37:25Ja, das war damals auch so mein Heureka-Moment, als ich das so,
- 1:37:28wie machen die das? Magic, Tiefeninformationen, wie machen die das?
- 1:37:31Ja, und dann war es so, ich war so, okay, ist ja simpel eigentlich.
- 1:37:34Hat aber wieder Nachteile, auf der Switch haben wir es zum Beispiel gar nicht
- 1:37:37drin, den Shader für Nebel, weil dieser, nicht dieser Shader,
- 1:37:41weil diese Sprites im Endeffekt unser Batching zerstören.
- 1:37:43Weil man kann sich vorstellen, wir haben ganz viele Gräser oder Bäume nah beieinander
- 1:37:47und zwischen diese Bäume hauen wir jetzt plötzlich Nebel und deswegen können
- 1:37:50diese Bäume zum Beispiel nicht mehr zusammengerendert werden,
- 1:37:53sondern werden durch den Nebel quasi nicht mehr batchbar gemacht.
- 1:37:57Und deswegen haben wir auf der Switch zum Beispiel diesen gesamten Effekt deaktiviert,
- 1:38:00um einfach das Rendering weiterhin aufrechtzuerhalten.
- 1:38:04Okay, das ist eine dieser Sachen. Aber ich glaube, es gibt relativ wenige Sachen,
- 1:38:07die auf der Switch nicht so sind wie auf der PC-Version.
- 1:38:11Genau, ich glaube, das ist eigentlich fast das hier. Und wir baken den Schatten
- 1:38:16auch in den Boden von Objekten.
- 1:38:17Das machen wir auch auf der Switch. Also wenn du jetzt eine Textur anguckst
- 1:38:20vom PC, Von diesen gebakten Sachen, die wir vorhin einmal hatten,
- 1:38:24da findest du keine Schatten drin.
- 1:38:25Aber auf der Switch-Version sind die Schatten auch einfach eingebakt.
- 1:38:28Und warum würde man das nicht auf ... Also okay, warte mal.
- 1:38:33Meine Vermutung ist, wenn man unter einem Baum steht, will man vielleicht,
- 1:38:36dass der Schatten auf die Spielfigur auch gelayert wird, weil du ja unter dem Baum stehst.
- 1:38:41Und deswegen ist es in der PC-Version drin? Oder gibt es irgendeinen anderen Grund?
- 1:38:44Genau, unser Schatten ist auch noch mal ein spezieller Shader.
- 1:38:47Und wenn du mehrere Schatten bei uns im Spiel überlagerst, dunkeln sie sich
- 1:38:51nicht gegenseitig ab, sondern sie bleiben gleich dunkel sozusagen.
- 1:38:55Und dieser Effekt ist dann entsprechend auf der Switch raus,
- 1:38:59weil es wird gebaked und dadurch, wenn du dich draufstellst,
- 1:39:01wird es tatsächlich dunkel, dass es sich gegenseitig ab.
- 1:39:03Und am PC fanden wir den Effekt halt schön, dass es nicht abgedunkelt wird und
- 1:39:06deswegen haben wir es da nicht gemacht.
- 1:39:08Also du meinst, dass der kleine Blob-Shadow unter der eigenen Figur dunkelt,
- 1:39:12die anderen Schatten. Okay, das ist natürlich ein krasses Detail schon.
- 1:39:15Oder auch mehrere Bäume untereinander. Angenommen, du hast ganz viele große
- 1:39:17Bäume nah beieinander und ihre Schatten überlagern sich, da würden die auch
- 1:39:21schon sich gegenseitig abdunkeln, aber das tun sie in Drohwe halt aktuell auch nicht. Auf PC.
- 1:39:26Und,
- 1:39:30Wie habt ihr das gemacht? Also was ist da die Magic dahinter?
- 1:39:34Mit dem Stencil-Buffer quasi. Also im Großen und Ganzen, wenn wir einen Schatten
- 1:39:38reinrendern, schreiben wir in den Stencil-Buffer, da ist jetzt Schatten sozusagen.
- 1:39:41Und wenn ein anderer Schatten quasi dazukommt, der addiert sich sozusagen.
- 1:39:45Wir nehmen sozusagen das Maximum aus dem Stencil-Buffer. Das punktet sich ein
- 1:39:48bisschen anders, weil den Stencil-Buffer benutzen wir auch nur für was anderes.
- 1:39:50Aber im Großen und Ganzen kann man sich das so vorstellen.
- 1:39:52Also die anderen Schatten ignorieren einfach die Pixel, die schon im Stencil-Buffer
- 1:39:56drin sind. Sagen aber, okay, wenn da schon mal ein Schatten ist,
- 1:39:58dann komme ich jetzt nicht auch noch dazu.
- 1:40:00Es gibt noch eine andere Sache, die ihr anders gemacht habt in der Switch-Version.
- 1:40:04Und zwar läuft die mit 30 FPS.
- 1:40:06Ah ja.
- 1:40:08Statt 60. Und da gibt es ein Video, da hat, glaube ich, Chris gesagt,
- 1:40:14dass ihr am Kampfsystem ein bisschen noch schrauben musste, damit sich das auch
- 1:40:19in 30 FPS flüssig anfühlt.
- 1:40:23Und ich höre mal kurz rein, da ist die, der Wortlaut ist so was wie,
- 1:40:26genau, aber wir haben schon schöne Lösungen im Kopf, sagt Chris.
- 1:40:32Hast du da irgendeine Information, was so coole Tricks da waren,
- 1:40:35damit sich Sachen flüssiger anfühlen dann in 30 FPS?
- 1:40:38Das Ding mit der Switch-Version war quasi, du hast ja sozusagen nur halb so
- 1:40:43viele Bilder pro Sekunde als Mensch zu verarbeiten, um zum Beispiel auf einen
- 1:40:48Angriff des Gegners zu reagieren.
- 1:40:50Sagen wir, der Angriff des Gegners bei der 60 FPS-Version, weiß ich,
- 1:40:53wird sechs Frames lang abgespielt. dann sind es ja eine zehnte Sekunde.
- 1:40:57Aber eine zehnte Sekunde auf der Switch sind nicht sechs Frames,
- 1:41:01sondern nur drei Frames.
- 1:41:02Das heißt, du hast eigentlich nur drei Frames Zeit, seine Anticipation zu lesen, um darauf zu reagieren.
- 1:41:07Und das hat sich, weil es einfach weniger FPS hatte, hat es sich so angefühlt,
- 1:41:10dass man weniger Chance oder Zeit hatte, auf einen Angriff des Gegners zu reagieren.
- 1:41:15Und deswegen haben wir einfach hart für die Switch gesagt, dass unsere ganzen
- 1:41:19Animationen, die kampfbasiert sind, die nicht vom Spieler kommen,
- 1:41:24Einfach ein paar Frames quasi länger gehen, um das so ein bisschen entgegenzusteuern.
- 1:41:28Wir gehen dann nicht auf komplette 6 hoch, weil dann würde es ja doppelt so
- 1:41:30lange brauchen, bis dann der Angriff durchkommt, sondern, was weiß ich,
- 1:41:34immer zwei Frames mehr oder sowas.
- 1:41:36Und das war einfach eine schöne Faustregel, damit es sich ein bisschen smoother
- 1:41:40auf der Switch anfühlt, dass man die Chance hat, oh, er macht diesen Angriff,
- 1:41:43er spielt diese Animation ab, ich kann jetzt darauf reagieren.
- 1:41:46Das ist aber, glaube ich, eher so ein Wahrnehmungsding von Menschen,
- 1:41:51warum wir das gemacht haben.
- 1:41:52Aber in welcher Framerate sind denn die Animationen angelegt?
- 1:41:59Also intern arbeiten wir eigentlich primär mit Zeiten. Also wir sagen,
- 1:42:03hey, diese Animation wird für 0,1 Sekunde lang abgespielt.
- 1:42:08Die Framerate selbst kommt natürlich von unseren Pixelartists,
- 1:42:11weil die pixeln das ja in irgendeiner gewissen Art und Weise mit einer gewissen
- 1:42:14Anzahl an Frames und geben dann jedem Frame an, für wie viele Millisekunden
- 1:42:18die angezeigt werden sollen.
- 1:42:19Und dadurch ergibt sich dann sozusagen die Framerate. wir sind da
- 1:42:22aber auch ein bisschen flexibel also nicht alles im spiel hat dieselbe frame
- 1:42:26rate bestimmte angriffe sind schneller bestimmte angriffe langsamer einfach
- 1:42:30so dass es dem spielgefühl gut tut und sie nicht so weit auseinander klaffen
- 1:42:34dass man sieht das hat doppelt so viel frames und wirkt viel zu smooth oder
- 1:42:38sowas oder das hat viel zu wenig aber,
- 1:42:42wahrnehmungstechnisch nimmt man das recht selten wahr es gibt einzelne angriffe und,
- 1:42:46Tatsächlich sogar bei dem Dokument, was du hast, wo diese Blutfliege nicht übers
- 1:42:50Wasser kommt, die greift ja an und geht beim Angriff so leicht nach oben.
- 1:42:53Und bei diesem nach oben Angriff gibt es einzelne Phasen, wo die Frames sehr
- 1:42:57langsam abgespielt werden.
- 1:42:59Das wäre zum Beispiel so ein Edge Case, wo, wenn man das nicht gut einstellt,
- 1:43:02was man häufiger sehen könnte.
- 1:43:03Ja, also warum ich frage ist, oder noch eine kurze Seitentangente.
- 1:43:08Es gibt, ich glaube, eine Dokumentation zu dem Spider-Man-Film,
- 1:43:13Spider-Verse dem ersten.
- 1:43:14Und da haben sie, ich hoffe, ich erzähle jetzt nichts falsch,
- 1:43:17es könnte auch was anderes gewesen sein, aber es gibt auf jeden Fall Animationsfilme,
- 1:43:20wo sie normalerweise zwölf Frames pro Sekunde animiert haben.
- 1:43:25Also so typisch Cartoon oder so.
- 1:43:28Aber bei Action-Sequenzen, wenn also zum Beispiel sich eine Figur abrollt quasi,
- 1:43:32dann auf das Doppelte gehen.
- 1:43:34Und das heißt, das ist schon ein sehr drastischer Schritt, aber dadurch hast
- 1:43:38du in ruhigeren Szenen so diesen coolen handanimierten Style.
- 1:43:42Aber wenn es dann doch mal ein bisschen actionreicher wird, dann sieht es halt
- 1:43:46nicht zu joppy aus oder man vermisst irgendwas in der Bewegung,
- 1:43:50weil man irgendwie eine Key-Pose gar nicht mehr reinbekommt oder so.
- 1:43:53So, das finde ich schon ganz spannend, so diese Entscheidung da schon sehr drastisch
- 1:43:56plötzlich die FPS auch hochzuschrauben.
- 1:43:58Aber warum ich jetzt eigentlich gefragt habe, ist, diese Animation zum Beispiel
- 1:44:02für euer Spiel jetzt wirklich auf 60 FPS zu malen, was ja bedeutet,
- 1:44:0760 Bilder pro Sekunde, das wäre ja viel zu viel Arbeit.
- 1:44:10Und deswegen würde es sich ja auch lohnen, zum Beispiel zu sagen,
- 1:44:13nee, also die Artists, die malen in 12 FPS, also 12 Bilder pro Sekunde zum Beispiel.
- 1:44:21Diese Frames könnte man doch jetzt aber egal ob es 30 oder 60 FPS sind,
- 1:44:27immer gleich timen sozusagen, also ich hab jetzt noch nicht ganz verstanden, warum,
- 1:44:31ich geh jetzt mal davon aus, dass die Animationen angelegt wurden,
- 1:44:35nicht in 30 FPS und auch nicht in 60, sondern niedriger einfach um Arbeit zu
- 1:44:38sparen und ich versteh grad nicht ganz, warum,
- 1:44:42dann trotzdem da noch irgendwie extra was getweakt werden musste für die 30 FPS?
- 1:44:47Also, wie es zustande gekommen ist, als einfach, wir haben das Spiel auf der
- 1:44:50Switch gespielt und am PC war es easy, der Ripper macht sich zum Sprung bereit,
- 1:44:55du dodged, er verfehlt dich.
- 1:44:57Und auf der Switch war es irgendwie so, wenn mich der Ripper, oh, zack, also hoch.
- 1:45:01Ich hatte irgendwie gar kein Gefühl, zu reagieren.
- 1:45:05Und wir haben es im Endeffekt dann damit erklärt, dass einfach die,
- 1:45:09also unsere Frames sind recht wenig nicht, oder werden recht schnell abgespielt,
- 1:45:12also zum Beispiel, wenn man sich mal den Ripper anguckt, ich gucke mal kurz,
- 1:45:15um Actual-Zeiten zu nennen, der Angriff vom Ripper, wir nehmen jetzt mal einen
- 1:45:20normalen Angriff, wird angezeigt 0,16 Sekunden.
- 1:45:240,16, ja.
- 1:45:25Bevor dann, okay, und da gibt es noch ein paar andere, also wir haben in unserer
- 1:45:28Animation verschiedene Phasen gezeigt und die Anticipation-Phase sind 0,16 Sekunden.
- 1:45:31Es kommen dann noch ein paar andere Phasen, bevor der eigentliche Angriff kommt,
- 1:45:34aber im Großen und Ganzen sagen wir, du hast weniger als 0,5 Sekunden Zeit,
- 1:45:37darauf zu reagieren und in diesen 0,5 Sekunden zeigen wir verschiedene Animationen ab.
- 1:45:42Er geht in die Knie, er macht seinen Maul irgendwie groß und dann kommt der Angriff.
- 1:45:48Und wenn wir jetzt auf der Switch sind, die Animationen werden trotzdem,
- 1:45:51was du meinst, gleich verteilt abgespielt und du hast auch 0,5 Sekunden Zeit, darauf zu reagieren.
- 1:45:59Aber die einzelne Phasen, zum Beispiel die Anticipation, die 0,16 Sekunden anhält,
- 1:46:02das sind ja bei 60 FPS, wären das 10 Frames, die würde man auf der Switch nur
- 1:46:07fünf Frames lang sehen, weil du ja einfach halb so viel Frames pro Sekunde hast.
- 1:46:12Das heißt, du hast weniger, nicht Zeit ist das Falsche, sondern du hast weniger
- 1:46:15visuelles Feedback, wie lange eine einzelne Phase der Animation angezeigt wird,
- 1:46:21um sie dann zu kognitiv zu verarbeiten, um dann darauf zu reagieren.
- 1:46:25Und was vielleicht auch noch dazu kommt, dadurch, dass wir das Spiel nur noch
- 1:46:2760 FPS haben, wenn ich in dem Moment, wo ich klicke, gibt es im Worst Case vielleicht
- 1:46:32auch noch mal einen kleinen Delay von 1,30 im Vergleich zu 60 FPS bis dann die
- 1:46:37Taste vielleicht auch anschlägt.
- 1:46:38Und dadurch gibt es irgendwie, es ist nicht viel, aber einen kleinen Mismatch
- 1:46:43zwischen diesen beiden Versionen einfach und wie responsive das Game ist.
- 1:46:48Und deswegen haben wir dann quasi von den Angriffen von den Gegnern einfach
- 1:46:52gesagt, okay, wir zeigen die einfach ein, zwei Frames länger an.
- 1:46:55Interessant, ja. Das sind so Details, da macht man sich keine Gedanken,
- 1:47:01wenn man so ein Spiel anfängt.
- 1:47:02Und dann fragt man sich auch immer so, warum dauert ein Spiel eigentlich so
- 1:47:04lange zu entwickeln? Das sind doch nur so ein paar Figuren drauf zu sehen und
- 1:47:08ein Schwert und ein Baum und dann läuft das schon.
- 1:47:10Also dazu muss man natürlich auch nochmal sagen, es ist...
- 1:47:13Ich glaube, es macht gar nicht so einen großen Unterschied zwischen 2- und 3D-Spielen,
- 1:47:17sie, sage ich mal so, auf jeden Fall auf code-technischer Basis zu entwickeln,
- 1:47:20weil du brauchst trotzdem Pathfinding, Objekte müssen von A nach B,
- 1:47:23es muss irgendwie vernünftig laufen, du brauchst ein Inventar,
- 1:47:26nicht Simulation, Management-System und so weiter, das brauchst du ja auch alles im 3D.
- 1:47:30Natürlich im 3D, Grafiken sind schicker, aber das kümmern sich die Artists hoffentlich
- 1:47:34drum, nicht die Programmierer.
- 1:47:36Also ich habe das Gefühl, auf Programmierebene nimmt sich 2- und 3D gar nichts
- 1:47:39und ich glaube, natürlich schon Physikkollision oder ein Parabelflug im 3D ist
- 1:47:45mathematisch ein bisschen komplizierter, aber kann man auch alles online irgendwo nachgucken.
- 1:47:49Im Großen und Ganzen habe ich das Gefühl, die technische Grundlage ist eigentlich
- 1:47:52ähnlich kompliziert und der Rest sind so ein bisschen, ich möchte sagen,
- 1:47:573D ist genauso einfach, aber ja. Ja, und ja.
- 1:48:00Was ich weiß, ist zumindest, also Rotation ist ja ein Riesending,
- 1:48:05in 2D relativ easy, irgendwie was zu rotieren, easy peasy, aber in 3D ist es
- 1:48:10dann sofort irgendwie, okay, hallo Quaternions. Ja, genau.
- 1:48:14Und das Zweite ist, wo viele strugglen in 3D, ist auch Kamera.
- 1:48:18Eine gute Kamera in 3D, die nicht durch irgendwas durchklippt.
- 1:48:24Und, also ich meine, selbst in so Blockbustern wie irgendwie Dark Souls und
- 1:48:29Elden Ring hat man manchmal in den Kämpfen, steckt dann die Kamera,
- 1:48:32weiß ich nicht, zwischen irgendwie zwei Brückenpfeilern oder sowas und dann
- 1:48:35sieht man ganz kurz nichts und dann stirbt man und so, da bin ich selbst auch schon.
- 1:48:38Ich würde fast sagen, es ist gar nicht so selten, wenn ich ehrlich bin.
- 1:48:41Ich habe das Gefühl, es passiert immer mal wieder bei Dark Souls Elden Ring.
- 1:48:44Auch bei großen Bossen, wenn du versuchst, die zu fokussieren,
- 1:48:46die sind einfach so groß, dass die Kamera sich irgendwie so bewegt,
- 1:48:49dass du irgendwie sehe ich gerade gar nichts mehr so in der Richtung.
- 1:48:51Und das sind Sachen, die sind schon, da geht auch schon, also das hat man in 2D, nicht so in der...
- 1:48:58Wobei wir aber auch sehr viel Problem mit unserer Kamera hatten.
- 1:49:01Wir haben ja mittlerweile auch durch Optionsfall verschiedene Optionsmöglichkeiten,
- 1:49:04wie die Kamera sich verhält.
- 1:49:06Und es gibt immer noch sehr viele Leute, die durch Motion Sickness bekommen,
- 1:49:08dass unsere Kamera sich so ein bisschen zu schwankend anfühlt.
- 1:49:11Wir haben auch sehr viel Zeit in die Kamera gesteckt und sind auf jeden Fall
- 1:49:14auch nicht vollends zufrieden.
- 1:49:16Aber ja, ich gebe dir auf jeden Fall recht im 3D. Das ist nochmal ein bisschen tricky.
- 1:49:19Was sind denn die beiden Optionen, die ihr habt?
- 1:49:22Das eine ist, dass halt die Kamera sich automatisch... Angenommen,
- 1:49:25du stehst irgendwo rum und du bewegst, ich gehe jetzt erstmal nur vom PC aus,
- 1:49:29und du bewegst die Maus nach rechts, dann bewegt sich die Kamera auch nach rechts.
- 1:49:31Das ist der eine Modus. Also Kamera geht in die Richtung des Mauszeigers.
- 1:49:34Die andere Option ist, die Kamera geht nicht in Richtung des Mauszeigers,
- 1:49:38sondern du stehst jetzt und du guckst mit der Maus nach rechts,
- 1:49:40dann bleibt die Kamera so, wie sie ist und sie bewegt sich erst dann,
- 1:49:43wenn sich dein Charakter quasi bewegt, in die Richtung, in die dein Charakter
- 1:49:46dann auch entsprechend guckt.
- 1:49:48Das sind gerade die beiden Modi, die wir am PC haben. Und für Konsole,
- 1:49:52also für Joystick, ist es tatsächlich so, du bist immer hart auf der Spielfigur
- 1:49:55drauf und kannst dann die Kamera überschreiben mit dem rechten Stick und kannst
- 1:49:58dann so ein bisschen Twin-Stick-Shooter-mäßig dich umgucken.
- 1:50:01Ah ja, genau so habe ich es nämlich auch gespielt, ja. Speaking of Controller,
- 1:50:05es gibt ein Video, wo du zu sehen bist, mit fünf verschiedenen Gamepads.
- 1:50:14Ja.
- 1:50:16Ich glaube, ich habe es ich muss gerade mal suchen, ich habe irgendwas mit Joystick
- 1:50:19geschrieben, aber das ist natürlich Quatsch. Joy?
- 1:50:22Ich habe es ja auf jeden Fall gefunden in einem Dokument.
- 1:50:24Ah, okay, genau. Und da wollte ich mal fragen, also sehr vorteilhaft oder sehr
- 1:50:28vorbildlich ist er, ihr habt euch relativ früh schon entschieden,
- 1:50:31Controller-Support anzufangen, schon in 2021.
- 1:50:35Das ist cool. Ich glaube, Chris hatte erzählt, dass das eigentlich gar nicht
- 1:50:38geplant war, weil eigentlich so, ja, wer spielt denn mit Controller?
- 1:50:41Aber dann hat es das doch ganz gut angefühlt. Und ich wollte dich halt auch
- 1:50:44noch dazu fragen, was so deine Erfahrung war mit diesem ganzen Controller.
- 1:50:48Weil in diesem Video, da siehst du nicht sehr glücklich aus,
- 1:50:51weil so viele Controller da auf deinem Tisch liegen.
- 1:50:56Ja, muss man auch nochmal sagen, TikTok ist ja immer so ein bisschen gestellter.
- 1:50:58So ähnlich, was du meinst, mit einem Titel. Man versucht ja schon ein bisschen … Stimmt.
- 1:51:03Warum hast du eigentlich Joystick-Hölle? Jetzt weiß ich, wer das kommt.
- 1:51:06In diesem TikTok steht Joystick-Hölle. Aber das sind doch gar keine Joysticks.
- 1:51:10Ich glaube, das kommt so ein bisschen bei programmiertechnisch,
- 1:51:13nennen wir viele von unseren Klassencontroller, also Objekte,
- 1:51:16die andere Klassen kontrollieren.
- 1:51:18Und damit sich das programmiertechnisch nicht in die Quere kommt,
- 1:51:21heißt es bei uns programmiertechnisch Joystick, um es einfach von den anderen
- 1:51:25Systemen so ein bisschen zu differenzieren.
- 1:51:26Deswegen sage ich, glaube ich, häufig Joystick, obwohl es kein Joystick ist.
- 1:51:30Und das war da, glaube ich, auch automatisch in meinem Kopf.
- 1:51:33Okay.
- 1:51:35Genau, nee, sorry, was war deine Frage?
- 1:51:38Einfach so die Erfahrung mit Controller, war das cool zu implementieren oder
- 1:51:41gab es da Probleme? Vor allem zwischen den verschiedenen Controllern,
- 1:51:43weil du hattest da ja Playstation, Xbox.
- 1:51:47Ich weiß nicht, ob du auch den alten Steam-Controller da hattest.
- 1:51:50Nee, nee, wir hatten da so andere
- 1:51:52No-Name-Dinger auf jeden Fall noch rumstehen, liegen wie auch immer.
- 1:51:56Ja, war auf jeden Fall spaßig. So über die ganze Entwicklungszeit.
- 1:51:59Also jetzt zu dem Zeitpunkt haben wir es, glaube ich.
- 1:52:03Der Teaser, den wir damals auf Steam hatten, hatte keinen Controller-Support.
- 1:52:07Warum wir das da eingebaut hatten, beim Großen und Ganzen, um einen Trailer
- 1:52:11aufzunehmen mit einem Kampf, der irgendwie cool aussehen soll.
- 1:52:14Und deswegen haben wir eigentlich Controller-Support initial,
- 1:52:17also wir wollten langfristig schon Controller-Support haben,
- 1:52:19aber zu dem Zeitpunkt war es, glaube ich, so,
- 1:52:21dass wir einen Trailer aufgenommen haben, wo einer mit Maus und Tastatur am
- 1:52:24PC gegen mich mit Joystick dann quasi spielt, damit der Kampf einfach dramatisch
- 1:52:29und cool ist, damit man nicht irgendwie komische KI implementieren muss.
- 1:52:32Und entsprechend war es dann zu der arbeitenden Zeitpunkt eigentlich relativ
- 1:52:34simpel, weil du brauchst viele Edge-Cases nicht betrachten und musst nicht Menüs damit bedienen.
- 1:52:38Über die Entwicklungszeit von Droh war es dann immer mehr Arbeit geworden,
- 1:52:41weil wir auch immer wieder Features bearbeiten mussten, weil es funktioniert
- 1:52:44am PC, aber es funktioniert mit Controller nicht, zum Beispiel UI und GUI oder sowas.
- 1:52:49Und deswegen gab es immer wieder Features, die wir re-implementieren mussten
- 1:52:53oder verändern wollten oder auch Features, die wir teilweise so ein bisschen
- 1:52:56weggeworfen haben, weil es auf Controller schwieriger war.
- 1:52:59Der hatte auch viel weniger Tasten, das heißt, du musst dir ja dann auch zum
- 1:53:02Beispiel überlegen, am PC mit M kannst du eine Karte öffnen,
- 1:53:06kriegen wir irgendwie diesen Button auch irgendwie auf dem Controller hin,
- 1:53:10haben wir im Endeffekt nicht hinbekommen.
- 1:53:11Und dann auch die ganze Bedienung der ganzen Menüs, also dass du sagst,
- 1:53:15alles klar, ich öffne jetzt das Inventar und ich möchte irgendwie durch die
- 1:53:18Gegend springen mit dem Joystick, Controller.
- 1:53:21Das war auch alles recht viel Arbeit und oft wurden auch einzelne GUI-Fenster
- 1:53:25vergessen und dann gab es Bug-Reports, hey, ich kann das ja gar nicht bedienen
- 1:53:28mit dem Controller und genau.
- 1:53:31Und entsprechend war es so ein bisschen nervig, aber natürlich sinnvoll ist zu tun.
- 1:53:37Aber gab es zwischen den Controller-Probleme, also zwischen diesen No-Name-Dingern
- 1:53:40und Playstation und Xbox oder war das alles smooth?
- 1:53:42Wir haben auch aus dem Asset-Store ein Tool benutzt oder ein Asset,
- 1:53:46das nennt sich Rewired. Das vereinheitlicht die im Großen und Ganzen alle.
- 1:53:50Das hat eigentlich sehr, sehr schön funktioniert. Es gab einzelne Controller,
- 1:53:54die Rewired noch nicht kannte und deswegen konnten wir dann auch nicht mit denen umgehen.
- 1:53:58Und dann war es aber oft so, dass wir einfach nur Rewired einmal updaten mussten,
- 1:54:01weil die dann auch aufgenommen haben oder so.
- 1:54:03Also zwischen den Controllern gab es recht wenig Probleme.
- 1:54:06Und was waren das für Features, die rausgeflogen sind wegen Controller?
- 1:54:11Als Beispiel ...
- 1:54:13Wir hatten, wir haben es aber auch sehr spät angefangen, die Idee,
- 1:54:16man kann ja mit, wenn man die Karte öffnet, dort Marker setzen.
- 1:54:20Und die Idee war eigentlich, dass man nicht nur Marker über die Karte setzen
- 1:54:22kann, sondern auch wenn ich in der Welt vor einer Kiste stehe und ich zum Beispiel
- 1:54:26eine bestimmte Taste drücke, dann möchte ich auch dieses Objekt bereits auf
- 1:54:29der Karte markiert haben, um nicht erst in die Karte gehen zu müssen.
- 1:54:31Und das ist zum Beispiel eines der Feature, wir hatten einfach keinen Platz
- 1:54:35mehr auf dem Controller, um diese Taste irgendwie einzubauen.
- 1:54:39Als ein Beispiel.
- 1:54:40Das habe ich nicht verstanden. Warum will ich eine Kiste auf der Karte markieren?
- 1:54:43Ach so, weil man, genau, man kann ja Notizen machen, genau.
- 1:54:47Genau, genau.
- 1:54:48Mit Tinte, muss man aber erst kaufen.
- 1:54:49Genau, genau, genau. Und die
- 1:54:51Idee war initial, dass ich nicht nur auf der Karte direkt etwas markiere,
- 1:54:55sondern ich hier in der Welt zum Beispiel zu einer verschlossenen Tür und markiere
- 1:54:59mir aus der Sicht des Charakters quasi etwas auf der Karte und hinterher erscheint
- 1:55:03es dann tatsächlich auf der Karte,
- 1:55:05weil ich zum Beispiel E drücke oder so und E heißt, markiere mir das Objekt, das ich gerade angucke.
- 1:55:10Als ein beispiel wir hatten auch als
- 1:55:13idee dass man wir haben ja momentan ein schnell zauber also
- 1:55:16du kannst mit coolen zauber wirken kannst ihn durchtauschen du
- 1:55:19kannst nur ein zeitgleich ausgewählt haben wir hatten überlegt eigentlich am
- 1:55:23pc was cool gewesen wenn du zwei tasten haben könntest für zwei zauber dass
- 1:55:26du schneller zaubern kannst ohne jetzt hin und her weg sind zu müssen das hat
- 1:55:31aber auch probleme der ui aber auch auf controller hat mir einfach keine taste
- 1:55:34mehr übrig und dann ist das zum beispiel auch rausgeflogen,
- 1:55:37oder konnten es nicht implementieren so.
- 1:55:39Okay.
- 1:55:40Das waren jetzt keine riesigen Features, sondern eher so Sub-Features.
- 1:55:43Ja, aber es ist ja interessant. Das sind ja, ja, doch, das sind halt so kleine,
- 1:55:47also quasi, es ist mehr so ein bisschen diese, wie heißt das,
- 1:55:51Service Features, also kleine Komfort Features sozusagen.
- 1:55:57Weil man kann ja immer noch Dinge zum Beispiel auf der Karte markieren.
- 1:55:59Genau, genau.
- 1:56:00Wenn man Tinte gekauft hat. Und wenn man die Karte gekauft hat.
- 1:56:04Oder sie anderweitig besorgt hat.
- 1:56:06Ach, das geht? Ach, interessant. Okay, wir wollen nicht spoilern,
- 1:56:11aber ich hatte am Anfang,
- 1:56:12als ich eine Person getroffen habe, die eine Karte hatte, habe ich nicht genug
- 1:56:15Geld gehabt und dann hatte ich keine Karte für eine sehr lange Zeit in meinem
- 1:56:19Spiel und habe diese Figur auch nicht mehr gefunden und dann,
- 1:56:24ja, also ja gut, aber es hat dazu beigetragen, dass ich die Welt sehr sehr gut exploriert habe.
- 1:56:31Aber ganz interessant war eigentlich fangen wir genau diesen Edge Case ab.
- 1:56:34Du gehst zu ihm hin und willst mit ihm handeln und du kaufst die Karte nicht,
- 1:56:38dann sagt er eigentlich, bist du sicher, dass du keine Karte willst?
- 1:56:41Und wenn du dann sagst, du hast nicht genug Geld, würde er auch dir anbieten,
- 1:56:43sie dir quasi zu schenken für einen Gefallen zu einem späteren Zeitpunkt.
- 1:56:48Es kann sein, dass ich gesagt habe, nee, sorry, ich habe genug Mafia-Filme gesehen,
- 1:56:52da lasse ich mich nicht drauf ein.
- 1:56:54Okay, okay, fair enough.
- 1:56:56Also, das ist mir zu gefährlich. Man weiß ja nicht, was der denn will.
- 1:56:59Ja.
- 1:57:01Irgendwann kommt er und sagt so, hier, da ist ein kleines Hundebaby, das
- 1:57:04musst du jetzt umbringen und wenn man das nicht macht dann ist das spiel vorbei
- 1:57:07oder so das war mit zu risiko du hast eben schon die fliege erwähnt die fliege
- 1:57:15die fliege die nicht übers wasser kommt ach die genau und und das ist vielleicht
- 1:57:20ganz interessant um über das pathfinding zu sprechen also erst mal die frage
- 1:57:23was ist denn dieses a star pathfinding project weil,
- 1:57:27Also A-Star, das ist ein Algorithmus für Path-Finding.
- 1:57:32Und wenn man sich mit Path-Finding beschäftigt, ist das das Erste,
- 1:57:35worauf man stößt. Und alle machen das.
- 1:57:38Aber ich frage mich, was dieses Path-Finding-Project ist. Das klingt ja super fancy.
- 1:57:42Das ist im Endeffekt auch ein Asset aus dem Asset Store,
- 1:57:47was sozusagen relativ einfach dir ermöglicht,
- 1:57:51deine Welt zu scannen und dann Pathfinding auf dieser gescannten Welt,
- 1:57:55auf diesen Knoten, entweder zum Beispiel Grid-basiert oder Polygon-basiert,
- 1:58:00dann Pathfinding-Algorithmus laufen zu lassen oder andersrum,
- 1:58:02um auf die Abfrage zu haben, hey, ich stehe hier, ich möchte nach da,
- 1:58:05gib mir einen Weg von A nach B.
- 1:58:06Und das macht das Projekt sehr, sehr gut im 2D und im 3D, hat dort verschiedene
- 1:58:11Algorithmen und so weiter und so fort und das haben wir einfach genutzt,
- 1:58:14um uns das Leben leichter zu machen.
- 1:58:16Hatte auch viele Drawbacks gehabt, also auch viel von Performance,
- 1:58:20Floss zum Beispiel in dieses Path-Pinding-Project und ja, aber im großen Ganzen super, super Tool.
- 1:58:27Okay, und habt ihr, ihr habt das dann irgendwie Polygon-basiert gemacht oder
- 1:58:31wie, was heißt, wenn man das scannt?
- 1:58:33Also ich meine, ihr habt ja jetzt ein paar Sprites im Level rumliegen.
- 1:58:36Irgendwie muss man dem jetzt sagen, hier, das Sprite da, da bitte nicht langlaufen.
- 1:58:42Oder irgendwie muss man das ja vorbereiten, dass das System das dann wahr ist.
- 1:58:47Genau. Oder wie wir es gemacht haben, oder wie das Pathfinder Project das auch
- 1:58:51im Großen und Ganzen anbietet, dass du so, es gibt einen Scan-Knopf und alles,
- 1:58:54was gerade in der Welt geladen ist,
- 1:58:57im Großen und Ganzen kann man sich vorstellen, dass da ganz viele Raycasts in
- 1:58:59die Szene schießt oder Ray-Sphere-Circles, was auch immer, mit einer gewissen
- 1:59:04einen Radius mit einer gewissen Größe.
- 1:59:06Und wenn er dann auf gewisse Physik-Layer trifft, wie zum Beispiel sind das
- 1:59:09bei uns vor allem Small Obstacles und Obstacles, und er kollidiert dann mit
- 1:59:13einem dieser Layer, weiß er, alles klar, auf diesem, ich mache jetzt einfach
- 1:59:16mal Grid-basiert, auf jedem Grid feuere ich einmal,
- 1:59:19Ding und stellen fest, ist dort ein Obstacle, ja oder nein. Und im Großen und
- 1:59:22Ganzen kriegt man dann einen riesigen gescriptbasierten Graphen,
- 1:59:25der dann quasi kodiert, auf welchen Nodes oder kleinen Rechtecken kann ich mich
- 1:59:30bewegen und auf welchen nicht.
- 1:59:31Und das hatte initial recht viel Speicher gefressen, weil es so Welt recht groß
- 1:59:35ist und wie eine Textur kann man sich das vorstellen. Ist einfach sehr aufwendig.
- 1:59:40Und wir haben das dann später umgemappt auf Polygone und das kann man sich wiederum
- 1:59:44vorstellen wie ein Mesh.
- 1:59:45Das heißt, ein Mesh, du hast jetzt pro Knotenpunkt auf eine Mesh quasi einfach
- 1:59:49die Information, ja oder nein.
- 1:59:51Und dazwischen wird, sag ich mal, interpoliert, ganz inhaltlich,
- 1:59:55was die da machen, weiß ich nicht, aber im Großen und Ganzen so.
- 1:59:57Und entsprechend brauchst du einfach viel, viel weniger Knotenpunkte,
- 1:59:59wenn du es polygonbasiert machst, versus wenn man es quasi rechteckbasiert oder
- 2:00:03texturbasiert sozusagen macht.
- 2:00:04Genau, Knotenpunkt ist ein Vertex, ne?
- 2:00:07Genau, genau.
- 2:00:08Okay, also man hat einfach ein riesiges Mesh und ein paar haben einfach,
- 2:00:12hier kannst du nicht lang gehen, und andere haben halt hier ganz lang gehen, okay.
- 2:00:17Cool, ja, so das ist also das Pathfinding so und dann gibt es natürlich gewisse
- 2:00:21Bereiche, wo man nicht langen soll,
- 2:00:23und Wasser ist eins davon und es gibt zwei verschiedene Arten von Wasser es
- 2:00:27gibt nämlich das Wasser, das knöchelhoch ist da kann man auch drin rumlaufen und,
- 2:00:31alle können da drin rumlaufen, auch blöde kleine Fliegen, die einen kaputt stechen
- 2:00:35wollen, und es gibt aber auch tiefes Wasser, da kann man nicht drüber laufen
- 2:00:38jetzt ist es aber so, dass diese Fliege, die kann ja fliegen,
- 2:00:42man würde also erwarten dass die jetzt über das Wasser drüber kann.
- 2:00:45Aber, das müssten wir jetzt einfach glauben, man kann die Fliege austricksen,
- 2:00:50indem man sich auf die andere Seite des Tümpels stellt und die versucht dann
- 2:00:53zu einem zu kommen und greift auch immer wieder an, aber scheitert daran und
- 2:00:56knallt gegen eine unsichtbare Wand, wo das tiefe Wasser ist.
- 2:00:59Und ich hab mich gefragt, was ist, also ihr habt, kann es sein,
- 2:01:03dass ihr einfach keine logisch verfliegende Wesen drin habt?
- 2:01:05Ja, genau, genau. Also indirekt gibt es das zum Beispiel, zum Beispiel,
- 2:01:09wenn du das Ding siehst, der Spieler, der hat so kleine Wassereffekte an den
- 2:01:13Füßen und die Mücke auf der rechten Seite nicht.
- 2:01:16Und andere Gegner haben aber diese Wassereffekte, wenn sie im Wasser stehen.
- 2:01:19Also indirekt haben wir zumindest eine Abfrage, bist du ein fliegender Gegner?
- 2:01:22Aber die nutzen wir gerade nur für diesen Wassereffekt.
- 2:01:25Und warum sie dort jetzt nicht rüberkommt, ist im Großen und Ganzen,
- 2:01:27weil wir ein sehr einheitliches System haben, was Kollision angeht.
- 2:01:31Und alle unsere Aktoren, egal ob sie fliegen oder was auch immer sie tun,
- 2:01:35sie sind einfach quasi auf Dynamic, so heißt der Layer bei uns.
- 2:01:39Und Dynamic kollidiert einfach immer mit Small Obstacles und das Wasser ist
- 2:01:43in dem Fall ein Small Obstacle.
- 2:01:44Das heißt, man könnte immer ein Projektil drüber schießen, aber du kannst nicht
- 2:01:47drüber laufen und weil alles dasselbe System verwendet, kommt auch die Blutmücke nicht rüber.
- 2:01:51Ihr könntet die Blutmücke, wenn die Angriffsanimation fertig ist,
- 2:01:56sie austauschen gegen ein Projektil, was aussieht wie die Blutmücke und dann,
- 2:02:01wenn sie nichts getroffen hat, wieder zurück verwandeln.
- 2:02:04Ja, es gibt immer Tricks und Wege auf jeden Fall, aber wir haben uns ein bisschen
- 2:02:09tricky geworden für diesen einen Angriff.
- 2:02:12Das sind, glaube ich, auch die einzigen Gegner, die man zum Spiel fliegen können.
- 2:02:15Und entsprechend, ja.
- 2:02:17Und es fällt aber auch nicht oft auf, muss ich auch sagen. Also das war so eine lustige Situation.
- 2:02:22Deswegen habe ich sie als GIF abgespeichert. Aber ansonsten war es eigentlich nie ein Problem.
- 2:02:26Ich muss auch zugeben, als ich das GIF gerade gesehen habe, war so,
- 2:02:29bevor du die Frage gestellt hast, ob eigentlich die Frage ist,
- 2:02:31warum das Pathfinding nicht rüberfindet.
- 2:02:33Und mir ist gar nicht in den Sinn gekommen, dass sie eigentlich fliegt und einfach rüberfliegen könnte.
- 2:02:38Ja.
- 2:02:38Ja, weil ich glaube, ich selber schon so in diesem automatischen Modus drin bin, das so anzunehmen.
- 2:02:43Das Pathfinding funktioniert wunderbar. Es müsste jetzt wahrscheinlich,
- 2:02:47ja, wie würde man das machen?
- 2:02:49Müsste man dann sozusagen zwei Pathfinding-Layer haben, eins für fliegende Objekte?
- 2:02:55Und das wollten wir halt auch nicht machen, dass es da noch irgendwie für diesen
- 2:02:57einen Gegner irgendwie Zusatz Pass-Dings gibt.
- 2:03:01Was man sonst hätte vielleicht auch machen können, dass man sagt,
- 2:03:03alles klar, du willst zwar von A nach B, aber während du im Angriff bist,
- 2:03:07deaktivieren wir zum Beispiel,
- 2:03:09das Pathfinding und wenn der Angriff dann durch ist und ich befinde mich auf
- 2:03:13dem Wasser, würde er feststellen, alles klar, ich befinde mich gerade irgendwo,
- 2:03:15wo ich nicht hin darf und dort ist mein Ziel und der kürzeste Fahrt von dorthin
- 2:03:19zu meinem Ziel wäre dann im Großen und Ganzen auch der korrekte Pfad eigentlich.
- 2:03:23Ja, aber wie gesagt, das war einfach ein bisschen zu viel.
- 2:03:26Ja, es ist wieder ein interessanter Edge-Kids, weil man könnte ja auch sagen,
- 2:03:29naja, fliegende Viechis, die können einfach überall hin, die brauchen gar keine
- 2:03:34Navigation, aber das wäre ja auch ein Problem, weil die sollen ja nicht durch
- 2:03:36Mauern fliegen oder sowas.
- 2:03:37Genau, oder durch Bäume oder auf Höhen-Ebene könnte man vielleicht wieder überlegen,
- 2:03:41Aber ja, das hätte viel Probleme gehabt.
- 2:03:45Genau, Höhenebenen sind auch eine spannende Sache, weil da habe ich mich auch
- 2:03:50gefahren, wie ihr das detektet, weil es gibt manchmal die Situation,
- 2:03:56dass man steht vor einer kleinen Mauer, einer Erhöhung, die so hüfthoch ist
- 2:04:04und da liegt oben was drauf.
- 2:04:06Da kann ich jetzt aber nicht einfach hinlaufen, weil ich kann da nicht hochklettern.
- 2:04:10Und ich glaube, wenn dort ein Objekt liegt, kann ich das auch nicht nehmen.
- 2:04:14Mein Charakter muss immer zu dem Objekt hinlaufen erst.
- 2:04:17Ich habe hier so ein Beispiel. Ich erinnere mich jetzt gerade gar nicht mehr
- 2:04:20ganz genau, wie es im Spiel war.
- 2:04:22Aber ich glaube, ich kann, also man sieht dort den Charakter,
- 2:04:26steht vor einer kleinen Mauer oder...
- 2:04:29Eine Art Podest und auf dem Podest liegen Goldmünzen rum und die kann ich so nicht einsammeln.
- 2:04:33Also es sieht so aus, als könnte ich jetzt die Hand einfach ausstrecken und
- 2:04:37das nehmen, aber rein von der Logik her ist es so, nee, nee,
- 2:04:40du stehst auf einem Boden und das Gold liegt auf dem kleinen Podest,
- 2:04:44was ungefähr einen halben Meter hoch ist und deswegen, wenn du da nicht hinläufst,
- 2:04:47dann kannst du das nicht nehmen. Das ist so, oder?
- 2:04:50Das ist eine gute Frage gerade an der Stelle. Ich bin mir gerade nicht ganz
- 2:04:54sicher, wenn ich ganz ehrlich bin.
- 2:04:57Im Großen und Ganzen haben wir keine wirkliche konkrete Logik,
- 2:05:00was Höhenebenen angeht.
- 2:05:01Also weder das Objekt noch der Spieler weiß, ob ich auf Höhenebene 0 oder 1
- 2:05:04oder 3 bin oder sonst irgendwas.
- 2:05:06Sondern da ist einfach nur ein Collider dazwischen. Und deswegen kannst du physisch
- 2:05:09steil zum Beispiel einfach nicht ran.
- 2:05:11Ach, da ist ...
- 2:05:12Okay. Genau, also warum du nicht näher rankommst, ist im Endeffekt diese Steintextur.
- 2:05:17Das ist quasi im Endeffekt eine Collider, ein Collision.
- 2:05:20Ein Small Obstacle, ein normales Obstacle wahrscheinlich.
- 2:05:23Bin mir gerade nicht ganz sicher. Aber auf jeden Fall kannst du halt einfach
- 2:05:26physisch irgendwann nicht mehr näher ran, weil dann der Collider von diesem Abgrund dort ist.
- 2:05:30Warum du jetzt mit dem Objekt nicht interagierst, bin ich mir gerade nicht ganz sicher.
- 2:05:33Ich glaube eigentlich, wenn du nah genug rankommen würdest, könntest du damit
- 2:05:37interagieren, weil du auch diesen Indikator der offenen Hand hast.
- 2:05:40Das heißt, er erkennt ja, dort ist ein Objekt, das ich nehmen könnte. Ich bin nur zu weit weg.
- 2:05:45Und ich glaube, da ist einfach ein Abstandskriterium drin. und da kommt man
- 2:05:48deswegen gerade nicht dran vorbei.
- 2:05:50Was wir aber haben, ist zum Beispiel, wenn du, wir haben ja Häuser und wenn
- 2:05:55du, und in den Häusern sind zum Beispiel auch Objekte, die du nehmen könntest.
- 2:05:59Und möchtest ja aber zum Beispiel erstens nicht, wenn du mit der Hand über ein
- 2:06:02Hausdach haverst und du nicht drin bist, dass plötzlich du schon siehst,
- 2:06:04ah, da ist irgendwas zu nehmen.
- 2:06:06Oder auch nicht, dass du durch Wände etwas nehmen können sollst.
- 2:06:09Dort haben wir ein Extrasystem, das definiert, bist du in einem Haus oder bist du nicht in einem Haus?
- 2:06:14Und das ist ein Gegenstand, mit dem ich interagieren möchte,
- 2:06:17in einem Haus oder nicht in einem Haus oder im selben Haus.
- 2:06:20Und da haben wir auf jeden Fall Abfragen drin, dass das nicht möglich ist.
- 2:06:23Ah, okay. Ja, ich erinnere mich, ich habe einmal was gecheased und zwar war
- 2:06:28hinter einer Ruinenmauer eine, jetzt überlege ich, war es eine Falltür oder
- 2:06:33war es irgendwie ein kleiner Schrank oder so?
- 2:06:35Auf jeden Fall konnte ich durch die Mauer damit interagieren.
- 2:06:38Und das heißt, es war nur distanzbasiert und ich habe mich nicht in einem Haus
- 2:06:42befunden, weil es halt eine Ruine ist, die gilt halt nicht als Haus. ist, ne?
- 2:06:46Genau, genau. Und ich hab grad nebenbei mal getestet, tatsächlich ist es hier nur Distanzabfrage.
- 2:06:52Okay.
- 2:06:53Das heißt, wenn du näher genug rankommen würdest, wenn der Collider ein bisschen
- 2:06:56schmaler wäre, könntest du es aufsammeln.
- 2:06:59Ah, interessant. Genau, meine eigentliche Frage war so ein bisschen,
- 2:07:02gibt's überhaupt so Höhen Ebenen?
- 2:07:03Weil man hat also nicht nur manchmal so Podeste, auf die man dann auch spielt,
- 2:07:07also wenn man irgendwie einen Weg findet, hochlaufen kann. Es gibt ja richtige,
- 2:07:13Bergpassagen, wo man halt wie in Serpentinen hochlaufen kann.
- 2:07:17Und da habe ich mich halt auch gefragt, wie funktioniert das da mit den Höhenebenen?
- 2:07:20Also die sind halt visuell, sieht das halt so aus, als wären es Höhenebenen,
- 2:07:23aber ist ja ein 2D-Spiel, da gibt es ja keine richtigen Höhen.
- 2:07:26Hätten wir sehr gerne gehabt, also richtige Höhenebenen, auch so ein bisschen
- 2:07:29mit Logik, zum Beispiel, dass man auch hinter eine Höhenebene laufen kann.
- 2:07:33Das geht ja momentan bei uns im Großen und Ganzen auch nicht.
- 2:07:36Das heißt, du hast da eine Collision und kommst nicht dahinter,
- 2:07:39weil sonst würdest du für denselben Pixelpunkt in der Welt einen Zustand haben
- 2:07:45für deinen Charakter, wo er auf der Höhenebene und hinter der Höhenebene liegt.
- 2:07:48Also brauchen wir auch ein System,
- 2:07:49um zu detekten, auf welcher Höhenebene befinde ich mich eigentlich.
- 2:07:52Wenn ich zum Beispiel auf der höheren Ebene bin, ich bin auf dieser Position,
- 2:07:55möchte ich ja von oben nicht nach unten gehen können.
- 2:07:58Und wenn ich auf der unteren Höhenebene auf derselben Position bin,
- 2:08:01möchte ich ja hinter der, also man hat pro Pixel in der Welt dann mehrere Datenpunkte,
- 2:08:05sage ich mal, ob davor oder dahinter oder Höhenebene 1 oder Höhenebene 2.
- 2:08:09Und sowas haben wir gar nicht. Also sprich, was du auch meintest,
- 2:08:12alle unsere Höhenebenen sehen nur rein optisch zufällig, in Anführungszeichen,
- 2:08:15sind natürlich so designt, so aus, als ob es Höhenebenen gibt,
- 2:08:18aber rein logisch-technisch haben wir so etwas nicht.
- 2:08:21Und jetzt macht das auch Sinn, weil ich habe mich auch gefragt,
- 2:08:23du kannst nämlich von, natürlich von überall Pfeile abschießen und so,
- 2:08:27und du hast eben gesagt, das Projektil einfach, dass diese ganzen Collider, nee, warte mal,
- 2:08:33die können ja die Collider nicht einfach ignorieren,
- 2:08:39weil irgendwie ein Pfeil muss
- 2:08:40ja auch in der Mauer stecken bleiben oder dann geblockt werden und so.
- 2:08:43Aber ich kann ja von, wenn ich irgendwie auf diesem Podest, was ich eben gemeint
- 2:08:48habe, schon stehe, kann ich einen Pfeil nach unten schießen.
- 2:08:50Obwohl ja das Podest auch irgendwie einen Kollider hat. Du hast eben gemeint,
- 2:08:54dass da ein Kollider ist.
- 2:08:56Wie ist das denn dann mit Pfeilen? Gibt es verschiedene Arten von Collidern bei euch?
- 2:09:00Genau, genau. Wir haben zwei verschiedene Arten. Das sind Small Obstacles und Obstacles.
- 2:09:04Small Obstacles kann man sich vorstellen, also in der Vorstellung sind sie sozusagen
- 2:09:08hüfthoch und du kannst mit Projektilen drüber schießen. Zum Beispiel ist das
- 2:09:10Wasser ein Small Obstacle.
- 2:09:13Und dann gibt es Obstacles, da kann keine Projektile durch und das sind zum
- 2:09:16Beispiel halt Mauern, Bände, Berge und so weiter und so fort.
- 2:09:21Und da kann dann auch ein Projektil nicht drüber fliegen. An der Stelle,
- 2:09:24wo du gerade den Screenshot da gemacht hast, bin ich mir nicht sicher,
- 2:09:27es kann sein, dass du dort nicht hoch- oder runterschießen kannst,
- 2:09:30obwohl es eigentlich logisch-technisch möglich sein können sollte,
- 2:09:34so aus der Spielweltlogik heraus.
- 2:09:36Und da hatten wir auch einige Leute, die das ein bisschen kritisiert haben,
- 2:09:39dass sie sagen, sie finden das nicht sehr schön, dass man nicht über Höhenebenen
- 2:09:41hinweg irgendetwas schießen kann.
- 2:09:44Kommt da gleich auf die konkreten Höhenebene an. Manche gehen vielleicht, müsste ich nachgucken.
- 2:09:49Okay, na gut, aber das, was man mitnehmen kann, dass ihr jetzt keine spezifischen,
- 2:09:54Höhenebenen irgendwie definiert habt.
- 2:09:56Das ist eigentlich eine ganz interessante Situation, weil diese Frage,
- 2:09:58finde ich, stellt sich halt so ein bisschen, wenn man das so sieht.
- 2:10:01Wir hatten mal einen Prototyp, wo wir, weil es gibt auch coole grafische Effekte,
- 2:10:04die man mitmachen kann oder auch du kannst von oben nach unten schießen,
- 2:10:06aber nicht von unten nach oben.
- 2:10:08Aber das war sehr tricky, weil musste man, weil du musst dann ja quasi es rekursiv
- 2:10:12angenommen, du hast mehrere Höhenebenen.
- 2:10:15Erstens heißt das ja irgendwann musst du eine Transition haben von einer zur anderen.
- 2:10:18Was macht man dann? Kann ich dann hoch oder runter schießen in dieser Transition
- 2:10:22Area, was passiert, wenn ich von unten nach oben schieße und andersrum,
- 2:10:26dann muss das der definiert werden, wir haben das über einen Collider gemacht,
- 2:10:29das heißt, es wurde ein Collider geplaced, der sagt, du bist jetzt auf Höhenebene 1.
- 2:10:32Aber wenn du auf Höhenebene 1 bist, ist der physische Collider zum Klippenrand
- 2:10:36ein anderer, als wenn du auf der Höhenebene 0 bist.
- 2:10:38Also bist du plötzlich an einem Punkt, wo du verschiedene Kollisionsarten brauchst,
- 2:10:43je nachdem, auf welcher Höhenebene ich stehe.
- 2:10:45Und das hat alles sehr, sehr kompliziert gemacht und auch alles zu definieren
- 2:10:48wäre sehr viel Aufwand gewesen.
- 2:10:50Ja, mir fällt es auch gerade schwer, das mir vorzustellen. Das kann ich mir
- 2:10:55sehr gut vorstellen, dass das alles...
- 2:10:57Kann man Bildschirmübertragung machen, ja.
- 2:10:59Aber ist okay. Wir können, weiß ich nicht, wollen wir eine kurze Pinkelpause machen?
- 2:11:06Das können wir gerne machen.
- 2:11:07Kurze Pause. Five minutes later.
- 2:11:10Bei dir auch?
- 2:11:12Ja, ja, ja, auf jeden Fall. Ich bin gespannt. Ich hoffe, dass es Feedback gibt,
- 2:11:16ob es den Leuten zu tief reingeht oder nicht.
- 2:11:18Aber ich habe schon ein paar Folgen so aufgenommen. Bisher war das Feedback
- 2:11:21eigentlich immer ganz okay. Aber vielleicht traue ich dir da auch nichts zu sagen.
- 2:11:25Ich glaube, vieles ist auch echt schwer, sich so ein bisschen,
- 2:11:27was du auch eben meintest, mit den Höhenebenen sich vorzustellen,
- 2:11:29wenn man nur Worte verwendet.
- 2:11:31Und oft ist es einfach leichter so, ja, hier, guck mal so und dann klappt das irgendwie besser.
- 2:11:36Aber ja, und dann natürlich auch spezifisch so mit Texturen und Baking,
- 2:11:39Pivot, bla, bla, bla. Wenn man da thematisch nicht drin ist,
- 2:11:42kann es recht schnell tricky werden.
- 2:11:43Genau, und das ist nämlich das Punkt. Ich merke das halt beim,
- 2:11:46es gibt den Gameda für die Platte Podcast und da merke ich auch,
- 2:11:49dass ich teilweise so ein bisschen abschweife, wenn ich zuhöre,
- 2:11:53wenn es mich nicht so interessiert.
- 2:11:54Aber dafür, wenn es dann halt mal ein Thema ist, wo man sich auch mal mit beschäftigt
- 2:11:57hat, ist es dann doppelt super und das wird halt nirgendwo anders besprochen
- 2:12:00und das ist dann ganz toll.
- 2:12:01Und gerade, ich kann mir schon vorstellen, dass Leute auch Drova angucken und
- 2:12:06denken so, wir haben die das wohl gemacht so oder selbst vielleicht auch mal
- 2:12:09an sowas gearbeitet haben und dann dass das einfach schön ist,
- 2:12:14so mal so einen Einblick zu bekommen.
- 2:12:16Das ist auch ganz cool, wir streamen ja auch oder ich ja auch viel freitags
- 2:12:19in der Wicklung von Drova, die anderen natürlich auch, aber die machen auch
- 2:12:21viel mit anderen Sachen und was ich immer cool finde, sind tatsächlich auch
- 2:12:24Leute mit konkreten Fragen,
- 2:12:25die manchmal reinkommen oder mich hinterher auf Discord irgendwie nochmal anschreiben,
- 2:12:28wie wir bestimmte Sachen gemacht haben, weil es glaube ich echt, was du auch meinst.
- 2:12:31Ich habe das Gefühl, es gibt wenig so gute oder advanced auch Informationen,
- 2:12:35gerade was Unity angeht oder bestimmte Tricks oder wie, was ist ein guter Ansatz für irgendwas.
- 2:12:40Ja. Und das habe ich auch in Entwicklung von Drover immer wieder gemerkt.
- 2:12:43Auch zum Beispiel das Pivot-Baking habe ich mir selber ausgedacht.
- 2:12:46Und cool, so jetzt von dir zu hören, das gibt es tatsächlich so,
- 2:12:49aber ich bin selber nie darauf gestoßen bis zu dem Zeitpunkt,
- 2:12:51wo ich es dann irgendwie als Problem so hatte.
- 2:12:53Und auch ein paar andere Sachen, die ich so, ja, es,
- 2:12:56Schade, aber so ist es halt.
- 2:12:58Ich habe mich gerade heute, ich muss mal kurz gucken, heute mit jemandem darüber
- 2:13:01unterhalten und ich verstehe überhaupt nicht, warum das Pivot Painting heißt.
- 2:13:05Das gibt es nämlich in Unreal und das gibt es auch für Udini.
- 2:13:08Ich kann jetzt einfach mal hier so ein kleines Video, hat es keine Relevanz für unser Gespräch.
- 2:13:12Es steht einfach Pivot Painter da. Man paintet nichts.
- 2:13:16Man speichert einfach nur die Pivot-Daten irgendwo ab, damit sich halt ein paar
- 2:13:20Äste irgendwie oder Pflanzen schön um gewisse Pivots rotieren können,
- 2:13:25weil das einfach besser aussieht, als wenn man sie einfach nur auf XY irgendwie
- 2:13:28ein bisschen hin und her wippeln lässt.
- 2:13:31Aber ich weiß nicht, warum das Painter heißt. Ich habe mir am Anfang immer vorgestellt,
- 2:13:34dass man da irgendwas malt, so wie beim wenn man, wie heißt das,
- 2:13:38habe ich vergessen, wenn du Rigging machst, dann paintest du ja die Waits, Waitpainting.
- 2:13:42Da paintet man wirklich was.
- 2:13:44Können wir mir vorstellen, also ich habe mir jetzt das Video nicht angeguckt,
- 2:13:47im Endeffekt speichert man die
- 2:13:48Informationen, was wahrscheinlich auch mal trotzdem in die Vertex-Daten.
- 2:13:51Und vielleicht ist das Programm, was die Daten dort reinspeichert,
- 2:13:55also der Computer, das für dich painted quasi.
- 2:13:58Keine Ahnung. Na gut, aber dann ist ja alles so ein bisschen Painting.
- 2:14:02Dann gibt es den, weiß ich nicht, dann ist der Garbage Collector oder ein Garbage
- 2:14:07Manager, der den Memory handelt, auch ein Memory Painter oder so.
- 2:14:11Ja, es war jetzt nur so mein Versuch, das irgendwie.
- 2:14:15Ja, also ich konnte auch nicht rausfinden, warum das Painter heißt.
- 2:14:18Perplexity AI hat gesagt, das ist nur so ein metaphorischer Name.
- 2:14:23Was ich aber interessant fand und das ist wieder so ein Ding,
- 2:14:26Ich habe vor einer Weile mal von Pivot Painter gehört.
- 2:14:29Ich habe es selbst tatsächlich noch nie so richtig benutzt.
- 2:14:32Also zumindest das Pivot Painter Tool ist offizielle von Unreal.
- 2:14:36Und verlinke ich euch auch eine Dokumentation. Und was ich gar nicht wusste,
- 2:14:39es gibt nämlich eine 2.0 Version davon.
- 2:14:42Und da benutzen sie Texturen, um die Pivot Daten zu speichern.
- 2:14:47Sie speichern das Data nicht mehr in dem Mech, in den Vertex Daten ab.
- 2:14:51Und was ich leider nicht herausfinden konnte, ist, warum sie das machen.
- 2:14:55Weil ich hätte jetzt gesagt, eigentlich wäre es doch immer günstiger,
- 2:14:59das einfach in die Vertex-Daten zu speichern, selbst bei komplexeren Bäumen.
- 2:15:03Ich habe die Dokumentation anguckt, ich habe auch nochmal Perplexity AI gefragt
- 2:15:06und geguckt, was da, also wenn ihr das nicht kennt, dieses Perplexity AI,
- 2:15:10ich benutze das nicht so oft, aber bei diesen Fragen mache ich das manchmal
- 2:15:13ganz gern, weil das gibt dann so einen Text aus, AI generiert natürlich.
- 2:15:17Aber das Gute ist, das liefert immer Quellen mit dazu. Und dann klicke ich einfach auf die Quellen.
- 2:15:22Das ist mancher besser, als wenn man so googelt.
- 2:15:25Auch da habe ich dann leider nichts gefunden, warum jetzt ganz konkret Texturen
- 2:15:29besser sind als würdiges Daten.
- 2:15:30Wenn ihr also euch da auskennt, könnt ihr gerne mal in den Thread schreiben bei uns auf dem Discord.
- 2:15:35Da gibt es ja für jede Folge einen Thread. Und da Feedback da lassen.
- 2:15:38Das würde mich wirklich mal interessieren, was die Vorteile dabei sind.
- 2:15:43Mal etwas Lightweight wieder. mal etwas rausgezoomt. Ihr entwickelt ja mit Unity.
- 2:15:50Und ich hab mir schon eine Frage selbst beantwortet, weil ihr habt mit 2020
- 2:15:54angefangen, mit der Unity-Version, da hab ich gedacht, so, ah,
- 2:15:57habt ihr irgendwann gewechselt und dann tatsächlich wurde in 2022 auf eine neuere Version abgegradet.
- 2:16:04Jetzt seid ihr mit dem Spiel durch und es gab ja noch dieses Unity-Desaster mittendrin.
- 2:16:11Und da stellt sich natürlich die Frage, habt ihr da ...
- 2:16:15Ach, genau, ihr habt nämlich, kann ich auch verlinken, ihr habt nämlich auf
- 2:16:18Twitter, beziehungsweise X, auch ein Statement gemacht dazu damals.
- 2:16:23Ein richtiges eigenes Bild gemacht mit einem Text drauf, wo im Grunde draufsteht,
- 2:16:27ja, wir sind jetzt zu tief drin im Projekt, wir können jetzt nicht wechseln.
- 2:16:31Aber, genau, es ist ein bisschen offen, Weil auf dem Bild steht,
- 2:16:36solange Unity mit den derzeitigen Plänen weiterführen will, werden wir nach Alternativen gucken.
- 2:16:47Jetzt haben sie ihre Pläne ja geändert, sie haben ja zurückgerudert.
- 2:16:49Was ist denn so jetzt die Lehre daraus? Habt ihr vielleicht auch mal drüber
- 2:16:54überlegt, ob man irgendwie Godot wechselt oder so? oder?
- 2:16:58Also so wie es da immer noch steht, we will be looking for features,
- 2:17:00das hatten wir auch ein bisschen gemacht, also wir haben dann in Godot ein bisschen
- 2:17:03reingeschaut, eher so ein bisschen noch aus Neugier einfach so ein bisschen,
- 2:17:06auch so ein bisschen unseren Publisher gefragt, hey, wie ist das eigentlich,
- 2:17:08habt ihr so Erfahrungen mit anderen Engines, läuft das gut, läuft das schlecht?
- 2:17:13Und entsprechend waren wir jetzt erstmal vom Mindset da schon drauf offen.
- 2:17:16Wir haben damals auch initial viel angefangen mit Mono, nennt sich das,
- 2:17:20oder XNA, das sind so Frameworks, keine ganzen Engines, die in C-Sharp sind,
- 2:17:24mit denen wir auch viel Spaß hatten und Und zum Glück war es dann noch weit
- 2:17:27weg, dass wir jetzt wirklich sagen, alles klar, wir machen das jetzt oder so.
- 2:17:30Zumindest haben wir die Fühler ein bisschen ausgestreckt, aber auch im Endeffekt
- 2:17:33haben sie es dann auch zurückgenommen. Und deswegen bleiben wir jetzt auf jeden
- 2:17:36Fall auch erstmal bei Unity.
- 2:17:38Aber natürlich, dadurch, dass du Software von jemand anderes verwendest,
- 2:17:41der da so, sag ich mal, volle Kontrolle mehr oder weniger drüber hat,
- 2:17:45ist man dann natürlich dann auch irgendwo, gefangen ist das falsche Wort,
- 2:17:48aber irgendwie auch schon.
- 2:17:49Du weißt, was ich meine, einfach so muss man aufpassen. Und...
- 2:17:53Ja, erst mal hoffen wir so, dass es erst mal so positiv für uns weiter bleibt.
- 2:17:58Also ihr macht das mal bei Unity.
- 2:18:00Genau, genau.
- 2:18:01Na, die Chasing Carrots haben halt gewechselt. Die haben für Hearts of Torment,
- 2:18:06haben sie jetzt Godot benutzt.
- 2:18:09Das hatte gar nichts damit zu tun mit diesem Debakel. Das war nämlich schon
- 2:18:13davor, haben sie gewechselt.
- 2:18:14Aber davor gab es auch schon immer Kompatibilitätsprobleme mit irgendwie Software,
- 2:18:18die da nicht weitergeführt wird. Und dann hast du keinen Codezugriff. gefunden.
- 2:18:23Das war ein bisschen unangenehm und mit Godot haben sie halt die volle Kontrolle.
- 2:18:28Ich glaube auch Godot wäre das erste, wohin wir nach aktuellem Stand so ein
- 2:18:32bisschen wechseln würden.
- 2:18:34Wobei wir da aber auch viel gehört haben, dass gerade Portierung auf gewisse
- 2:18:37Plattformen, was weiß ich, Nintendo oder sowas, alles noch ein bisschen trickiger sei.
- 2:18:41Ja.
- 2:18:41Also Switch, als jetzt zum Beispiel was mit Unity abgeht. Aber ja,
- 2:18:46muss man mal auf jeden Fall im Auge behalten.
- 2:18:47Vorhin hattest du übrigens gesagt, dass ihr ein Tool benutzt habe,
- 2:18:51um diese ganzen Dialogbäume zu gestalten für die ganzen NPCs.
- 2:18:56Und ich habe zwei Sachen gefunden, einmal Node Canvas und einmal Flow Canvas.
- 2:19:00Und ich habe mich gefragt, ob eins davon dafür zuständig war.
- 2:19:05Also im Endeffekt ist sowohl Flow Canvas als auch Node Canvas von demselben
- 2:19:09Macher und ist auch mehr oder weniger das selbe Framework.
- 2:19:12Ich glaube, Flow Canvas baut auf Node Canvas auf.
- 2:19:15Das heißt, beides würde ich jetzt einfach unter Node Canvas ein bisschen zusammenfassen.
- 2:19:19Und was macht das nochmal?
- 2:19:21Genau, also Flow Canvas nutzen wir gar nicht so viel, das nutzen wir glaube
- 2:19:25ich nur für unsere Quests.
- 2:19:26Im Endeffekt ist unser Quest, wie die so ein bisschen vonstatten geht,
- 2:19:30wann ein Tagebuch triggert oder wann hast du so ein bisschen weitergeht,
- 2:19:33das ist so ein Flow Graph quasi.
- 2:19:35Das wird darin sozusagen definiert und im Node Canvas, das ist unsere AI,
- 2:19:41also wie sich unsere Gegner verhalten, das ist eine State Machine und auch unser
- 2:19:46Dialogsystem selbst ist auch über Node Canvas und hat dann so Dialogbäume und so weiter.
- 2:19:52Also im Endeffekt ist es ein generisches Framework, einfach um Graphen zu authern.
- 2:19:58Zu bestellen. So wie man das jetzt auch, diese ganzen Node-Editoren kennt,
- 2:20:02wie man Materialien in Unreal baut und so.
- 2:20:04Achso, das heißt, eure KI ist gar nicht in C-Sharp geschrieben oder so,
- 2:20:09sondern ist alles mit diesem … Genau.
- 2:20:11Genau, genau. Also natürlich gibt es dann, jeder Knoten repräsentiert sozusagen
- 2:20:14eine C-Sharp-Klasse, die dann irgendwas Gewisses tut oder sowas.
- 2:20:17Und wir haben auch eigene Knoten hinzugefügt, die eigene Dinge tun,
- 2:20:21aber im großen Ganzen werden die dann zusammengestöpselt über das Grafensystem.
- 2:20:25Ah, okay. Aha. Genau, ich hatte dann auch gesehen, Odin-Inspektor,
- 2:20:29das haben wir schon mal gehabt.
- 2:20:31Ich habe leider vergessen, was das Ding eigentlich nochmal macht,
- 2:20:33aber wir haben es schon mal erwähnt hier im Podcast.
- 2:20:35Das ist auch ein Unity-Ding, also im Endeffekt im Unity hast du ja so einen
- 2:20:38kleinen Inspektor, wenn du ein Objekt anklickst, hast du so einen Inspektor,
- 2:20:40der sagt, jo, es hat folgende Eigenschaften, es ist auf folgender Position, bla bla bla.
- 2:20:45Und was Odin eigentlich nur macht, ist das Ding auf Steroide setzen, quasi.
- 2:20:50Es ist sozusagen, es macht seinen eigenen Inspektor,
- 2:20:55den man deutlich einfacher editieren kann und der von, auch ohne,
- 2:20:59dass man ihn editiert, deutlich schöner und sinnvoller und übersichtlicher gestaltet,
- 2:21:05als was Unity bei Default macht.
- 2:21:07Genau, mehr macht das eigentlich nicht.
- 2:21:10Einfach den Inspektor schöner und gibt uns mehr Macht, den Inspektor auch zu editieren.
- 2:21:14Ah, okay.
- 2:21:18Dann Unitask. Also ich liste das hier gerade so ein bisschen auf für Leute,
- 2:21:20die da interessiert sind, weil es kann ja mancher spannend sein,
- 2:21:23was ihr für Tools benutzt habt.
- 2:21:25Und diese Tools übrigens, die habe ich aus den Credits.
- 2:21:27In den Credits sind die ganzen aufgelistet. Und da gibt es noch eins.
- 2:21:31Unitask. Provide an efficient allocation free async arrayed integration for Unity.
- 2:21:37Ja, auf jeden Fall sehr, sehr geil. hätte ich das früher gekannt,
- 2:21:40ich hätte es am liebsten für alle meine Projekte, die ich damals verwendet hätte,
- 2:21:43schon verwenden wollen würden.
- 2:21:45Johannes hat das per Zufall so ein bisschen entdeckt. Und im Großen und Ganzen
- 2:21:48ist das ein kleines Framework, womit man asynchrone Methoden erzeugt,
- 2:21:55die dann zum späteren Zeitpunkt etwas tun. Ist jetzt ein bisschen erstmal abstrakter.
- 2:22:01Das gibt es von Unity von sich aus auch auf zwei Formen.
- 2:22:04Einmal als Koroutinen und einmal einfach nur als Async-Await.
- 2:22:07Und Coroutine sind sehr performance-unschön in Unity, weil eigentlich jeder
- 2:22:13Aufruf von, hey, warte mal einen Frame oder sowas erzeugt dein Garbage.
- 2:22:17Jetzt sind wir wieder beim Garbage-Kollektor.
- 2:22:19Und ja, genau. Und Async-Await, soweit ich gerade das richtig im Kopf habe,
- 2:22:23ist in Unity oder genau, ist in Unity eigentlich genauso implementiert wie Coroutine.
- 2:22:29Unity hat ja so ein bisschen eine eigene Implementierung von seinem C-Sharp.
- 2:22:32Das ist ja kein echt richtiges C-Sharp.
- 2:22:34Dort ist Async-Await ein bisschen anders aufgebaut. Und Unitask macht im Endeffekt,
- 2:22:39gibt ein Framework an, wo man Methoden genauso aufruft wie mit Async Await,
- 2:22:44aber ohne, dass Garbage erzeugt wird und was viel so ein bisschen weg abstrahiert.
- 2:22:50Ja, und ist dadurch einfach sehr schön zu verwenden für asynchrone Calls.
- 2:22:53Genau, für alle, die jetzt sich denken, so hä, was soll das hier?
- 2:22:57Es ist halt so, wenn man ein Skript hätte und dort eine kleine ...
- 2:23:04Schleife macht zum Beispiel, die die ganze Zeit weiterläuft und die nie endet,
- 2:23:08dann würde das gesamte Spiel einfach blockieren.
- 2:23:11Und diese Schleife könnte sowas sein wie, ich weiß nicht, warte mal auf eine
- 2:23:15ganz bestimmte Sache, die im Spiel passiert. Und nur dann soll irgendwas ausgeführt werden.
- 2:23:21Und das ist natürlich ein Problem, weil diese Schleife, die muss ja irgendwann
- 2:23:25nochmal wieder verlassen werden.
- 2:23:28Ja, genau. Und dafür gibt's diese, ich kenn das als Yield. Da schreibt man dann so rein Yield.
- 2:23:34Und das bedeutet, dass die Schleife einmal ausgeführt wird.
- 2:23:37Es wird gesehen, ach guck, diese Condition ist noch nicht erfüllt,
- 2:23:41auf die ich jetzt die ganze Zeit erwarte.
- 2:23:42Und dann kann der Rest des Spiels erst mal weitermachen und im nächsten Frame
- 2:23:46gucke ich einfach wieder da rein und führe die Schleife aus. Ist das so grob?
- 2:23:50Genau, genau. Das ist eigentlich genau so. So nutzen wir das.
- 2:23:54So ist auch der Anwendungsfall häufig.
- 2:23:56Genau, dass mal kleine Skripte hat, das fühlt sich so ein bisschen an,
- 2:23:59wie halt, dass das alles parallel läuft.
- 2:24:01Genau, genau, genau.
- 2:24:03Genau. Aber ja, okay, das heißt, dieses Unitask ist einfach cool,
- 2:24:07weil es performanter ist.
- 2:24:08Genau. Und sehr schön anzuwenden und rechts eigentlich auch intuitiv ist und sehr elegant.
- 2:24:15So aus programmiertechnischer Sicht finde ich das.
- 2:24:18Okay. Dann habt ihr noch einen Hap-Profiler, der wahrscheinlich dazu da ist,
- 2:24:22irgendwie den Speicher zu analysieren und was worum liegt und so.
- 2:24:25Aber es gibt eigentlich die Debugger-Tools von Unity, die schon mit sind.
- 2:24:30Das ist eine Sache, die mag ich sehr gerne in Unity.
- 2:24:33Die sind nämlich ziemlich cool, sehr einfach erreichbar und laufen sogar on the fly mit.
- 2:24:38Kann man einfach während das Spiel schon läuft, kann man sagen,
- 2:24:41hier, lass mal Performance checken. Das ist in Unreal immer ein bisschen hakeliger.
- 2:24:46Und da habe ich mich gefragt, so warum ...
- 2:24:48Also der muss dann ja richtig, richtig cool sein, damit er den eigentlich Eingebauten nicht benutzt.
- 2:24:55Also wir haben den Eingebauten trotzdem verwendet. Also es ist nicht so,
- 2:24:58dass das den jetzt irgendwie replaced hat.
- 2:25:00Wenn ich mich gerade nicht täusche, sagt sogar, der Memory-Profiler,
- 2:25:03den wir dort eingebaut haben, jo, ich bin so ein bisschen deprecated, nutz mal den von Unity.
- 2:25:07Aber irgendwie, er war sehr schnell, also wir haben vor allem den Memory-Profiler
- 2:25:11viel genutzt und der braucht sehr lange.
- 2:25:13Zum Beispiel liest er den kompletten Speicher aus. Und wenn ein Spiel im Editor
- 2:25:168 GB groß ist, also mit Editor-Kram, dann hast du einen Memory-Print von,
- 2:25:21keine Ahnung, deutlich mehr.
- 2:25:23Und das hat es schnell so ein bisschen überschossen und das war irgendwie langsam.
- 2:25:26Und wenn du Dinge angeklickt hast, dann hat er mir ein komplettes Projekt durchsucht,
- 2:25:29dann musst du zwei Minuten warten, dass du wieder was anklicken kannst.
- 2:25:31Und irgendwie hat sich das super detailliert, aber in seiner Anwendungsform
- 2:25:35irgendwie so ein bisschen clunky.
- 2:25:36Und der Heat-Profiler, ich weiß nicht genau, was der anders macht,
- 2:25:39der hat einfach, du klickst ein Objekt an, zack, bis da.
- 2:25:41Und die Ansicht war einfach ein bisschen anders. Du kannst nach bestimmten Sonder-Cases,
- 2:25:46zum Beispiel Empty-Shell-Objekten haben wir viel gesucht, das ist jetzt auch
- 2:25:48wieder recht technisch, um einfach herauszufinden, wo vielleicht Speicher hängen bleibt.
- 2:25:53Und im Endeffekt war es für uns einfach ein zusätzliches Tool zum Memory-Profiler
- 2:25:56und von den ganzen Profilern generell von Unity.
- 2:25:59Ich glaube, es kommt auch von Unity, wenn ich mich gerade nicht täusche und
- 2:26:02nicht von irgendjemand anders.
- 2:26:04Und ja, einfach ein zusätzliches Tool, was einfach eine andere Ansicht und ein
- 2:26:07bisschen schöneren Workflow für uns gegeben hatte.
- 2:26:09Na, es stimmt schon, was du sagst, weil ich habe tatsächlich ein Zitat gefunden,
- 2:26:15was, genau, was hier, ich verlinke das auch mal, die GitHub-Seite,
- 2:26:21da steht nämlich, wir spulen mal ein Jahr vor,
- 2:26:25Unity Technologies hat angekündigt, dass sie auch eine Memory Profiler arbeiten
- 2:26:30und this disrupted my plans for heap Profiler.
- 2:26:34Also, ja, das scheint eine Unity-unabhängige Person zu sein,
- 2:26:38die tatsächlich das Ding...
- 2:26:40Und dann steht halt hier, ja, und jetzt ist es einfach nicht mehr kostentragend
- 2:26:44sozusagen, dass ich jetzt hier ganz viel Zeit rein rein investiere,
- 2:26:50wenn Unity da eh irgendwas macht. Ich weiß aber nicht.
- 2:26:55Vielleicht, ich meine, wir kennen Unity, da wird ja auch gern mal was einfach
- 2:27:00dann deprecated und nicht mehr weiterentwickelt oder kommt dann doch nicht,
- 2:27:02wie es angekündigt war oder so. vielleicht lohnt es sich trotzdem noch dieses Ding weiter zu.
- 2:27:07Genau, hier vor zwei Monaten steht hier auf GitHub, dass die,
- 2:27:13genau, die Version von diesem Programm wurde vor zwei Monaten abgegradet.
- 2:27:17Also anscheinend gibt es da trotzdem noch Support.
- 2:27:19Ja, also wie gesagt, ich finde es auch ein sehr schönes Tool und ja,
- 2:27:22wenn ihr euer Spiel so ein bisschen profilen wollt oder nach Speicher-Lags oder
- 2:27:27sowas suchen wollt, ist das auf jeden Fall eine Empfehlung von mir oder von uns.
- 2:27:31Genau, und das letzte Tool, was ich noch aufgelistet habe, ist der Asset Usage
- 2:27:35Detector. Da kann man wahrscheinlich einfach feststellen, ob Asset überhaupt benutzt wird.
- 2:27:39Also im Endeffekt kannst du einen Rechtsklick auf irgendein Asset machen und
- 2:27:41dann suchen wir Referenzen. Das hat Unity auch von sich aus,
- 2:27:44aber irgendwie findet er gefühlt nur eine Richtung.
- 2:27:45Also entweder, ich weiß gar nicht, welche Richtung, ich habe es lange nicht
- 2:27:48verwendet, wer verwendet mich oder von wem werde ich verwendet, aber nicht beides.
- 2:27:53Und der Asset Usage Detector durchsucht nicht nur auf Asset-Ebene,
- 2:27:57sondern kann auch Szenen durchsuchen, ist generell auch recht flott.
- 2:28:02Recht zuverlässig. Du kannst ja ein bisschen konfigurieren, wie du wann was
- 2:28:04und wie viel Tiefe möchtest du suchen und so weiter.
- 2:28:07Und das war einfach für uns hilfreich, um, was weiß ich, da ist ein Acid,
- 2:28:10wir denken, es wird nicht mehr verwendet, lassen wir kurz gucken,
- 2:28:12wird es wirklich nicht verwendet, dann können wir es löschen oder sowas.
- 2:28:14Das, genau. Auch ein schönes Tool.
- 2:28:17Ja, okay. So, das bringt vielleicht jetzt anderen Leuten noch was,
- 2:28:22die auch coole Tools suchen.
- 2:28:24Ihr habt aber nicht nur Tools benutzt, sondern auch welche selbst entwickelt.
- 2:28:30Ziemlich viele.
- 2:28:30Ja, was sind denn so die Top-3-
- 2:28:34Tools?
- 2:28:35Also, kommt wahrscheinlich so ein bisschen drauf an, wen du aus dem Team fragst.
- 2:28:39Für unsere Level-Designer haben wir, ich habe es ein Level-Design-Toolbox genannt,
- 2:28:44gibt es jetzt auch nicht nach außen hin oder sowas, womit man zum Beispiel in
- 2:28:47diesen Boden reinzeichnen kann, also das Texture-Splitting.
- 2:28:50Du sagst, hey, hier male ich jetzt Steine rein, hier male ich jetzt Erde rein,
- 2:28:53hier male ich jetzt Sand rein und sowas,
- 2:28:55was dann auch diese Meshes quasi auf Vertex-Ebene sozusagen bemalt,
- 2:28:59damit sie die richtigen Vertex-Daten haben, damit es dann auch hinterher schön
- 2:29:02dargestellt wird und über das Tool kann man aber auch zum Beispiel einzelne Objekte platzieren.
- 2:29:06Bei Unity von sich heraus kann tatsächlich, in der Regel nimmst du ein Prefab
- 2:29:10und hast ein Projekt an sich, ziehst es in die Szene und das machst du dann,
- 2:29:13bis deine Welt platziert ist.
- 2:29:14Und das ist teilweise einfach sehr nervig. Und da haben wir ein kleines Tool
- 2:29:16gemacht, wo du quasi eine kleine View hast von ganz vielen Prefabs.
- 2:29:20Du wählst irgendjemand an und dann kannst du einfach Linksklick gedrückt halten,
- 2:29:22malst einfach in die Szene und platzierst ganz viel davon.
- 2:29:25Und dann kannst du ja auch mit dem Rechtsklick wieder löschen oder du kannst
- 2:29:27einen gewissen Radius angeben oder sagen, ein paar Prozentsatz,
- 2:29:30von denen ich place, werden auch automatisch geflippt oder genau.
- 2:29:34Das ist auf jeden Fall ein großes Ding.
- 2:29:36Sowas kennt man ja vor allem, wenn man so Gras in Szenen painted.
- 2:29:40Da hat man wie so ein Brush und dann zieht man einmal da rum und dann werden,
- 2:29:44ganz viele kleine Grasbüschel platziert.
- 2:29:47Und sonst, was für viel, wir haben ein eigenes LOCA-System, also wie unser Spiel
- 2:29:52übersetzt wird in verschiedenen Sprachen.
- 2:29:54Da haben wir ein eigenes Dateiformat, sag ich mal.
- 2:29:57Da haben wir ein kleines Tool, was mittlerweile, vor allem im Nachhinein gern
- 2:30:00verwendet wird, um einfach zu sagen, hey, Es gab zum Beispiel einen Rechtschreibfehler,
- 2:30:03da steht jetzt höhere statt höhere und dann kannst du einfach höhere eintippen
- 2:30:08und dann suchst du so eine ganz loka Datei und sagst dann alles klar,
- 2:30:10hier ist das, das ist der Key und so weiter und kannst auch dort direkt vor Ort editieren.
- 2:30:14Das war ganz praktisch. Ich würde jetzt nicht sagen, das war das Größte,
- 2:30:17aber war auf jeden Fall auch nochmal hilfreich.
- 2:30:20Dann haben wir einen object bookmarker das ist so ein kleines zusätzliches fenster für unity,
- 2:30:24normalerweise hat man diese projekt an sich das ist einfach die eins zu eins
- 2:30:27die ordnerstruktur verfestplatte aber manchmal möchtest du zum beispiel verschiedene
- 2:30:31objekte aus verschiedenen ordnern in einer gemeinsamen in einem virtuellen ordner
- 2:30:34sozusagen haben im endeffekt ist das so eine art system womit wir eigene virtuelle
- 2:30:38ordner machen können die so nicht existieren aber so wirken als ob sie,
- 2:30:42da sind. Ja, und dann ganz viel Kleinigkeiten irgendwie zum Beispiel,
- 2:30:47wenn ich irgendwas selektiere und dann selektiere ich was anderes und dann möchte
- 2:30:50ich eigentlich am liebsten zurück zu meiner alten Selektion,
- 2:30:53dann haben wir einen kleinen Button eingebaut und dann klickst du Back und dann
- 2:30:55gehst du zurück zu einer alten Selektion, aber es sind so ganz viel Kleinigkeiten.
- 2:30:58Von diesen Kleinigkeiten haben wir einfach sehr, sehr viel.
- 2:31:01Okay, das freut mich zu hören, weil ich bin ein großer Fan von guten Tools und guten Workflows.
- 2:31:06Eine Frage, die ich, ich bin ein bisschen verwundert, dass ihr so ein Terrain-System
- 2:31:10selbst schreiben musstet.
- 2:31:11Ich hätte jetzt schon gedacht, dass Unity da was mitbringt irgendwie.
- 2:31:14Also gerade so verschiedene Texturen ineinanderblenden ist jetzt ja wirklich so ein Standardding.
- 2:31:21Ich glaube, also es gibt es auch, nennt sich einfach Terrain, Editor, keine Ahnung.
- 2:31:26Aber es ist halt erstens auf 3D ausgelegt, das heißt, du hast dann auf jeden
- 2:31:28Fall auch immer Koordinaten, die du an sich nicht brauchst.
- 2:31:32Damals konnte man es auch nicht auf beliebenden Achsen drehen,
- 2:31:35ich glaube, das geht mittlerweile.
- 2:31:36Du hattest immer dieses Mesh auf der X-Z-Achse.
- 2:31:41Unser Spiel befindet sich aber auf der XY-Achse, zumindest als wir damals angefangen haben.
- 2:31:45Und damals konnte man, glaube ich, dieses Mesh sozusagen nicht rotieren,
- 2:31:48nicht drehen. Es musste immer auf der XY-Achse liegen.
- 2:31:51Mittlerweile geht es, glaube ich, anders, aber dann haben wir es auch nicht mehr verwendet.
- 2:31:54Und zusätzlich der Spezialfall ist halt dieses Textures Plattling,
- 2:31:58was wir implementiert haben, versucht halt pixelgetreu zu bleiben.
- 2:32:03Und das Terrain-Mesh von Unity, du kannst ja auch Dinge mischen,
- 2:32:07aber irgendwie hast du nicht so eine richtige Kontrolle, wie und wann werden
- 2:32:10sie gemischt, also die verschiedenen Splits sozusagen und deswegen haben wir
- 2:32:15uns dazu entschieden, ein eigenes zu machen, auch weil es sich dann angeboten
- 2:32:17hat, es in unser Chunking System vernünftig einzufügen.
- 2:32:20Das Terrar ist genauso groß wie ein Chunk. In Unity ist das glaube ich immer,
- 2:32:25also die können das in sich auch irgendwie streamen, aber ja,
- 2:32:30es hat sich für uns einfach irgendwie sinnvoller angefühlt, das selber zu machen.
- 2:32:34Aber das ist ja schon interessant, dass ihr so viele Tools, also das haben wir
- 2:32:40in dem anderen Podcast schon ausgearbeitet, dass ihr ja vorher nicht viel Erfahrung
- 2:32:45hattet in Spielentwicklung.
- 2:32:46Ihr habt ein paar kleinere Projekte gemacht und ihr habt ja auch Informatik
- 2:32:49studiert, das heißt, da war schon eine ganze Menge Knowledge da,
- 2:32:52aber jetzt nicht spezifische Erfahrungen mit, ja, wie mache ich ein Spiel?
- 2:32:57Und meine erste, ja, also mein,
- 2:33:02also ich habe so viel Respekt vor diesen ganzen Sachen, dass meine Herangehensweise Also wäre okay,
- 2:33:07entweder benutze ich ein Plugin, was irgendwer gemacht hat, oder ich muss mein
- 2:33:11Spiel eben irgendwie anpassen, dass es sich so in die vorhandenen Tools reinarbeitet,
- 2:33:16weil jetzt neue Tools auch noch zu entwickeln, das ist ja nochmal ein…,
- 2:33:20Ja, also nochmal ein riesiger Button an Arbeit.
- 2:33:24Man muss auf jeden Fall auch dazu sagen, unsere Tools sind sehr spezifisch auf
- 2:33:29uns zugeschnitten. Und sie haben auch sehr spezifische Bugs.
- 2:33:32Also der Workflow ist natürlich so, dass es uns hilft. Aber wir haben mittlerweile
- 2:33:36auch gelernt, also unsere Tools sind alle so 80 Prozent fertig,
- 2:33:39vielleicht manchmal sogar weniger.
- 2:33:40Sie tun so, was sie wollen, aber eigentlich können wir sie noch viel krasser und geiler machen.
- 2:33:44Und für sowas sind dann oft Assets vielleicht auch ganz sinnvoll.
- 2:33:47Wobei wir aber auch viel die Erfahrung gemacht haben, dass Assets,
- 2:33:49die man sich kaufen kann, oft eigentlich gar nicht so konkret das tun,
- 2:33:52was man eigentlich tun möchte, sondern halt so flexibel gehalten sind,
- 2:33:55dass man zwar seinen Use Case auch machen kann, aber irgendwie nicht ganz so, wie man es gern hätte.
- 2:33:59Und daher sind viele von unseren Tools, glaube ich, recht flott in der Implementierung gewesen.
- 2:34:03Es gibt einzelne Ausnahmen, zum Beispiel diesen Object Placer oder auch dieses
- 2:34:07Splatplane-Bemalen hat schon so ein bisschen was gedauert, aber,
- 2:34:11ja, es hat sich für uns einfach ausgezahlt und oft sind die Sachen,
- 2:34:14die man findet, auch zum Beispiel nicht auf Pixelart ausgelegt oder spezifisch eher 3D statt 2D.
- 2:34:19Oder, oder, oder. Also irgendwie gab es immer so ein Drawback,
- 2:34:22wo man gesagt hat, na, irgendwie fühlt es sich jetzt nicht so schön an,
- 2:34:24das jetzt dafür zu verwenden.
- 2:34:26Und wir haben einfach Spaß auch dran, solche Tools zu entwickeln.
- 2:34:30Irgendwie macht es Spaß, Dinge zu automatisieren oder auch Use Cases festzustellen,
- 2:34:34hey, alles klar, irgendwie Objekte platzieren Unity sind richtig scheiße,
- 2:34:38was können wir denn da machen?
- 2:34:39Und dann hat es klein auch oft angefangen.
- 2:34:41Einfach nur so, hey, hier ist eine kleine Liste und dann kannst du ein bisschen
- 2:34:43was placen, das hatte keine Zusatzfeatures und dann hat Julian zum Beispiel
- 2:34:47viel damit gearbeitet und meinte so, hey, wäre nicht voll cool,
- 2:34:49wenn man noch das machen könnte.
- 2:34:51Wenn man das halt zu dem Zeitpunkt noch dazu gebaut.
- 2:34:53Also nicht so, dass wir gesagt haben, alles klar, wir bauen jetzt das Tool ein
- 2:34:56und dann ist es fertig. Es ist über die Zeit des Projektes immer mitgewachsen.
- 2:35:00Und auch die Anforderungen haben sich dann immer mal wieder verändert.
- 2:35:03Und deswegen, all in all, hat es sich nicht nach so viel Aufwand angefühlt, sie einzubauen.
- 2:35:08Vielen Dank.
- 2:35:09Okay, weil es immer als kleiner Task startet und dann über die Zeit wächst, ja.
- 2:35:14Und gab es auch mal den Fall, dass ihr, also dass zum Beispiel Level Design
- 2:35:17hat irgendwie Sachen platziert irgendwie und dann wurde gemerkt,
- 2:35:20ey, das ist doch alles blöd, wir machen hier ein neues System und das bedeutet
- 2:35:24aber dann auch, dass die alte Arbeit so ein bisschen verloren ist,
- 2:35:26weil das neue System irgendwie, weiß ich nicht, die Daten anders abspeichert.
- 2:35:29Gab es schon mal auch den Fall, dass dann Sachen nochmal gelöscht werden mussten,
- 2:35:32größere Teile, weiß ich nicht, der Spielwelt oder so und dann eben in das neue
- 2:35:36System übertragen werden mussten?
- 2:35:38Also so einen großen Change von irgendeinem System hatten wir, glaube ich, nicht.
- 2:35:42Aber es gab schon Sachen wie, zum Beispiel wenn man Stühle oder Betten ist ein besseres Beispiel.
- 2:35:47Wenn man ein Bett in unserer Welt platziert, dann gibt es so ein Default-Exit-Position.
- 2:35:52Und das ist zum Beispiel immer südlich vom Bett. Aber manche Betten sind halt
- 2:35:56dort platziert, wo südlich im Bett eine Wand ist.
- 2:35:58Und dann gab es zumindest den Case, dass man irgendwie in die Szene nochmal
- 2:36:01rangehen musste und du müsstest alle Betten nochmal durchgehen,
- 2:36:03um die Exit-Position nochmal zu setzen. oder vielleicht haben sie sich auch
- 2:36:06immer mal resetet und dann musste man die nochmal alle setzen.
- 2:36:09Aber das waren eher so kleinere Subsysteme oder Subdaten, die gesetzt werden
- 2:36:13mussten und nicht irgendwie alles nochmal fresh oder sowas. Sowas hatten wir nicht.
- 2:36:17Da haben wir auch immer sehr früh drauf geachtet, dass wir sagen,
- 2:36:19alles klar, wir fangen erst an, was weiß ich, alle Routinen von allen NPCs zu
- 2:36:23definieren, weil wir wissen, das System funktioniert auch halbwegs.
- 2:36:25Oder wenn es dort vielleicht ein Fragezeichen gab, funktioniert das eigentlich?
- 2:36:29Dann haben wir erst mal noch ein bisschen gewartet, weil das war auch,
- 2:36:31ja, wir wollten halt nicht, dass genau so ein Fall mal eintreten würde.
- 2:36:34Aber das ist interessant, genau, Exit Position, also dorthin, wo NPCs aufstehen.
- 2:36:39Genau, oder der Spieler auch selber, genau.
- 2:36:42Genau, das ist übrigens ein guter Punkt. Warum kann man sich hinsetzen auf Stühle?
- 2:36:50Warum nicht? Ja, ja, ich verstehe schon die Frage. Es hat keinen Effekt.
- 2:36:56Oder?
- 2:36:56Genau, nee, es hat keinen Effekt. Im Großen und Ganzen, wir sind ja sehr stark
- 2:36:59an Gothic inspiriert und in Gothic gibt es sehr viele von solchen Interaktionen.
- 2:37:02Ich setze mich irgendwo hin oder ich rühre da irgendwie mit dem Summkrautstampfer
- 2:37:06in diesem Eimer rum oder was auch immer.
- 2:37:09Es hatte sehr viele so kleine Interaktionen in der Welt, die sich sehr lebendig
- 2:37:13oder immersiv angefühlt haben.
- 2:37:15Und ich finde, es hat ein sehr immersives Gefühl. Du hast ein Lagerfeuer,
- 2:37:17du hast ein Stuhl, ich setze mich hin und ich chill einfach mal und kann ein
- 2:37:20bisschen Roleplay damit betreiben.
- 2:37:22Genau, es hat keinen tieferen Sinn und Zweck, es ist einfach nur schön und NPCs
- 2:37:25machen das ja auch einfach nur um die Szene aufzulockern, warum dann nicht auch
- 2:37:28dem Spieler das erlauben zum Beispiel.
- 2:37:30Aber ich kann mich auch hinhocken und das bringt auch nichts.
- 2:37:34Ja genau, es ist so ein bisschen aus WoW inspiriert, da gibt es einen extra
- 2:37:38Button, der X-Button, um sie auf den Boden zu setzen und irgendwie fühlt sich
- 2:37:41das einfach immersiv und cool an.
- 2:37:43Ja, aber ich glaube, hier ist es Hocken wirklich, nicht sitzen.
- 2:37:46Ja genau, Nehmen wir uns ein Socken, ja.
- 2:37:47War das mal ein Pickpocket-System, was hätte kommen sollen?
- 2:37:51Nee. Das fand ich ganz witzig, als wir drüber released haben,
- 2:37:54waren einzelne Leute so, ja, irgendwie hat der mich gesehen,
- 2:37:57obwohl ich hier gehockt habe.
- 2:37:58Also manche Leute haben das tatsächlich so als Stealth-System missverstanden,
- 2:38:03was ich sehr interessant fand. Ja, ja.
- 2:38:08Letzte Interaktion, die mir aufgefallen ist, man kann trinken aus Fässern.
- 2:38:11Hatte lange Zeit keinen Effekt. Entweder mit dem letzten oder vorletzten Patch
- 2:38:14haben wir aber eingeführt, dass so einen kleinen Gesundheitsspot bekommst und
- 2:38:17das halte ich ein bisschen.
- 2:38:19Davor war es auch einfach nur so ein bisschen, ja, sieht ganz cool aus.
- 2:38:23Okay, ähm ...
- 2:38:26Ich habe in einem, warte, in einem Video was gefunden.
- 2:38:31Das Video heißt, genau das ist von euch, der 26. DevBlog, da geht es um technische Schuld.
- 2:38:41Was ist denn technische Schuld?
- 2:38:43Im Endeffekt ist das ein Begriff, der beschreibt, wie sauber die Code-Basis
- 2:38:48ist, auf der man arbeitet, sage ich mal.
- 2:38:50Und die technische Schuld steigt dann an, wenn man zum Beispiel quick und dirty
- 2:38:54irgendeinen Bug fixt. so, hey, irgendwie funktioniert das hier nicht,
- 2:38:57ich weiß nicht warum, aber wenn ich das tue, dann klappt das prinzipiell häufiger.
- 2:39:02Man klebt so Pflaster drauf und irgendwann hat man so ein Frankenstein-Monster,
- 2:39:05was eigentlich überall auseinanderfällt, aber es wird gerade noch so zusammengehalten.
- 2:39:09Und man versucht die technische Schuld möglichst gering zu halten,
- 2:39:12weil oft Seiteneffekte sehr schwer erkennbar sind.
- 2:39:16Und eigentlich ist es schön, halt eine clean Code-Basis zu haben,
- 2:39:19die tut das, was sie tun soll.
- 2:39:22Und technische Schuld hat aber mehrere Metriken zum Beispiel,
- 2:39:24auch wie lang ist deine Methode, weil je länger deine Methode ist,
- 2:39:27desto wahrscheinlicher ist vielleicht auch, dass da irgendwas drin ist,
- 2:39:29was da vielleicht nicht reingehört, weil der Name vielleicht nicht mehr das
- 2:39:32ganz angibt, was der Inhalt der Methode ist.
- 2:39:34Das hat so mehrere Metriken und im Großen und Ganzen heißt das einfach,
- 2:39:37man versucht den Quellcode clean zu halten.
- 2:39:39Genau, um, damit die zukünftige Arbeit einfach schnell und effektiv sein kann
- 2:39:46und nicht sich alles ewig hinzieht und eine Änderung alles kaputt macht,
- 2:39:50da muss man dann ewig rumfixen, ne, irgendwie.
- 2:39:54Wobei, passiert trotzdem irgendwann wieder. Und auch jetzt gegen Ende,
- 2:39:56gerade auch mit dem Patchen und kurz vor Release, ist auf jeden Fall sehr viel
- 2:39:59noch reingekommen, was wahrscheinlich nicht so schön ist für künftige Projekte.
- 2:40:05Das müssen wir dann wieder ausbauen oder so.
- 2:40:07Genau, und um die technische Schuld wieder runterzubringen, da muss man dann
- 2:40:10refactoren. Also mal neu schreiben.
- 2:40:14Genau, und es gibt eine andere Sache, die man in diesen, also ihr habt ganz
- 2:40:18viele Devlogs gemacht, sowohl auf TikTok als auch auf YouTube vor allem dann.
- 2:40:22Und da habt ihr noch eine andere Sache und da genau, das habe ich in der letzten
- 2:40:26Episode habe ich gesagt, darüber sprechen wir, haben wir aber gar nicht gemacht,
- 2:40:30deswegen muss ich das hier mit einbringen.
- 2:40:32Es gibt ein Plakat in eurer WG oder es gab ein Plakat und das war signifikanter Content für TikTok.
- 2:40:39Hängt hier auch noch schräg gegenüber, ich habe es im Blick von hier aus.
- 2:40:42Ah, okay, genau, du weißt, worüber ich spreche und zwar ist das Big O Cheat Sheet.
- 2:40:49Das ist, ich habe es beschrieben mit Zeitprogrammierungsplakat. Das ist ...
- 2:40:59Ja, wie spreche ich das? Das ist ein, ach genau, es gibt,
- 2:41:04Algorithmen werden komplexer oder weniger komplexer, je nach Datenstruktur oder so.
- 2:41:12Und dann heißt das, ich gucke jetzt hier O, Klammer 1, O, Klammer N und das
- 2:41:19bedeutet, und hier O, Log, Klammer N, das bedeutet einfach ganz schlimm, schlimm,
- 2:41:25ein bisschen schlimm. Ja, ja.
- 2:41:27Ja, schöne Zusammenfassung.
- 2:41:30Also wie lange einfach Algorithmen brauchen, um sich irgendwie durch Datenberge zu arbeiten.
- 2:41:37Und du musst jetzt sozusagen wissen, je nachdem, ob man zum Beispiel ein Array
- 2:41:42benutzt oder irgendeine Liste oder irgendein, ich gucke jetzt hier mal,
- 2:41:46ein Red Black Tree, was auch immer das sein soll.
- 2:41:49Ich finde die Bezeichnung gerade ganz geil. Es gibt einen Cartesian Tree,
- 2:41:53einen Binary Search Tree.
- 2:41:54Es gibt aber auch ein Red-Black-Tree, ein Splay-Tree, das klingt wie ein Jugendwort
- 2:41:59des Jahres, Splay, und ein AVL-Tree und ein KD-Tree, das sind irgendwelche Datenstrukturen,
- 2:42:05ich habe keine Ahnung, was ich hier gerade vorlese.
- 2:42:07Und dann muss man irgendwie dazu in so einer Tabelle raussuchen,
- 2:42:11welcher Algorithmus wann für welche Aktion der effektivste ist. Ja?
- 2:42:18Ja.
- 2:42:19Ist das so?
- 2:42:20Also ob man das so machen muss, ist nochmal eine andere Frage.
- 2:42:23Na, ihr habt euch immer so Fragen gestellt.
- 2:42:25Ja, ja, ja, ja.
- 2:42:26Ich habe eine Liste und ich will in dieser Liste suchen. Was ist das Beste,
- 2:42:30was ich dann machen kann?
- 2:42:31Ich weiß gar nicht mehr, wie wir in die Zwerf die Idee gekommen sind.
- 2:42:34Also wir hatten, also Chris hatte dieses Bild, dieses Poster.
- 2:42:38Einfach, ja, weiß ich gar nicht warum eigentlich. Wahrscheinlich fürs Studium,
- 2:42:42weil man hat viel von diesen Algorithmen und Datenstrukturen und so weiter im Studium gelernt.
- 2:42:46Und da musste sie auch lernen und hatte das einfach privat irgendwie rumhängen.
- 2:42:49Und wir haben dann TikTok aufgenommen und das war irgendwie eine super spontane Idee.
- 2:42:53So, hey Kai, sag mir das und das mit wie auch immer.
- 2:42:56Ja, und das war unser erstes, wie reiztes Video bei TikTok. Aus irgendeinem
- 2:42:59Grund. Wir wissen nicht genau, wieso.
- 2:43:01Wahrscheinlich, weil dann viele Leute irgendwie mitsprechen konnten,
- 2:43:03die so ein bisschen auch nötig waren. Ich weiß es nicht.
- 2:43:06Ich vermute eher, dass dieses Big-O-Cheat-Sheet entweder, wie gesagt,
- 2:43:09so ein bisschen als Unterstützung zum Lernen verwendet werden würde oder könnte
- 2:43:12oder aber auch, alles klar, was du eigentlich auch meintest,
- 2:43:15so hey, ich möchte jetzt irgendwas suchen oder irgendetwas sortieren,
- 2:43:17was wäre denn jetzt eigentlich die beste Datenstruktur davor und wir haben es
- 2:43:20halt so ein bisschen als Content verwendet.
- 2:43:23Giver, missbraucht, sage ich mal.
- 2:43:24Aber jetzt meine naive Frage. Also, wenn es die perfekte Lösung,
- 2:43:30zum Beispiel, ich möchte etwas, ich lese das jetzt hier ab, ja,
- 2:43:34ich weiß es nicht auswenden.
- 2:43:35Ich möchte etwas in einen Red-Black-Tree inserten. Warum macht das der Code
- 2:43:40dann nicht automatisch mit der besten Lösung, die es dafür gibt?
- 2:43:43Also, warum ist in Unity nicht dieses Plakat einprogrammiert und dann wird das automatisch gemacht?
- 2:43:48Weil das auch von seinen Use-Cases oft abhängt, weil du möchtest vielleicht
- 2:43:53nicht nur etwas einfügen, sondern du möchtest vielleicht auch etwas suchen.
- 2:43:56Und dann hast du nicht nur den einen Punkt, wo der vielleicht,
- 2:44:00wo der Red-Black-Tree gut ist, aber auch den anderen Punkt, wo er vielleicht schlecht ist.
- 2:44:04Und das ist das, was ich vorhin auch wieder meinte. Du siehst ja auch,
- 2:44:07okay, es gibt ein paar, die sind dolle grün, aber auch die haben irgendwie was
- 2:44:09Gelbes und andere sind woanders irgendwie ein bisschen positiver und so weiter.
- 2:44:12Alles hat irgendwie so seine Vor- und Nachteile. Und diese Trees sind teilweise
- 2:44:17auch in C-Sharp, glaube ich, implementiert.
- 2:44:20Aber das Projekt oder das Programm kann ich vorher wissen, bevor du es verwendest
- 2:44:25oder welche Daten du hast, welche Datenstrukturen vermutlich dafür am besten wäre.
- 2:44:30Das ist eine Entscheidung, die man als Programmierer dann im Endeffekt treffen
- 2:44:33muss, weil man seine Daten hoffentlich kennt und das Programm kann ja nicht,
- 2:44:37weil sonst müsste ja das Programm aus sich herauskommen und auf seinen eigenen
- 2:44:40Programmcode gucken, um dann festzustellen, du bräuchtest diesen oder jenen Tribü.
- 2:44:44Können wir schon vorstellen, dass das KI-mäßig vielleicht in der Zukunft irgendwann geht.
- 2:44:47Ja, das wäre jetzt auch meine Frage. Wäre das mal ein ordentlicher Einsatzzweck für KI?
- 2:44:51Wenn ich ehrlich bin, ich bin gar nicht so ein großer Fan von diesem Big-O-Cheat-Sheet,
- 2:44:55weil das ist alles so ein bisschen sehr theoretisch.
- 2:44:57Das sagt jetzt aber nicht Chris und nicht den ganzen Fans nach den tausend Videos,
- 2:45:01die ihr gemacht habt. Ich fall vom Baum.
- 2:45:04Bleib unter uns.
- 2:45:08Weil da auch viel Hardware mit drin steckt. 90 Prozent aller Fälle ist das Array
- 2:45:12am schnellsten, weil wenn du auf Daten zugreifst, die im Speicher liegen,
- 2:45:16hat jeder Rechner heutzutage so einen Mechanismus implementiert, das nennt sich Caching.
- 2:45:20Der greift nicht nur die Daten zu, die du gerade haben willst,
- 2:45:22sondern auch ein paar Daten links davon, ein paar Daten rechts davon.
- 2:45:25Und dann ist es oft leichter oder schneller eigentlich auf einem Array Dinge
- 2:45:29zu tun, weil die Sachen dann im Cache liegen.
- 2:45:31Und dieser Effekt, dass Dinge im Cache liegen, ist so signifikant schneller,
- 2:45:34dass eigentlich diese ganzen, also oft, nicht immer, gibt es schon auch andere
- 2:45:37Use Cases, bla bla bla, dass die ganzen anderen positiven Sachen,
- 2:45:41die dort drinstehen, oft nicht
- 2:45:42mehr ins Gewicht fallen und Array einfach trotzdem am schnellsten ist.
- 2:45:45Und das hatte ich auch lange, während des Studiums, lange nicht auf dem Schirm,
- 2:45:48bis ich das irgendwann gelehrte, war so wow, cool, mein ganzes,
- 2:45:50nicht mein ganzes Studium, aber viel von dem, was ich im Studium gelernt habe, ist eine Lüge quasi.
- 2:45:55Und deswegen bin ich da mittlerweile, ich nutze ein Array und nutze eine Liste
- 2:45:59und ich nutze ein Dictionary und alles andere, was da draufsteht,
- 2:46:01ist eigentlich ja, whatever.
- 2:46:03Ich muss sagen, ich habe eine Sache, die ich jetzt, also wo mir es doch gut
- 2:46:09tun würde, Ahnung davon zu haben.
- 2:46:11Und zwar habe ich ja vorhin erzählt von meinem kleinen Prototyp,
- 2:46:14wo ich diese tausend Sprites auf dem Bildschirm hatte.
- 2:46:17Und was mir auch bei meinem kleinen Spiel aufgefallen ist, das ist so ein Bullet
- 2:46:21Heaven, wo ganz viele Gegner auf dem Bildschirm sind.
- 2:46:25Und es dauert relativ lange, rauszufinden, zum Beispiel, welcher dieser 1000 ist am nächsten bei mir.
- 2:46:32Und dafür gibt es, glaube ich, dann einen Binary Tree.
- 2:46:39Binary Spatial, Spatial, Spatial, Petition, Spatial, ja, ich weiß auf jeden Fall, was du meinst.
- 2:46:44Das ist irgendwie so eine Art, da weiß ich nicht, da teilt man irgendwie den
- 2:46:47Bildschirm in ganz viele kleine Bereiche auf und da kann man dann super gut
- 2:46:51sortieren und super, super schnell rausfinden, okay, wer ist am nächsten zu wem.
- 2:46:57Und dafür muss man die Daten in einer ganz gewissen Seite strukturieren.
- 2:47:01Das war irgendwie, ich habe da einmal KI für verwendet.
- 2:47:04Ich wollte nämlich sagen, hier, ich habe Godot, mach mir das mal.
- 2:47:08Hat nicht funktioniert.
- 2:47:09Also muss ich sagen, also der hat zwar Code ausgespuckt und das sah auch irgendwie aus.
- 2:47:14Und wahrscheinlich, wenn man, also du könntest wahrscheinlich diesen Code nehmen
- 2:47:17und in Godot dann auch zum Laufen bringen, aber ich nicht.
- 2:47:19Also habe ich schon gesehen, so KI, man muss da schon noch Ahnung haben.
- 2:47:23Das kann man, das kann, in meinem Fall zumindest, konnte ich das nicht einfach
- 2:47:27nur copy-pasten. Leider.
- 2:47:30Genau, und da habe ich schon gemerkt, da wäre es wahrscheinlich wirklich praktisch.
- 2:47:34Aber das ist wahrscheinlich so ein Spezialfall.
- 2:47:38Hattet ihr denn mal so, also ich meine,
- 2:47:41gut, da ist die Frage jetzt insofern geantwortet, dass du jetzt meinst,
- 2:47:44okay, du benutzt meistens die Standardsachen, aber gab's einen Fall,
- 2:47:47wo ihr doch schon irgendwie so krasse Datenmengen und Sortierungen dann hattet
- 2:47:52vielleicht irgendwo so ganz spezielle, wie bei mir zum Beispiel mit, okay, du hast ja tausend,
- 2:47:56Enemies auf dem Bildschirm und musst rausfinden, wer ist wo am nächsten?
- 2:47:59Also wir haben natürlich auch ähnliche Abfragen bei uns im Code.
- 2:48:03Wir machen das so ein bisschen, lassen Unity für uns arbeiten und zum Beispiel
- 2:48:08sagen, alles klar, ich möchte, wer ist am nächsten von mir als Spieler?
- 2:48:11Und dann machen wir zum Beispiel einfach einen Circlecast um den Spieler halt darauf herum
- 2:48:14und fischen durch Unity, durch sein Physiksystem einfach erstmal,
- 2:48:18welche Entity ist überhaupt in der Nähe und dann gehen wir da nur noch linear
- 2:48:21drüber und fragen alle ab, wer ist denn davon jetzt am nächsten weil das einfach
- 2:48:24ein viel kleineres Subset ist als wenn du die ganze Welt abfragst,
- 2:48:28insofern nutzen wir sowas ähnliches auf jeden Fall schon.
- 2:48:30Im Endeffekt ist unser Chunking-System eigentlich etwas ähnliches also wie die
- 2:48:33Welt geladen werden, ist sozusagen auch eine Datenstruktur, sag ich mal ein
- 2:48:362D-Array übertrieben gesagt,
- 2:48:38wo man dann wo bestimmte Objekte in dieses Area einfach einsortiert
- 2:48:41sind und dann gehören sie zu dieser zelle und dann
- 2:48:44könntest du zum beispiel sagen alles klar ich möchte jetzt anhand einer welt
- 2:48:47position die id im 2d array berechnen kannst einfach durch breite und höhe eines
- 2:48:52chunks quasi ein bisschen dividieren und dann hast du den direkten zugriff auf
- 2:48:56alles klar dieses objekt an dieser position liegt auf jeden fall in diesem chunk
- 2:48:59und dann musst du noch objekte in diesem chunk zum beispiel durchsuchen und
- 2:49:03nicht global was auch eine kleine hilfestellung ist.
- 2:49:07Und was ähnliches tue ich auch mit diesem Object Placer, den ich vorhin hatte.
- 2:49:10Wenn ich ganz viele Objekte in der Szene platziere und ich möchte auch wieder
- 2:49:13welche löschen, dann muss ich ja im Endeffekt herausfinden, welches Objekt ist
- 2:49:17eigentlich unter meinem Mauszeiger.
- 2:49:18Zur Editor-Zeit, nicht zur Laufzeit. Und da frage ich im Endeffekt auch,
- 2:49:21gehe ich alle Liste ab, alle Objekte, welches ist jetzt mein Mauszeiger am nächsten? Ist da dieses?
- 2:49:25Und es ist auch im Radius des Mauszeigers, also lösche ich dieses.
- 2:49:28Aber das ist auch noch mal einsortiert in quasi so eine 2D-Array-Struktur,
- 2:49:33wo ich dann auch wieder von World Positions auf IDs komme, von IDs dann auf
- 2:49:37nur die Objekte, die auch in diesem Quadranten sozusagen liegen.
- 2:49:40Ja, ansonsten wäre es sehr langsam.
- 2:49:42Genau. Ist es auch tatsächlich auch so noch ein bisschen an bestimmten Stellen,
- 2:49:47vor allem wenn du den Mauszeiger sehr, sehr groß machst, dass du sagst,
- 2:49:50hey, ich möchte alle Objekte 12.000 Pixel um diesen Mauszeiger löschen,
- 2:49:54dann wird es auch wieder langsam. Genau.
- 2:49:57Aber umfährt zu sein, das ist ja selbst in Photoshop so und da arbeiten sie
- 2:50:00seit irgendwie 35 Jahren dran und haben da drei Millionen Engineers drauf,
- 2:50:05dass wenn du den Bereich sehr groß einstellst, dann ist auch Photoshop,
- 2:50:09und das ist ja schon optimiert, also.
- 2:50:11Naja, ähnliches Problem hatten wir auch mit unserem Texturesplating,
- 2:50:15da haben wir auch ein Tool, um in die Szene und den Boden direkt zu malen.
- 2:50:18Wenn es sehr groß war, hat das auch sehr lange gedauert, aber das lag daran,
- 2:50:23dass ich dort initial eine Undo-Funktion eingebaut habe und es sozusagen in
- 2:50:27den, damit man Undo machen kann, musst du ja den State vorher wissen und den neuen State.
- 2:50:32Und eigentlich hat es nur lange gedauert, es quasi in diese Datenstruktur des
- 2:50:36Stacks fürs Undo einzufügen, weshalb unser Tool, wenn man den Boden zu malen, es kann kein Undo.
- 2:50:43Also du musst auffassen, wenn du was machst.
- 2:50:45Damit es einfach flüssig läuft. Was ich auch immer ganz interessant fand.
- 2:50:50Aber kann ich speichern und wenn es mir dann nicht gefällt, was ich gemalt habe,
- 2:50:55einfach nochmal neu laden? Okay.
- 2:50:56Klar, das geht. Oder auch mit Git nutzen wir ja. Kannst du auch sagen,
- 2:51:00ich reverte einfach die Szene, wo ich jetzt was gemacht habe oder so.
- 2:51:02Ah, okay, ja. Ach, ihr benutzt, okay, ihr benutzt dafür auch gibt.
- 2:51:07Also generell einfach für Unity.
- 2:51:09Auch für alle Assets?
- 2:51:11Ja, genau.
- 2:51:12Also ist das schon groß dann?
- 2:51:14Außer die gebakten Texturesplanes. Die werden zu groß, alles andere passt gut rein.
- 2:51:19Aber ich sag mal so, warum werden die eigentlich zu groß? Also klar,
- 2:51:23wir haben jetzt festgestellt, das ist,
- 2:51:261600x1600, aber du hast ja gesagt, das sind JPEGs. Und ich sag mal so,
- 2:51:32jeder von uns hat wahrscheinlich,
- 2:51:35Tausende Fotos auf der Festplatte liegen.
- 2:51:38Also zu groß heißt jetzt auch nicht, dass das 100 Gigabyte groß ist,
- 2:51:40sondern einfach so groß, dass Git das nicht mehr so mag.
- 2:51:43Oder andersrum. Unser Projekt ist mittlerweile auch so groß,
- 2:51:45dass wir hart an der Grenze sind. Das Git sagt, jo, euer Projekt ist ein bisschen zu groß.
- 2:51:49Entweder braucht ihr da irgendwie, weiß ich, Premium oder was auch immer.
- 2:51:53Sonst hätten wir es wahrscheinlich auch mit hochgeladen. Aber es hat da,
- 2:51:57glaube ich, einfach den Budget gesprengt und deswegen haben wir es dann rausgenommen.
- 2:52:00Wie groß ist denn das Projekt gerade so?
- 2:52:04Das Problem ist, Also, ich baue ja auch regelmäßig an meinem Rechner immer mal wieder Versionen.
- 2:52:10Ich glaube, im Peak war ein Ordner von dem Projekt schon mal 80 Gigabyte groß,
- 2:52:14aber da liegen sehr viele Libraries und gecachede Daten und ein paar Bildversionen rum.
- 2:52:19So, das reine Projekt ist ungefähr ...
- 2:52:24Warte, es rechnet gerade. Es kann aber sein, dass da die Texture-Plans drin
- 2:52:27sind. Fünf Gigabyte. Ich gucke mal kurz drin, ob da die Texture-Plans drin liegen.
- 2:52:32Und dann ohne die Rohdaten von Grafik, ne, also ...
- 2:52:37Ohne A-Sprites oder irgend sowas.
- 2:52:38Ach so, genau. A-Sprites liegt extra. Das nutzen wir nur zwar eine Cloud für.
- 2:52:43Aber die exportierten Daten von A-Sprites, die sind wiederum mit drin.
- 2:52:46Aha. War es eine Cloud? Also das heißt, jemand schmeißt eine Dropbox irgendwie?
- 2:52:51Nee, also wir haben eine eigene, also was heißt eigene Cloud?
- 2:52:53Nextcloud nennt sich das.
- 2:52:54Ist sowas wie Dropbox, aber ist auf unserem eigenen Server quasi gehostet.
- 2:52:58Aber ist ja wie Dropbox eigentlich.
- 2:53:00Das heißt, die Grafik-Rohdaten haben gar keine richtige History dann sozusagen?
- 2:53:04Ja, genau.
- 2:53:05Oh, stimmt.
- 2:53:06Ich glaube, Nextcloud hat ein bisschen von History, aber so richtig verwenden tun wir es nicht.
- 2:53:11Ah.
- 2:53:12Ich glaube, im Endeffekt ist es bei uns so ein bisschen vom Workflow her,
- 2:53:15dass die Artists ihre Sachen in ihrem eigenen Workspace editieren,
- 2:53:18bis sie sagen, jo, ich bin jetzt fertig, es ist Export-Ready.
- 2:53:21Da kommt es in einen extra Ordner und das ist einfach immer die up-to-dateste Version.
- 2:53:25Okay. Ja, und das ist wichtig, weil du hast ja vorhin gesagt,
- 2:53:27dass auch aus den Aceprite-Dateien, ach nee, warte, der Exporter ist in Aceprite.
- 2:53:32Das habt ihr für Aceprite geschrieben.
- 2:53:34Genau.
- 2:53:35Das heißt, die Dateien werden nicht noch mal vom Spiel angefasst oder so.
- 2:53:39Nee, nee, nee, nee.
- 2:53:40So, jetzt haben wir festgestellt, dass du diese super, das O-Cheat-Cheat,
- 2:53:46also diese ganzen Sachen, welche Algorithmen man wie wo einsetzt und so,
- 2:53:50das sind halt Themen auch gewesen aus dem Studium.
- 2:53:52Haben wir festgestellt, hättest du dich sparen können.
- 2:53:57Also fürs Studium brauchte ich schon was, es waren auch Abfragen in Klausuren oder sowas.
- 2:54:01Nee, mein ich, genau, fürs Spiel. Nein, übertrieben, aber Caching löst viele Probleme.
- 2:54:06Und ich habe mich gefragt, ob es noch andere Dinge aus der theoretischen Informatik
- 2:54:13so gibt, die ins Spiel eingeflossen sind.
- 2:54:16Also ich frage halt deswegen, weil gerade wenn es um theoretische Informatik
- 2:54:21geht, ist manchmal so die Frage, hä, wofür brauche ich das?
- 2:54:25Vielleicht fragt man sich das im Studium auch mal so hä, warum mache ich das eigentlich und dann,
- 2:54:29wenn jetzt alle zuhören hier alle InformatikstudentInnen die können jetzt aufhorchen
- 2:54:35und sagen also hoffentlich sagst du jetzt gleich irgendwas was total praktisch war, was im Studium,
- 2:54:41drin war und was im Spiel geholfen hat und das dann voll die gute Motivation weiterzumachen.
- 2:54:47Gib mir eine Gedenkmenü.
- 2:54:52Ja, ich hab halt zum Beispiel gedacht, also mir würde das zum Beispiel helfen,
- 2:54:56wüsste ich diese ganzen Sachen,
- 2:54:58dann hätte ich viel bessere Performance gehabt bei meinem Cozy Space Survivors
- 2:55:03Spiel, weil dann hätte ich diesen Binary Spatial Tree eingesetzt und ja, dann.
- 2:55:11Also, ich glaube, einerseits bin ich vielleicht auch blind dafür,
- 2:55:14was ich im Studium gelernt habe, was ich jetzt verwende, weil vieles vielleicht
- 2:55:16auch so ein bisschen automatisch so ein bisschen da ist.
- 2:55:19So, das ist erst mal der erste Punkt. Der zweite Punkt zum Beispiel,
- 2:55:21was gerade mit den BSB-Tree meint, den kenne ich eigentlich nur,
- 2:55:24weil ich mich selber mit Spieleentwicklung befasse neben dem Studium und ich
- 2:55:27dann YouTube-Videos geguckt habe oder Tutorials oder was auch immer und es dann
- 2:55:31halt irgendwann entdeckt habe.
- 2:55:32Und ich weiß, es thematisch im Studium thematisiert wurde.
- 2:55:36Dinge, die schon thematisiert sind, die praktisch waren, Wir haben zum Beispiel
- 2:55:38Pathfinding, ASTAR, also wir haben ASTAR-Algorithmus implementiert im Studium.
- 2:55:42Das haben wir jetzt im Endeffekt nicht verwendet, weil wir ein Plugin dafür
- 2:55:45verwendet haben, aber das hätte man selber implementieren können.
- 2:55:49Und sonst, ich finde es schwierig. Ich habe das Gefühl, die meisten Sachen,
- 2:55:52die ich jetzt eigentlich verwende
- 2:55:53oder aktiv sind, habe ich mir mehr oder weniger selber beigebracht.
- 2:55:57Vieles würde ich aber, also gerade aus dem Bereich der Mathematik,
- 2:56:02würde ich sagen, sind es eigentlich so ein bisschen die Basics,
- 2:56:04was weiß ich, Dreisatz, Prozentrechnung, bla bla bla. Klar, die braucht man
- 2:56:07auf jeden Fall alle und die hat man hoffentlich auch ein bisschen im Studium.
- 2:56:09Und wenn man auch in Richtung Shader gehen möchte oder auch vielleicht in 3D-Programmierung,
- 2:56:14auch lineare Algebra, also was du vorhin schon mal grob hattest,
- 2:56:18Rotation oder du hast irgendwie eine Matrix und dann multiplizierst du mit der
- 2:56:21Matrix und dann verhält sich dieses Objekt so und so oder ich fliege in diese
- 2:56:25Richtung, gib mir den orthogonalen Vektor davon oder so ein Zeug.
- 2:56:29Das finde ich relativ wichtig, wurde aber halt sehr theoretisch auch im Studium angegangen.
- 2:56:35Aber ein grundlegendes Verständnis dafür ist relativ wichtig aus meiner Sicht
- 2:56:39für die Spielentwicklung.
- 2:56:42Und sonst sind es so, eine Sache habe ich sehr krass im Kopf,
- 2:56:46ist Lerb, Linear Interpolation, ist like Goldstandard, kannst du für fast alles
- 2:56:52verwendet. Du willst was rotieren, nimm Lerb.
- 2:56:53Du willst was von A nach B wegen, nimm Lerb. Du willst, dass irgendwas über
- 2:56:56eine Zeit passiert, nimm Lerb.
- 2:56:57Und das hatten wir zumindest im Studium so ein bisschen.
- 2:57:00Und war für mich damals, als ich mein erstes Spiel gemacht hatte,
- 2:57:02das war ein sehr kleines Spiel, ich habe überall Lerb verwendet.
- 2:57:05Und das habe ich auf jeden Fall im Studium kennengelernt. Ja.
- 2:57:09Und ja. Ja, also ich kann gerade nicht so viel leider rezitieren,
- 2:57:13was ich glaube ich aktiv im Studium hatte, was noch Verwendung findet.
- 2:57:16Ja, ich muss natürlich sagen, du hast natürlich das mathematische Grundkenntnis
- 2:57:20dann oder mehr als Grundkenntnis, um dich auch sehr schnell in Dinge einzuarbeiten.
- 2:57:24Wie ich gesagt habe, ich habe das nicht zum Laufen bekommen,
- 2:57:27diesen BSP-Tree, aber du hättest es garantiert hinbekommen.
- 2:57:30Zum Thema LURP übrigens, also das ist die lineare Interpellation und da gibt
- 2:57:34es noch einen sehr lustigen anderen Begriff, das ist SLURP. Das klingt einfach
- 2:57:37lustig, wenn man es sagt.
- 2:57:39Und das ist tatsächlich eine Interpretation, wo wirklich rotiert wird.
- 2:57:43Das ist ganz interessant für
- 2:57:44Vektoren, damit die auch korrekt rotiert werden und nicht irgendwie ...
- 2:57:48Nicht, dass sie einmal kurz verschwinden und plötzlich auf der anderen Seite
- 2:57:51wieder auftauchen oder so.
- 2:57:52Ja, genau, nicht irgendwie gestaucht werden, wenn man sie da rumschwubbelt.
- 2:57:57Ich wollte eigentlich vorhin überleiten, das habe ich ganz vergessen,
- 2:58:00und zwar, als wir über die Tools gesprochen haben.
- 2:58:02Genau, da habe ich ja gefragt, was habt ihr noch für Tools entwickelt?
- 2:58:04Und da gibt es ein Tool, da muss ich sagen, Das hat mich am meisten beeindruckt
- 2:58:08und zwar habt ihr ein saugeiles Feedback- und Bug-Reporting-Tool geschrieben.
- 2:58:16Und das ist so toll, da habe ich gedacht, also für jemand, also für ein Team,
- 2:58:22was eigentlich vorher gar keine Erfahrung hatte mit Spielentwicklung, ist das,
- 2:58:26also da hätte ich gesagt, okay, die haben schon irgendwie seit 10,
- 2:58:2915 Jahren Spiele gemacht und die wissen, was für ein Pain es ist,
- 2:58:32so ein Tool nicht zu haben.
- 2:58:34Und deswegen haben sie es gebaut. Ich finde das total beeindruckend,
- 2:58:36dass ihr das gebaut habt.
- 2:58:38Also diese Weitsicht dafür einfach ist schon, wir hatten das nicht überlegt.
- 2:58:42Wir können gleich dazukommen, was es genau damit auf sich hat.
- 2:58:45Aber genau, also ich glaube im Großen und Ganzen ist fast, nicht alle Tools,
- 2:58:50aber viele von den Tools und viel von dem, wo du meinst, das Weitblick erforderlich
- 2:58:54von Chris der hat irgendwie, weiß ich,
- 2:58:56glaube, wenn er seine Augen schließt, er funktioniert wie anders und irgendwie
- 2:58:59ist er irgendwie sehr Meter immer weit voraus,
- 2:59:03und ist ganz interessant und ich glaube, vermutlich kommt das initial von ihm,
- 2:59:08aber auch, weil wir vorher auch den Pain in der Entwicklung schon gespürt hatten,
- 2:59:12hey, hier ist irgendwie ein Bug, okay, cool, aber auch aus Erfahrung von zum Beispiel Nebenjobs.
- 2:59:15Zum Beispiel Johannes hat im Nebenjob gearbeitet und wenn du da ein Bugreport
- 2:59:18oder ein Bugreporten wolltest, musstest du manuell rangehen,
- 2:59:21deine Logdatei raussuchen und irgendwie anheften und was weiß ich was.
- 2:59:25Und ja, wir haben einfach recht früh festgestellt, dass das wahrscheinlich recht painful wird.
- 2:59:29Initial natürlich nur erstmal für uns in der Entwicklung verwendet.
- 2:59:32Haben dann aber auch schnell festgestellt, wäre es nicht richtig geil,
- 2:59:35wenn Leute das einfach auch verwenden für uns, damit wir einfach,
- 2:59:40ja, und so kam das dann im Endeffekt zustande.
- 2:59:42Hat auch viele Iterationen so ein bisschen hinter sich auch so ein bisschen
- 2:59:46welche Daten mitgesendet werden, welche nicht und wie die Daten dann verarbeitet
- 2:59:49werden, aber unser Ziel war es halt möglichst wenig manuellen Aufwand zu haben
- 2:59:52wenn jemand sich entschließt hey hier ist ein Bug, den ich reporten möchte.
- 2:59:56Genau und um auf das Tool anzugehen das ist einfach saugeil,
- 3:00:01man drückt F2 im Spiel und kann dann einen kleinen Text eingeben und entweder
- 3:00:06Feedback schreiben sagen hey
- 3:00:07das Spiel ist super oder einen Bug senden und was halt so Cooles dabei,
- 3:00:11dass automatisch ein Safe Game erstellt wird und das wird mitgesendet.
- 3:00:16Und es war dann so, dass ich war, ihr habt live gestreamt und ich hatte einen
- 3:00:20Bug, ich habe einfach irgendwas gesagt, ich finde irgendwie die Karte nicht,
- 3:00:24also es gibt da so einen NPC, der verkauft halt Karten und der war aber nicht
- 3:00:28da und dann habe ich gefragt, wo ist denn der?
- 3:00:30Und dann hat Chris gesagt, der ist dort und dort, dann bin ich hingelaufen,
- 3:00:33der war nicht da. Und dann war, glaube ich.
- 3:00:38Ich glaube, Chris hat gesagt, ja, pass auf, mach einfach ein Bug-Report.
- 3:00:42Und dann habe ich kurz das Spiel aufgemacht, habe einfach kurz den Bug-Report
- 3:00:46geschrieben und dann hat in der Sekunde einfach Chris dieses Save-Game dann
- 3:00:51plötzlich geöffnet, live im Stream, was ich eine Sekunde vorher abgeschickt
- 3:00:54habe. Also ich hab's ja noch nicht mal abgeschickt.
- 3:00:56Ich hab einfach nur F2 gerückt im Spiel, hab einen kleinen Text geschrieben
- 3:01:00hier, das ist das mit der Karte, und dann konnte er trotzdem das automatisch
- 3:01:04erstellte Savegame öffnen.
- 3:01:07Konnte dann, also war dann plötzlich in meinem Spiel sozusagen drin,
- 3:01:11hat das Savegame bei sich geladen, konnte dann relativ schnell über die ganze
- 3:01:15Karte sausen mit irgendeinem Cheat-Mode, den ihr da habt.
- 3:01:17Und hat sofort gesehen ... Ach, genau, und das fand ich auch nämlich noch interessant.
- 3:01:22Nicht nur hat er jetzt das Spiel gestartet und ein Savegame geladen und einen
- 3:01:26Cheat-Mode aktiviert, er hat das Savegame in Unity geladen.
- 3:01:30Also er war in der Lage, in Unity da noch alle Variablen zu checken und hat
- 3:01:35superschnell da einfach so klickle-klick hier da geguckt und hat gesehen,
- 3:01:38oh, da ist ein Bug tatsächlich, weil ich habe irgendwas gemacht vorher und dann
- 3:01:43war der NPC einfach nicht da.
- 3:01:44Und das war innerhalb von fünf Minuten, war das gefixt. Und ich fand das total
- 3:01:49auch beeindruckend, dass das in Unity dann geladen werden konnte, das Safe-Game.
- 3:01:55Ich weiß nicht, ob das normal ist oder ob ihr da irgendwas gemacht habt.
- 3:01:59Im Großen und Ganzen, sofern sich das Spiel nicht zu krass im Bild unterscheidet
- 3:02:04vom im Editor, nutzen wir einfach dasselbe Safe-Game-System.
- 3:02:07Äh, und, weil im Editor möchtest du ja auch Save Games laden,
- 3:02:10du willst ja irgendwie dein Progress speichern, du willst ja, und so weiter.
- 3:02:13Im Endeffekt fiel das so ein bisschen automatisch ab, dass man's dort einfach
- 3:02:17auch, also für uns laden konnte.
- 3:02:18Ich weiß nicht, es gibt auch bestimmte Plugins oder so mit Speichern laden,
- 3:02:22da haben wir auch was Eigenes programmiert, ich weiß nicht, wie's bei denen
- 3:02:24aussieht, Unity hat von sich aus jetzt erstmal nichts, was Speichern laden angeht.
- 3:02:28Äh, genau, äh, und ja, das hat sich so ein bisschen, glaub ich,
- 3:02:31so automatisch ergeben damit, das haben wir eigentlich, glaub ich,
- 3:02:34initial gar nicht so geplant, aber ist natürlich so sehr praktisch zu haben.
- 3:02:38Auch zum Beispiel, was weiß ich, manchmal habe ich was, auf meinem eigenen Rechner
- 3:02:41rechts habe ich Steam offen mit Drover, links habe ich Editor offen und dann
- 3:02:44ist auch der Datenexchange relativ flott.
- 3:02:46Ich speichere rechts und kann es links direkt laden, ohne sich schließen muss und so weiter.
- 3:02:50Und das ist schon, ja, schon ziemlich cool auch. Gehe ich schon mit.
- 3:02:53Ey, das ist so cool, das Tool. Und ich finde, das fühlt sich auch so jetzt aus
- 3:02:58meiner Perspektive als Konsument total gut an.
- 3:03:02Also da macht es auch richtig Spaß, irgendwie Feedback zu geben und auch Bugs zu reporten.
- 3:03:06Und da muss man nicht irgendwie, ja, geh halt auf diese Seite.
- 3:03:09Ne, gibt's ja mal, wenn du in
- 3:03:11Houdini zum Beispiel ein Bug-Report machen willst, da musst du dann auf,
- 3:03:15ja, halt gehst ins Forum und sagst du, hier, ich hab einen Bug,
- 3:03:17was soll ich machen, da sagen die hier, da suche du mal die Seite raus und dann
- 3:03:21musst du dort irgendwie so ein Jira-Ding erstellen, also ist kein Jira,
- 3:03:23aber irgendein System und irgendwas eingeben, bla bla und dann vielleicht noch
- 3:03:26was attachen und hier einfach zack drücken,
- 3:03:29wird automatisch Safe Game erstellt, ist so geil, also.
- 3:03:32Ich weiß auch nicht, warum nicht mehr Programme oder Spiele oder Firmen oder
- 3:03:36Software sowas tut, weil ja, weiß ich nicht. Das ist eine gute Frage.
- 3:03:41Und das Coole ist ja, dieses Savegame, was erstellt wird, ist auch nur temporär
- 3:03:44im Hintergrund und unsichtbar. Ich habe nämlich am Anfang gedacht so,
- 3:03:47muss ich vielleicht eins anlegen?
- 3:03:49Also ich hatte erst noch gefragt so, soll ich ein Savegame speichern und euch das dann schicken?
- 3:03:54Und da war die Antwort, nö, wird automatisch gemacht, ist schon eins dabei.
- 3:03:57Okay, krass. Das ist super cool.
- 3:04:01Wir schicken tatsächlich auch nicht nur den, also in dem Moment,
- 3:04:04wo du F2 drückst und auf Absend klickst, wird ein Savegame gemacht und der wird dann mitgeschickt.
- 3:04:07Wir schicken aber auch den zuletzt Autosave mit, weil manchmal ist dann ja der Bug zu spät.
- 3:04:12Du bist ja schon weiter zeitmäßig und der Bug ist ja schon passiert.
- 3:04:16Deswegen versuchen wir beim Autosave, das dann noch mal zu reproduzieren.
- 3:04:21Was aber ganz interessant ist, manchmal ist das leider auch fehlerhaft.
- 3:04:23Zum Beispiel, wenn du in einem Dialog einen F2-Bug-Report machst und wir den
- 3:04:27dann laden, unser Dialogsystem speichert sich quasi nicht korrekterweise.
- 3:04:33Das heißt, wenn du einen Dialog startest, muss er auch zu Ende geführt werden.
- 3:04:35Dazwischen darf eigentlich nicht gespeichert werden, aber das Tool ignoriert das.
- 3:04:38Und wenn wir dann einen Bug davon bekommen, muss uns bewusst sein,
- 3:04:41dass das passieren kann.
- 3:04:42Sonst kann sein, dass das Spiel durch den Bug-Report, zumindest auf unserer
- 3:04:45Seite, nicht für die Seite des Users, kaputt sein kann, wenn wir es einfach laden.
- 3:04:49Und es war in der Mitte eines Dialoges, und dann ist irgendwie alles kaputt.
- 3:04:53Das heißt, da hätten wir vielleicht auch noch was anders machen können.
- 3:04:56Aber das ist so der einzige Edge-Case, wo das manchmal tricky ist.
- 3:04:59Ja, also sehr beeindruckend, find ich toll.
- 3:05:04Überall Einzug erhalten, ja.
- 3:05:05Und vielleicht auf unserer Seite auch nochmal was ganz Schönes.
- 3:05:07Wir schicken ja auch die Log-Datei zum Beispiel mit, die auch oft erstellt wird.
- 3:05:11Und auch ein Screenshot von der Position, wo du dich gerade befindest,
- 3:05:13das wird auch nochmal ein Screenshot gemacht. Das heißt, man kann auch örtlich
- 3:05:15gut schnell einschätzen, wo das ist.
- 3:05:17Zusätzlich schicken wir aber zum Beispiel auch die Kamera-Position mit.
- 3:05:19Das heißt, wir haben ein Tool in Unity. Hey, gehe zu der Position von diesem Bug-Report.
- 3:05:25Und dann bist du auch direkt da. Du musst nicht, wo ist denn das?
- 3:05:27Wo muss ich denn hin? Okay, ich scrolle mal ein bisschen durch die Welt.
- 3:05:29Ist das in dem Chunk? Nee, ist das in dem Chunk? gesagt, schack, du bist halt da.
- 3:05:32Und auch das Laden von dem Save-Game geht recht flott. Die haben alle eine ID
- 3:05:35und in Unity haben wir ein Tool, ein kleines Fenster, da gibt es für die ID-Einklicks
- 3:05:39auf Laden und dann wird es geladen.
- 3:05:41Du musst nicht irgendwie erst noch die Datei runterladen und dann irgendwie
- 3:05:44irgendwo hinkopieren oder so.
- 3:05:46Und das ist schon, macht das Leben sehr angenehm.
- 3:05:49Ja, das war eine Sache, die hat mir auch sehr gut gefallen in X-Rebirth.
- 3:05:54Da war es so, wenn du im Spiel bist und Steuerung C drückst,
- 3:05:57dann wird in die Zwischenablage deine aktuelle Kameraposition und Rotation einfach
- 3:06:01gespeichert und das ist einfach so ein kleiner Text-String, also einfach ein
- 3:06:04paar Zahlen und die konntest du dann super easy in Jira reinpacken,
- 3:06:08wenn du ein Bug-Report machst, kannst du einfach sagen und wenn du diese Zahlenfolge
- 3:06:13mit STRG V ins Spiel gepastet hast, einfach während das Spiel läuft,
- 3:06:16einfach STRG V drücken und wenn es in der Zwischenablage eben so eine,
- 3:06:21Zahleninformation war, dann hat das Spiel ist dann automatisch zu dieser Position
- 3:06:25gesprungen und das war so praktisch,
- 3:06:27weil wenn du so eine Weltraumsimulation, die ist ja wirklich groß,
- 3:06:31und dann hast du so eine Raumstation, die auch ultra groß ist und dann gibt
- 3:06:35es so ein Bugreport wie hier an dieser einen Stelle,
- 3:06:38da ist die Beschriftung auf dem Metall ist irgendwie kaputt,
- 3:06:41dann willst du halt nicht diese Raumstation abfliegen und gucken,
- 3:06:44wo da jetzt was ist und dann kannst du super easy die Position,
- 3:06:47rauskopieren und reinpasten und das war eine echt große Hilfe. Ja.
- 3:06:51Was mich auch interessiert, weil ich habe mich da letztens das erste Mal mit
- 3:06:55Safe Games ein bisschen beschäftigt.
- 3:06:57Das ist ja ganz interessant, wie man eigentlich so eine ganze Welt abspeichert.
- 3:07:00Da wollte ich mal fragen, wie habt ihr das eigentlich gemacht mit Safe Games?
- 3:07:04Also wie wir was speichern?
- 3:07:06Naja, also es ist ja so, also der naive Approach könnte sein,
- 3:07:09man hat so eine Art Management Script und in dem schreibt man manuell irgendwie rein, Pass auf,
- 3:07:16such dir mal alle NPCs raus und speichere mal irgendwie in eine Textdatei von hier aus rein,
- 3:07:25wo die gerade sind.
- 3:07:26Und dann such mal, weiß ich nicht, irgendwelche andere Sachen.
- 3:07:31Also, dass man das alles manuell definiert, was eigentlich überhaupt in so ein Savegame rein soll.
- 3:07:36Weil, also, irgendwie muss man ja sagen, okay, was soll da eigentlich rein?
- 3:07:40Und da muss man es auch wieder auslesen. Und jetzt habe ich ein neues Code-Pattern
- 3:07:46oder Design-Pattern gelernt, dass alle Objekte eine kleine Klasse haben oder eine Methode haben.
- 3:07:54Die auf, es ist schwierig zu schreiben, also jedes Objekt weiß sozusagen,
- 3:07:58was es abspeichern möchte von sich.
- 3:08:00Also zum Beispiel reicht vielleicht da bei einem Objekt, dass nur die Position
- 3:08:04gespeichert werden soll und nicht irgendwie noch andere Informationen wie die
- 3:08:08Lebenspunkte oder so, weil die einfach, weiß ich nicht, von mir aus eh resettet
- 3:08:11werden bei jedem Spielstart oder irgend sowas und es gibt dann ein Event.
- 3:08:15Das feuert man ab. Das ist so wie, hallo, ich möchte gerne, also man sagt damit
- 3:08:19allen Bescheid, wir speichern jetzt.
- 3:08:21Und dann kann jedes Objekt, empfängt dieses Event, hängt seinen eigenen kleinen
- 3:08:27Daten an das Event dran, sozusagen.
- 3:08:30Also ich hoffe, ich beschreibe das korrekt. Also es ist ein bisschen so,
- 3:08:33wie man vorher ein Paket ab schickt, das zu jedem Objekt, jedes Objekt legt dort seine Daten rein,
- 3:08:40die es gerne abgespeichert haben möchte und das Paket kommt dann irgendwann
- 3:08:42wieder zurück zum Hauptmanagement-Skript und dann wird alles,
- 3:08:47was in dem Paket ist, abgespeichert.
- 3:08:48Und das Code-Pattern ist sozusagen dabei, dass es nicht eine zentrale.
- 3:08:56Komponente gibt, die weiß, okay, wenn das ein NPC ist, dann speichere ich die
- 3:09:00und die Daten ab und wenn es eine Kamera ist, dann nehme ich die und die, sondern jedes Objekt,
- 3:09:05hat das in sich definiert und schmeißt einfach in dieses kleine Paket,
- 3:09:08was einmal rumgeht, wie so eine kleine Kirche,
- 3:09:11wie in der Kirche, wenn so die Kollekte eingesammelt wird, schmeißt einfach
- 3:09:14jedes Objekt seine Daten mit rein und irgendwann kommt das kleine Körbchen wieder
- 3:09:19zurück und dann speichert man alles, was da drin ist, ab. Ich hoffe,
- 3:09:22ich habe das einigermaßen ...
- 3:09:24Ja, nee, das ist ... Wir machen es ähnlich.
- 3:09:28Also wir speichern auf jeden Fall nicht alles ab. Wir speichern nur das Notwendigste ab.
- 3:09:32Als Beispiel zum Beispiel, manche spinnen, wenn sie sterben,
- 3:09:35hinterlassen so eine Giftpfütze auf dem Boden. Wenn du speichern würdest und
- 3:09:37lädst, dann wäre die dann noch weg.
- 3:09:39Oder du schießt gerade ein Energieprojektil ab oder ein Pfeil und du speicherst
- 3:09:43und lädst, dann ist der Pfeil da auch nicht mehr.
- 3:09:45Ja.
- 3:09:45Also bestimmt, wir speichern nur das Nötigste sozusagen ab, um einfach den Prozess
- 3:09:49des Abspeicherns möglichst schnell zu gestalten und auch das Laden schnell zu
- 3:09:52gestalten, auch dass das Savegame klein ist.
- 3:09:55Das Abspeichern selber, das ist ein Extrascript, das sind Saveables,
- 3:09:59haben wir so genannt bei uns.
- 3:10:00Das ist zum Beispiel ein Saveable Actor und das definiert dann,
- 3:10:02was kann einem im Actor alles gespeichert werden und das ist ähnlich,
- 3:10:05wie du geschrieben hast, das hat eine Methode Load und Save,
- 3:10:07sage ich mal. Wenn man ein Load aufgerufen wird, dann weiß es,
- 3:10:11es bekommt seine Daten, es bekommt sein eigenes individuelles,
- 3:10:13bei uns ist es ein bisschen anders.
- 3:10:14Es gibt dieses große Paket, was bei dir rumgereicht wurde.
- 3:10:18Das gibt es bei uns sozusagen nicht. Es gibt bei uns einen Raum,
- 3:10:20wo alle Pakete drin liegen, um so als eine Metapher zu bleiben.
- 3:10:24Und wenn safe und laut aufgerufen wird, geht jemand rum und bringt jedem Objekt
- 3:10:29ein kleines Subpaket aus dem Raum, was für ihn relevant ist.
- 3:10:32Und er kann dann doch etwas hineinlegen oder etwas auslesen und genau.
- 3:10:37Aber die Objekte können auch von sich aus Anfragen machen an den Raum und sagen,
- 3:10:41ich möchte jetzt unabhängig, ob du jetzt speicherst, nicht, wenn das nächste
- 3:10:43Mal gespeichert werden würde, dann update mal bitte mein Paket.
- 3:10:46Also, update jetzt mein Paket, damit brauche ich es später nicht mehr, sozusagen.
- 3:10:50Genau, diese Events haben wir trotzdem, aber die meisten Objekte,
- 3:10:52zumindest beim Speicherevent, tun selber nichts mehr, weil sie dann schon Sachen
- 3:10:56in ihr Paket legen, wenn eine Veränderung stattfindet. Ah, okay.
- 3:11:00Das machen wir deswegen, weil, lass mich kurz überlegen, wir haben,
- 3:11:05das ist eigentlich da nicht mehr relevant gewesen.
- 3:11:07Wir hatten früher, oder ist das relevant?
- 3:11:10Doch, ja, genau. Und zwar, wir haben jetzt Chunks und Chunks werden rausgeladen.
- 3:11:14Und Objekte, die in einem Chunk liegen, wollen ja aber auch gespeichert werden.
- 3:11:17Zum Beispiel, ich töte einen Ripper in einem Chunk.
- 3:11:20Das ist jetzt ein doofes Beispiel, weil Ripper werden eigentlich anders gespeichert,
- 3:11:22aber wir nehmen mal an, der Ripper ist in diesem Chunk und der Chunk wird entladen,
- 3:11:25also wird auch der Ripper rausgeladen.
- 3:11:27Und danach speichere ich, Aber ich habe den Ripper vorher getötet.
- 3:11:30Und jetzt bekommt der tote Ripper, der nicht mehr existent ist,
- 3:11:33ein Event, hey, speicher dich mal. Und das geht ja nicht.
- 3:11:35Also muss der Ripper ja schon, bevor er gespeichert wird, ihm Bescheid sagen,
- 3:11:39ich bin jetzt tot, ich bin jetzt lebendig, ich habe so und so viel Lebensenergie.
- 3:11:42Und deswegen verweitet jedes Objekt selber von sich aus sozusagen,
- 3:11:45wann es welche Daten bereits in die Kiste legt, für den Fall,
- 3:11:49dass gespeichert wird, dass sie auch up to date sind.
- 3:11:51Genau. Aber sonst nutzt man ein recht ähnliches Pattern eigentlich.
- 3:11:54Das ist natürlich interessant, wieder so ein Spezialfall mit,
- 3:11:58wenn es dann um Streaming geht.
- 3:12:00Aber das, okay, das heißt aber ganz am Anfang, ganz, ganz am Anfang,
- 3:12:04habe ich ja dieses Beispiel aufgemacht mit, was ist denn mit einem NPC,
- 3:12:07der durch die Welt läuft?
- 3:12:08Da hast du gesagt, es gibt dann trotzdem noch so ein temporäres Objekt, was immer noch da ist.
- 3:12:12Aber das gilt dann nicht jetzt, wenn wir über diesen Ripper reden.
- 3:12:16Der ist halt weg, wenn der Chunk entladen wird.
- 3:12:18Deswegen, ich meine, Ripper ist ein blödes Beispiel. der ist auch schon, auch global vorhanden.
- 3:12:24Deswegen meine ich gerade, wir nehmen jetzt mal an, er lege in einem Chunk gut
- 3:12:27er eigentlich nicht, der ist eigentlich auch global drin mit diesem Nebenobjekt.
- 3:12:30Aber auch in dem Fall passiert das ja auch, weil dieser Ripper wird irgendwann
- 3:12:33zu einem Placeholder-Ripper und wenn der echte Ripper tot ist und der zum Placeholder-Ripper
- 3:12:38wird und wir würden dann erspeichern, dann erst Sachen in den Karton legen,
- 3:12:42dann wüssten wir ja gar nicht, ist der Ripper jetzt tot oder nicht sozusagen.
- 3:12:45Deswegen in dem Moment, wo er auch hin und her swapt zwischen seiner Fake-Referenz
- 3:12:49und dem Echten quasi, legen wir in der Regel auch wieder Sachen schon ab oder
- 3:12:52auch wenn er bereits Lebensergie verloren hat, unabhängig davon,
- 3:12:55ob er jetzt tot ist oder nicht.
- 3:12:57Aber wenn du die ganzen Status Stati ähnlich hast, wenn der rausgeladen ist,
- 3:13:01warum hast du denn überhaupt noch ein temporäres Objekt?
- 3:13:04Ich meine, im Endeffekt ist es auch wieder dem gemeinsamen System geschuldet.
- 3:13:08Es liegt primär daran, dass NPCs sich durch die Welt bewegen.
- 3:13:11Und sowohl Gegner als auch unsere NPCs sind beides Ektoren bei uns im Spiel
- 3:13:14und deswegen laufen sie einfach über dasselbe System.
- 3:13:17Aber ja, eigentlich bräuchte man das dann da nicht.
- 3:13:20Aber der Vorständigkeit halber ist es dann trotzdem da. Es kann auch zum Beispiel
- 3:13:23sein, du tötest den Ripper, er ist eigentlich an der Position 10-10 und du kitest
- 3:13:28ihn durch die ganze Welt auf 1000-1000 und tötest ihn dann dort,
- 3:13:31dann müssten wir ja trotzdem
- 3:13:32nochmal Daten abspeichern, wo ist der jetzt eigentlich konkret.
- 3:13:35Und er könnte sich vielleicht auch entscheiden, auch wenn er dann zurückzuhst
- 3:13:39auf 10-10, du hast ihn noch nicht getötet, dann würde er, glaube ich,
- 3:13:42auch wieder zurücktingeln auf 10-10 mit der Zeit.
- 3:13:45Ich habe übrigens sehr oft versucht, Gegner wegzuziehen. Ich habe Babsi sehr
- 3:13:51lieben gelernt, weil Babsi ist eine Jägerin, die da rumsteht und ich habe versucht, möglichst viele,
- 3:13:57böse kleine Viecher zu ihr zu ziehen, damit sie die für mich umhaut.
- 3:14:01Aber irgendwann drehen die um.
- 3:14:04Also man kann die gar nicht über die gesamte Map mitzern. Ja, leider.
- 3:14:08Zu einem früheren Zeitpunkt ging das mal, wir hatten das dann irgendwann so
- 3:14:11ein bisschen ausgebaut, aber ja.
- 3:14:13Ja, ich habe mich auch noch gefragt, genau, Cutscenes. Das ist auch nochmal so ein Tool-Ding.
- 3:14:20Ein bisschen, ja.
- 3:14:21Habt ihr da auch ganz viel selbst programmiert? Oder gab es da irgendwelche coolen,
- 3:14:28Also irgendwelche Timelines, wo man einfach sagen kann, okay,
- 3:14:31NPC dahin, du dahin, dann Dialog, dies und das.
- 3:14:34Weil das ist ja durchaus kompliziert. Also man muss ja sagen,
- 3:14:39erstens, Player-Kontrolle geht weg.
- 3:14:42Zweitens, Kamera wird jetzt übernommen und wird jetzt soft irgendwo anders hingeschoben,
- 3:14:49damit man dort, weiß ich nicht, eben, ja, also dort, wo eben die Cutscene stattfinden soll.
- 3:14:53Dann, verschiedene NPCs laufen von ihrer Position zu der Position,
- 3:14:59dann gibt es vielleicht eine kurze Pause,
- 3:15:01dann startet jemand mit dem Sprechen, dann muss ja jemand anders darauf reagieren und so.
- 3:15:09Also, da ist ja schon eine ganze Menge, was da so nacheinander abläuft.
- 3:15:13Und ich frage mich, wie das definiert und gestaltet wurde, ob es da irgendwie
- 3:15:18Unity-Timeline gibt, ob ihr das irgendwie alles geschrieben habt.
- 3:15:21Also Unity hat so ein Timeline-Tool. Das haben wir aber nicht verwendet.
- 3:15:29Wir haben es, glaube ich, initial mal damit angefangen. Aber es hatte irgendwelche
- 3:15:32Probleme, an die ich mich nicht erinnere, weil es zu viele Jahre zurückliegt.
- 3:15:36Die meisten Bedingungen, die du gerade schon meinst, wir hatten,
- 3:15:38das Spiel pausiert, die Player-Kontrolle ist weg oder was auch immer,
- 3:15:42das hatten wir eigentlich alles schon so übers Dialogsystem eh,
- 3:15:45weil du möchtest ja auch nicht, dass der Spieler sich im Dialogsystem bewegt.
- 3:15:48Oder du möchtest, dass der NPC der Rede von der Kamera fokussiert
- 3:15:51wird und deshalb haben wir unser cutscene system quasi eigentlich in das dialogsystem
- 3:15:55integriert in diesem dialog tree gibt es da eine knoten der nennt sich cutscene
- 3:15:58knoten und wenn der traversiert wird also wenn der aufgerufen wird dann weiß
- 3:16:03dieser knoten was passiert und dieser knoten ist im großen ganzen wir haben
- 3:16:06es recht simpel gehalten es sind einfach quasi kleine.
- 3:16:11Die zum Beispiel sagen, alles klar, geh von A nach B und mehr tut das Skript nicht.
- 3:16:14Und diese Skripte werden dann aber gescheduled quasi und um dann irgendwas Komplexes darzustellen.
- 3:16:19Warte eine Sekunde, setze eine Variable, trigger irgendeinen Effekt.
- 3:16:24Aber jedes Skript an sich ist relativ klein, aber es wird sozusagen so ein bisschen
- 3:16:28choreografiert oder gescheduled bei diesem Knoten.
- 3:16:30Man kann auch Dinge so ein bisschen parallel schalten und sequenziell schalten.
- 3:16:34Aber es ist nicht so richtig ein Tool. Wir nutzen eigentlich im Großen und Ganzen
- 3:16:37eigentlich nur den Default-Unity-Inspektor, um diese ganzen Sachen zu definieren.
- 3:16:41Ist auch so im Nachhinein so ein bisschen eine kleine Schwachstelle,
- 3:16:43weil wir haben schon einige Cutscenes, die recht komplex und auch lang sind.
- 3:16:47Und was da immer sehr problemlos ist, und da wäre Timelines eigentlich cool
- 3:16:50gewesen, da hätte man vielleicht nochmal, ich gehe nochmal kurz zurück,
- 3:16:52ich pass das nochmal an, lass das nochmal spielen.
- 3:16:54Und bei uns war es so, eine Cutscene ist so ein One-Shot. Also wenn irgendwas
- 3:16:57an der Cutscene nicht gefallen hat, dann musst du das Spiel beenden,
- 3:16:59du musst das Spiel laden, du musst die Cutscen komplett von vorne beginnen,
- 3:17:02um dann diese eine Sache irgendwo in der Mitte zu editieren oder so was.
- 3:17:06Oder um dann noch mal zu gucken, ob es dann besser ist.
- 3:17:08Und ich hab dann irgendwann angefangen, mit OBS mir die Cutscen aufzunehmen,
- 3:17:11damit ich dort wenigstens so ein bisschen Timeline-mäßig mir das noch mal angucken
- 3:17:14kann, wie es eigentlich konkret war.
- 3:17:15Aber das Editieren an sich war sehr ...
- 3:17:18Das ist auf jeden Fall ein Punkt, den wir wahrscheinlich für das nächste Projekt
- 3:17:21auch noch mal verbessern wollen, wenn wir weiterhin so viele Cutscenes haben werden.
- 3:17:24Ja, okay.
- 3:17:26Aber es ist eigentlich relativ simpel gestaltet.
- 3:17:29Aber, okay, aber das heißt, es muss irgendwo eine zentrale Cutscene-Datei geben
- 3:17:35oder irgendeine Struktur, wo ich dann sage, führe bei Sekunde 0 dieses Skript
- 3:17:41aus und das schiebt die Kamera irgendwo hin.
- 3:17:43Und dann muss irgendwo stehen, fünf Sekunden später starte bitte das Skript
- 3:17:48für NPC1, läuft auf Position XY.
- 3:17:52Also irgendwo muss ja definiert sein, ja, irgendwo muss die Timeline ja definiert
- 3:17:56sein, auch wenn es keine visuelle gibt, sozusagen.
- 3:17:58Also es ist, ähm, es kommt so ein bisschen ...
- 3:18:03Zufällig, also beschreibe ich das? Also im großen Ganzen sind es diese Skripte,
- 3:18:07was ich meinte, die sketcheln sich ein und dein Skript sagt irgendwann,
- 3:18:10also sagen wir, zuerst kommt das Skript gehe von A nach B.
- 3:18:13Das sketchelt sich jetzt ein, das wird jetzt aufgerufen. Wie lange das Skript
- 3:18:17jetzt eigentlich läuft, das weiß das Skript an sich nicht.
- 3:18:19Zum Beispiel, wenn ich von A nach B gehe und es ist zehn Pixel entfernt,
- 3:18:23dann brauche ich vielleicht eine halbe Sekunde.
- 3:18:25Aber es weiß nicht selber, ich brauche eine halbe Sekunde.
- 3:18:28Und wenn das Skript durch ist, dann kommt das nächste Skript.
- 3:18:30Und so erstellt sich implizit eine Timeline, weil die Skripte von sich heraus
- 3:18:35einfach Dinge für eine gewisse Zeit tun.
- 3:18:37Aber es ist nicht quasi gescheduled im Sinne von bei Sekunde 5 passiert das,
- 3:18:41bei Sekunde 10 passiert das, sondern es ist so, es schiebt sich selber so ein bisschen zurecht.
- 3:18:45Aber wie kannst du dann drei in PCs gleichzeitig irgendwo hinlaufen lassen?
- 3:18:49Weil da musst du ja parallel drei Skripte starten.
- 3:18:52Genau, wir haben zwei so Hauptskripte, also es gibt einmal eine Sequenz,
- 3:18:57das ist das, was ich gerade gemeint habe, es passiert A, dann B,
- 3:18:59dann C, dann D und es gibt Parallel.
- 3:19:01Und wenn das halt aufgerufen wird, dann sind es im Endeffekt wie zwei Einzelsequenzen
- 3:19:05oder mehrere Einzelsequenzen, die dann ihr Part für sich jeweils tun,
- 3:19:09die dann aber zeitgleich abgespielt werden,
- 3:19:12weil sie von dem Parallel-Knoten oder nicht Knoten, Skript aufgerufen wurden.
- 3:19:16Und dann muss das System automatisch so lange warten, bevor das nächste gestartet
- 3:19:20wird, wie das längste Skript in diesem parallelen Block ist, oder?
- 3:19:24Weil wenn du jetzt ein Skript hast, was quasi eine Sekunde dauert und das andere
- 3:19:28drei und das andere vier.
- 3:19:29Dann… Ja, ich glaube, ich bin mir nicht hundertprozentig sicher,
- 3:19:32aber ja, ich glaube, das parallele Skript ist erst dann fertig,
- 3:19:35wenn alle Subskripte durch sind.
- 3:19:36Aha.
- 3:19:37Genau. Ja, also war manchmal tatsächlich auch Timing manchmal ein bisschen nervig,
- 3:19:40weil angenommen, du fügst am Anfang irgendwas ein bisschen ein,
- 3:19:43dann verschiebt sich alles nachfolgend.
- 3:19:45Und dann musst du manchmal Timings hinterher nochmal ein bisschen reduzieren,
- 3:19:47damit es dann wieder eigentlich auf dem eigentlichen Punkt liegt,
- 3:19:49wo es eigentlich liegen sollte.
- 3:19:51Da ist es manchmal schöner, von Anfang an direkt Sachen parallel zu schalten,
- 3:19:55weil dann kannst du auf dem Parallelstrang sagen, warte fünf Sekunden und dann
- 3:19:58tue etwas, was dann sozusagen identisch ist zu tue bei Sekunde fünf etwas.
- 3:20:02Und dann haben wir so ein bisschen baustellmäßig. Das hat sich ein bisschen
- 3:20:04angefühlt wie Lego, so konnte man so ein bisschen kreativ Dinge zusammenstöpseln.
- 3:20:09Okay. So, ich gucke gerade, die Liste ist sogar noch ein bisschen lang,
- 3:20:13aber ich glaube, wir müssen langsam mal zum Ende kommen.
- 3:20:16Das ist okay.
- 3:20:16Ich hatte nur noch eine Frage, die ich sehr spannend fände, weil ich die überraschend komplex fand.
- 3:20:25Und zwar die, so was, wie ihr verhindert, dass man aus Versehen mal NPCs tötet
- 3:20:32oder haut, wenn man irgendwie mit der Waffe drum ist.
- 3:20:35Und du kannst natürlich dann auch, wenn du jetzt irgendwie in der Liste noch
- 3:20:38Sachen siehst, wo du denkst, boah, das müssen wir aber auch noch erwähnen,
- 3:20:41dann kannst du auch gern noch mal sagen, also es gibt natürlich schon noch interessante
- 3:20:47Sachen, aber ja, keine Ahnung.
- 3:20:51Wir haben jetzt schon auch wieder über drei Stunden gequatscht und es ist immer
- 3:20:54noch nicht fertig, über dieses Spiel zu sprechen.
- 3:20:58Weil was zum Beispiel super spannend ist, ist auch, ihr habt dieses Raumfading,
- 3:21:02also dass man, wenn man in einer Höhle ist, dass man nicht die gesamte Höhle
- 3:21:05die ganze Zeit sieht, sondern dass das so ein bisschen, ist nicht wie Sichtlinien,
- 3:21:08aber dass man halt so den nächsten Höhlenbereich nicht sieht.
- 3:21:13Und so eine Sache, da habe ich mich natürlich auch gefragt, wie ist das denn
- 3:21:16wohl definiert und gemacht und so.
- 3:21:18Aber ich wollte jetzt eigentlich auf was anderes hinaus. Genau,
- 3:21:21und zwar es gibt ja freundliche und feindliche Entitäten dieser Welt.
- 3:21:28Bei manchen kann das auch wechseln, aber,
- 3:21:31Genau, es gibt nämlich verschiedene States von NPCs und ich habe mich da gefragt,
- 3:21:38ob das kompliziert war, das alles unter einen Hut zu bringen.
- 3:21:42Also nur mal ein Beispiel, es gibt zum Beispiel den Fall, ich greife eine Person
- 3:21:45an und plötzlich sehen alle drumherumstehenden, hey, da greift unsere Freundin an,
- 3:21:55jetzt hauen wir denen alle aufs Maul und dann stürmen die alle auf mich los
- 3:21:58und wollen mich umhauen.
- 3:22:00Es gibt aber dieselbe Situation auch und dann sagen die anderen nur ohne Schlägerei und gucken einfach zu.
- 3:22:07Und das sind ja schon mal, also die Aktion ist die gleiche, ich greife jemanden
- 3:22:11an, aber die Reaktion der anderen NPCs ist anders.
- 3:22:15Dann habe ich mich auch gefragt, wie ist es denn, wenn ich gerade im Kampf mit
- 3:22:18einem Monster bin, aber aus Versehen einen NPC treffe?
- 3:22:21Da muss ja irgendwie gesagt werden, ja, das war nicht so gemeint.
- 3:22:27Und ich habe mich halt gefragt, wie dieses System funktioniert oder ob das vielleicht
- 3:22:31viel einfacher ist, als ich mir das vorstelle.
- 3:22:32Aber ich stelle es mir irgendwie kompliziert vor, dann genau zu wissen,
- 3:22:36wann dürfen NPCs feindselig werden und wann bleiben sie freundlich und wann
- 3:22:42reagieren die anderen NPCs böse oder gucken nur zu oder Da.
- 3:22:46Muss ich auf jeden Fall auch einmal
- 3:22:47vorweg, das sind alles so ein bisschen Systeme aus Johannes-Bereich.
- 3:22:50Also der könnte da auf jeden Fall auch wieder ein bisschen deutlich besser antworten.
- 3:22:53Aber im Großen und Ganzen ist jeder NPC ist halt einer Fraktion zugehörig.
- 3:22:58Das müssen nicht unbedingt die Fraktionen sein, wie sie auch im Spiel sind.
- 3:23:00Es kann so Subfraktionen geben, wie zum Beispiel, okay, Banditen sind auch im Spiel.
- 3:23:04Im Großen und Ganzen passt das schon eigentlich auf die Fraktion auch im Spiel.
- 3:23:07Also Nemeton, Ruinlager, Banditen.
- 3:23:09Es gibt aber auch Neutral, also Leute, die so zu nichts irgendwie dazugehören.
- 3:23:13Und die Definition, ob sie jetzt jubeln oder nicht jubeln. Nee,
- 3:23:16doch, das gibt ... Warte, ich muss kurz gucken.
- 3:23:19Also, ja ...
- 3:23:20Genau, ich glaube nämlich in der Mine, es gibt so eine Mine und ich glaube,
- 3:23:24da war einer und der hat mich gehauen und dann sagen die anderen nur,
- 3:23:28oder ich habe den gehauen, na und dann gucken die anderen nur zu.
- 3:23:31Ja, ja. Nee, genau, genau. Also wir haben in der Mine zum Beispiel die Wachen
- 3:23:35und die Hauer selber, sind zwei verschiedene Factions.
- 3:23:37Und die Wachen würden einander helfen, wenn jemand angegriffen werden würde.
- 3:23:42Wenn man jetzt aber, also die Hauer sind die Miner sozusagen,
- 3:23:45die helfen sich nicht gegenseitig, auch untereinander nicht.
- 3:23:48Das heißt, wenn ich jetzt jemanden, der Hauer angreife oder Miner angreife,
- 3:23:52dann kommen die anderen nicht zur Hilfe.
- 3:23:54Die können, glaube ich, nochmal explizit überschrieben werden,
- 3:23:58bei zum Beispiel, die beiden sind befreundet, deswegen helfen die sich doch,
- 3:24:01ob du deren Grundfraktion das nicht sagt.
- 3:24:05Genau auf die Art und Weise ist das im Großen und Ganzen definiert.
- 3:24:08Und wie das funktioniert ist, soweit ich weiß, wenn du halt einen der,
- 3:24:12also ein Kampf ist ja schon was Explizites bei uns, also du kannst nicht jemanden
- 3:24:15zufällig treffen oder hauen.
- 3:24:17Du musst da deine Waffe ziehen, zu ihm hingehen und da kommt eine kleine Bar,
- 3:24:19die sich füllt und erst wenn sie voll gefüllt ist und davor nicht abgebrochen
- 3:24:22ist, erst dann kämpfst du aktiv gegen den.
- 3:24:25Deswegen gibt es zum Beispiel diesen Case eigentlich mit Gegnern,
- 3:24:28nicht dass du irgendwie zufällig einen NPC triffst. Kann es trotzdem gehen.
- 3:24:31Nee, eigentlich nicht, eigentlich nicht.
- 3:24:33Warte, jetzt überlege ich gerade. Was für eine Bar? Ich weiß nicht,
- 3:24:37ob mir das aufgefallen ist.
- 3:24:39Also wenn du mit einer gezogenen Waffe an einen freundlichen NPC herangehst,
- 3:24:42dann kriegt er ein rotes Outline.
- 3:24:44Ähnlich wie wenn du mit ihm reden würdest, ist es weiß, aber dann ist es halt
- 3:24:46rot. Und dann musst du Linksklick gedrückt halten oder Angriff gedrückt halten.
- 3:24:49Dann lädt sich diese Bar. Und wenn die dann voll ist, dann schlägst du erstens zu.
- 3:24:53Und zweitens hast du dann eine Rauferei mit ihm initiiert. Und das passiert
- 3:24:56eigentlich nicht aus Versehen im Kampfgeschehen.
- 3:24:59Ja, ist schon zu lange her. Habe ich mich jetzt gar nicht mit dran erinnert.
- 3:25:05Genau, aber wenn das dann passiert, wirft der NPC, soweit ich weiß, ein kleines Event.
- 3:25:09Jo, ich wurde angegriffen. Das ist im Endeffekt wie so ein Hit-Kollider, der drumherum ist.
- 3:25:12Und alle, die das sozusagen hören, die würden sich dann halt entweder auf die
- 3:25:15positive oder auf die negative Art und Weise quasi mit einmischen.
- 3:25:19Und das System aber dahinter ist auch, was die sagen und so weiter und wo sie
- 3:25:23sich auch hinstellen und so weiter.
- 3:25:24Das ist alles, das kann ich nicht gut beantworten.
- 3:25:28Aber wieder ein Beispiel für ein doch wieder sehr komplexes System,
- 3:25:32weil es gibt ja noch die neutrale Art, ich gucke einfach nur zu und sage, cool, die kloppen sich.
- 3:25:38Und ja, genau, spannend, okay.
- 3:25:42Aber auch da gab es immer mal wieder Probleme, zum Beispiel gibt es,
- 3:25:44du meinst ja, es gibt Leute, die wechseln ihre Fraktion, da gab es zum Beispiel im Taverne jemand,
- 3:25:49der dich übers Ohr hauen will und wenn du denen dann folgst,
- 3:25:52dann wird er von Freund zu Feind, hat aber selber einen Komplizen und während
- 3:25:57du noch befreundet mit ihm bist, aber seinen Komplizen schon haust,
- 3:26:01denkt er nicht, dass das tatsächlich sein Komplize ist und hilft dir dann mit
- 3:26:04ihm seinen eigenen Komplizen zu hauen,
- 3:26:06um dann fünf Sekunden später zu sagen, jo, wir haben dir eine Falle gestellt
- 3:26:09und dann werden sie plötzlich Freunde und sind dir feindlich gegenüber und würden
- 3:26:13dann zusammen auf dich gehen.
- 3:26:14Also es gibt schon auch einige Edge Cases, die wir immer mal wieder abfangen mussten.
- 3:26:19Aber passieren auf jeden Fall witzige Dinge damit.
- 3:26:22Ja, okay. Ja, du, ich weiß nicht, was sagst du denn? Hast du noch etwas,
- 3:26:28was dir vielleicht auf dem Herzenliebe, wo du sagst, boah, das war so cool,
- 3:26:31da müssen wir noch drüber reden?
- 3:26:33Vielleicht ein paar Kleinigkeiten. Die Wasserreflexion fände ich noch ganz interessant.
- 3:26:37Ich weiß nicht, ob du die konkret hier nicht mit drin hattest.
- 3:26:40Meinst du die kleinen ...
- 3:26:41Nee, dass man sich selber im Wasser sieht.
- 3:26:44Ja, erzähl mal.
- 3:26:46Das und Silhouetten von NPCs finde ich sehr interessant, weil beides wirkt voll
- 3:26:50Magic und beides ist ultra trivial.
- 3:26:52Okay, ich will noch kurz untermalen, dass Reflektion in 2D spielen,
- 3:26:58finde ich, sieht man nicht so oft und warte, Divine, wo ist es denn?
- 3:27:04Genau, und auf meinem Blog habe ich nämlich genau das mal zum Thema gemacht,
- 3:27:10weil ich das so toll fand, dass in Divine Divinity, ich poste es hier,
- 3:27:14da hat man das nämlich schon.
- 3:27:15Divine Divinity, das ist hat nichts mit, also ist nicht, ich meine,
- 3:27:19ist nicht Divinity Original Sin, sondern wirklich die beiden Divinity.
- 3:27:22Das erste Spiel von Larian Studios und da, das war nämlich auch 2D und da gibt
- 3:27:27es auch Reflektionen und da wird das Sprite halt irgendwie,
- 3:27:31gemürrert, denke ich mal, und dann aber auch verschwubbelt, dass sich das so
- 3:27:34ein bisschen bewegt und das ist mir damals schon aufgefallen und das hat mir
- 3:27:37sehr gut gefallen, das war in 2013.
- 3:27:40Krass, so alt ist der Artikel schon. Genau, deswegen freue ich mich natürlich,
- 3:27:43dass ihr auch Reflektionen drin habt. Genau, so und jetzt erzähl mal, was ist da die Magic?
- 3:27:49Also im Großen und Ganzen, ich weiß nicht genau, wie Divinity das macht.
- 3:27:52Wir machen es auch nicht perfekt und das sieht man immer mal wieder.
- 3:27:55Wir haben ja ein Kleidungssystem und unser Kackler ist ja, sag ich mal,
- 3:27:59du kannst ihn ja ausziehen und kannst Rüstung A anziehen oder aber auch Helm
- 3:28:03B und Waffe C und kannst ja so ein bisschen mischen und matchen.
- 3:28:07Und das dann in die Reflektion zu gießen, das war ein bisschen tricky,
- 3:28:10weil das soll natürlich auch alles mit in die Reflektion. und am Best-Case hättest
- 3:28:15du eigentlich, sag ich mal, das passiert jetzt dynamisch zur Laufzeit,
- 3:28:19dass du diese Klamotten trägst.
- 3:28:20Also es gibt keinen Sprite-Atlas, der sagt, so ist die Kombination sozusagen.
- 3:28:25Und das heißt, wir rendern das einfach, auch wenn du dir das im Debugger,
- 3:28:27im Rendering-Debugger anguckst, kommt erst Layer A, B, C, D und dann ist dein
- 3:28:31Charakter irgendwann fertig.
- 3:28:32Und genau, im Großen und Ganzen wäre es eigentlich cool gewesen,
- 3:28:36wenn man das in einer Extratextur hatte, um diese Textur einfach extra zu zeichnen,
- 3:28:39also zu dem jeweiligen Zeitpunkt.
- 3:28:41Aber irgendwie hat das nicht so richtig funktioniert, wie ich es mir vorgestellt habe.
- 3:28:44Und was wir eigentlich machen ist, wir erzeugen eine Kopie vom Spieler,
- 3:28:48aber eigentlich nur sein Visual,
- 3:28:50flippen das dann halt auf der Y-Achse, keepen aber seine X-Achse,
- 3:28:54keepen seine Position und ja, dann ist es unter dem Spieler.
- 3:28:58Aber dann siehst du es natürlich immer.
- 3:29:00Das heißt, dann muss man es noch rausmaskieren, dass du es nur im Wasser siehst
- 3:29:03und da kommt wieder das Denzelbuff ans Spiel.
- 3:29:06Und im Endeffekt steht im Stencil-Buffer drin, auch hier wieder übertrieben
- 3:29:09gesagt, wo eine Eins steht, ist eine Reflektion, wo Null steht, ist keine Reflektion.
- 3:29:13Das hat aber gerade, oder andersrum. Und dann wollen wir aber natürlich auch
- 3:29:16im Wasser, ist es ein bisschen transparenter, so ein bisschen ausfaden.
- 3:29:20Und da ist aktuell das Problem, wenn man es einfach nur ausfadet,
- 3:29:24weil du aus mehreren Ebenen bestehst, dann siehst du plötzlich Klamotten oder
- 3:29:28zum Beispiel deine Hautfarbe unter den Klamotten.
- 3:29:31Weil deine Klamotte ist ja semi-transparent
- 3:29:33und deswegen kommt die Haut darunter langsam zu Vorschein.
- 3:29:35Und deswegen werden die Wasserreflektionen bei uns, sind nicht farbtechnisch
- 3:29:40akkurat mit dem eigentlichen Charakter.
- 3:29:44Und um das so ein bisschen zu kombiten, gibt es einen extra Shader,
- 3:29:48der basierend auf der Farbe des Pixels, was ausfadet, verändert es nochmal seine
- 3:29:53Farbe, um so ein bisschen auszumachen.
- 3:29:55Weil zum Beispiel sehr helle Farben fallen sehr stark auf und sehr dunkle Farben
- 3:30:00fallen weniger stark auf.
- 3:30:01Und deswegen fäden wir helle Farben stärker aus als dunkle Farben,
- 3:30:05um das in der Reflektion quasi zu kaschieren, dass die Farben nicht richtig matchen.
- 3:30:11Aber was meinst du jetzt mit Faden? Ich zeige auch gerade mal ein Bild an,
- 3:30:16aber man kann es sich so vorstellen, die Wasserreflektion sieht halt aus wie
- 3:30:20das Original-Sprite, so mit einem drum und dran, nur ein bisschen dunkler.
- 3:30:24So würde ich es jetzt beschreiben.
- 3:30:25Sage ich mal.
- 3:30:27Ich sehe da jetzt aber nicht, also ich sehe da jetzt nicht zum Beispiel,
- 3:30:30dass die Reflexion nach unten hin immer mehr ausfädelt oder sowas.
- 3:30:34Also du siehst schon so eins zu eins ein Spiegelbild eigentlich.
- 3:30:38Also nicht nach unten hin, sondern generell. Also du hast so ganz leicht,
- 3:30:42hier sieht man es auch, glaube ich, weil du hast eine dunkle Rüstung.
- 3:30:44An dunkle Rüstungen fäden weniger aus. Das ist das, was ich vorhin meinte.
- 3:30:48Du hast zum Beispiel im Wasser so kleine Steine, die so ganz leicht andersfarbig
- 3:30:52sind. Und die würden auch ein bisschen durchkommen.
- 3:30:55Ah, okay, also das Spiegelbild an sich ist ein bisschen transparenter.
- 3:30:58Genau, genau. Aber das sieht man jetzt hier wirklich nicht, weil du gerade wirklich
- 3:31:01einen recht dunklen Charakter hier als Beispiel hast. Also sowohl von der Rüstung
- 3:31:04als auch von der Hautfarbe.
- 3:31:06Und das Problem ist, dass es halt nicht ein Sprite ist, sondern es eben aus
- 3:31:10verschiedenen Teilen besteht.
- 3:31:11Genau, genau.
- 3:31:11Also Körper, Haut, darüber dann die ganzen Rüstungsteile. Und jedes davon wird
- 3:31:15ja ein bisschen transparenter.
- 3:31:16Genau, genau, genau.
- 3:31:18Aber sag mal, wäre es nicht möglich gewesen, den Charakter in eine neue Textur
- 3:31:23zu rendern, also zur Laufe Zeit.
- 3:31:25Genau, genau, genau. Das wäre eigentlich das Schönste gewesen,
- 3:31:27dass man sagt, eigentlich zu jedem Zeitpunkt im Spiel, zumindest von den Charakteren,
- 3:31:30die eine Reflektion haben sollen, rendert man das irgendwie nochmal offscreen
- 3:31:33in eine Extra-Textur und zeigt die dann da irgendwie an.
- 3:31:36Aber ich hab das einfach nicht, ich sag, hab ich irgendwie nicht hinbekommen.
- 3:31:40Ich weiß nicht, ob das an Unity liegt oder so. Ich hatte nicht irgendwie das
- 3:31:43Gefühl, dass ich etwas gut einfach offscreen rendern kann, weil sonst hätte
- 3:31:46ich den Charakter irgendwie, weiß ich, teleportiere ich für ein Frame oder für
- 3:31:50x Millisekunden im Frame ins Nirvana,
- 3:31:53dann nehme ich den auf, dann muss ich den aber zurück teleportieren und sowas
- 3:31:57und das war irgendwie alles sehr tricky und sehr unschön.
- 3:32:00Aber das wäre eigentlich der Way to go gewesen. Ja, da gehe ich mit.
- 3:32:03Ah, okay. Ja, krass. Okay, aber dann hast du einfach, genau,
- 3:32:07ist eine Kopie mit allen Layern.
- 3:32:09Das ist natürlich, okay, das sind auch mehrere Drawcalls, ne? Dann?
- 3:32:12Yes.
- 3:32:12Genau. Und dann aber mit dem Spezialshader die Farben so angepasst,
- 3:32:16dass es nicht auffällt, dass da irgendwie die ...
- 3:32:17Es fällt immer noch manchmal auf, wenn du eine bestimmte Kombination von Rüstung
- 3:32:21und Charakter hast, sieht man manchmal, dass die Farben nicht so richtig matchen.
- 3:32:24Du hast jetzt hier ein perfektes Beispiel eigentlich, wo es ganz gut funktioniert.
- 3:32:28Es gibt leider Beispiele, wo es leider nicht so gut funktioniert,
- 3:32:31wo wir auch manchmal immer wieder Bug-Reports bekommen, wo die Leute zum Beispiel
- 3:32:34ihren Oberkörper durch die Rüstung schimmern sehen und sagen,
- 3:32:38mein Charakter, meine Reflektion hat gar keine Klamotten an.
- 3:32:41Und das ist leider nicht so ganz schön. Was auch impliziert aktuell tatsächlich
- 3:32:45ist, dass die Kopie von deinem Charakter dauerhaft unter dir ist,
- 3:32:48selbst wenn du dich nicht in der Nähe von Wasser befindest.
- 3:32:51Was auch noch mal nicht so schön ist, sowohl für die Performance als auch fürs
- 3:32:54Rendering, weil im Endeffekt rendere ich dann sozusagen Dinge ins Nichts,
- 3:32:57aber es muss trotzdem gerendert werden.
- 3:33:00Genau, und da haben wir auch ein paar Optimierungen, aber an sich ist der Ansatz
- 3:33:04tatsächlich recht simpel, also so algorithmisch simpel.
- 3:33:09Ja klar, weil ansonsten müsstest du ja noch detekten, wann du in die Nähe von
- 3:33:14Wasser kommst, weil du kannst das Spiegelbild ja nicht erst anzeigen,
- 3:33:17wenn du im Wasser stehst, weil du kannst ja schon deinen Kopf sozusagen spiegeln
- 3:33:21sehen, während du noch am Ufer stehst.
- 3:33:23Genau, das war auf jeden Fall auch sehr tricky, aber hat auf jeden Fall auch
- 3:33:26einen sehr coolen Effekt.
- 3:33:27Ja, es ist, ja ...
- 3:33:30Auf jeden Fall.
- 3:33:30Weil wir es aber auch wiederum nur für Menschen machen. Wir hatten irgendwann
- 3:33:33mal einen Ansatz, dass wir alles im Wasser reflektieren.
- 3:33:34Also angenommen, da stünde ein Baum nördlich vom Wasser, dass auch der Baum dort reflektiert wird.
- 3:33:39Aber der Ansatz mit diesem wir erzeugen Duplikate und so weiter war da nicht sonderlich sinnvoll.
- 3:33:45Ja, vor allem, weil das ja dann auch für alle Bäume, die auch sehr entfernt wurden.
- 3:33:50Und ich glaube sogar auch, dass Ripper und sowas keine Reflektion haben,
- 3:33:55wenn ich gerade richtig im Kopf habe. Ich glaube, es sind tatsächlich nur Menschen.
- 3:33:57Was ich interessant finde, weil gefühlt fällt das eigentlich niemandem so richtig. Aber obwohl doch.
- 3:34:01Nee, ist mir auch nicht aufgefallen, glaube ich.
- 3:34:03Aber ich bin mir gerade nicht sicher. Vielleicht haben Ripper doch eine Reflexion.
- 3:34:05Die Fliege wäre auch eine Frage.
- 3:34:07Ja, stimmt. Das müsste man ja in deinem GIF eigentlich sehen,
- 3:34:09oder? Die steht ja auf, die hatte, glaube ich, keine.
- 3:34:12Nee, fällt aber auch nicht auf.
- 3:34:14Ja, finde ich ganz spannend irgendwie, dass es nicht auffällt.
- 3:34:16Ja. Ja, cool. Genau, Wasser. Und warte, du hattest noch was anderes.
- 3:34:20Ach, genau. Und zwar die Pixel Outlines.
- 3:34:23Ja, ja, ja.
- 3:34:24Genau.
- 3:34:25Ist im Endeffekt eigentlich genau das selbe. so ein bisschen.
- 3:34:28Eigentlich wäre es schön gewesen, die Textur off-screen zu haben,
- 3:34:31um dann einen Shader zu haben, der dann tatsächlich die echte Outline rendert.
- 3:34:34Hatten wir aber auch nicht.
- 3:34:35Und wir hatten auch super lange, weil jedes Kleidungsstück hat dann seine eigene Outline.
- 3:34:40Zum Beispiel in dem Beispiel, was du hier hast, dann hätte die Haare zwischen
- 3:34:44Kopf und Haare wäre dann eine Outline und zwischen der Waffe,
- 3:34:47die sie in der Hand hat und dem BH und der Hose, überall sind dann weiße Linien plötzlich drin.
- 3:34:51Weil jeder Sprite seine eigene Outline bekommen, weil es wieder aus mehreren
- 3:34:54Layern besteht. Und das war auch sehr lange im Projekt so drin,
- 3:34:56und auch sehr lange in den alten Versionen, die wir online hatten.
- 3:34:59Und da hatte ich auch super viele Ansätze gesucht und der aktuelle Ansatz ist
- 3:35:03auch jetzt gerade wieder, dass man eine Kopie vom NPC oder von was auch immer
- 3:35:07erstellt und dann auch einfach quasi, nee, andersrum.
- 3:35:11Wir erstellen eine Kopie, die rendern wir in komplett weiß, aber hinter, also vor dem Ektor.
- 3:35:17So hast du Ektor die Kopie, die ein weißer Pix, also weißt du, wie ich meine, oder?
- 3:35:22Ist noch nicht gut erklärt. Okay, wir nehmen den NPC, wir duplizieren ihn,
- 3:35:27rendern ihn in komplett weiß und ein Pixel größer im Großen und Ganzen.
- 3:35:32Und der wird hinter, jetzt in dem Fall Cassia gerendert.
- 3:35:35Und dann kommt Cassia eigentlich drüber. Und deswegen hat sie dann quasi eine
- 3:35:39Outline, weil sie in komplett weiß dahinter noch mal existiert.
- 3:35:42Ja, okay, aber warte mal. Aber du sagst das so mit nur einem Pixel größer.
- 3:35:46Aber ist das denn so einfach? Also weil eine richtige schöne Outline,
- 3:35:50um einen Sprite zu machen?
- 3:35:51Also klar, in Photoshop ist es einfach. Das mache ich manuell.
- 3:35:54Da male ich einfach überall, ziehe ich einfach eine Outline manuell lang. Aber im Code, also ...
- 3:35:59In fact, das ist ja im Shader. und wir befinden uns jetzt hier auf Texturebene,
- 3:36:02wenn man das dann quasi rendert.
- 3:36:04Und das ist schon einfach, weil du hast die Auflösung deiner Textur und du sagst
- 3:36:08dann im Endeffekt, jo, ich checke meinen Pixel oben, unten, links,
- 3:36:10rechts, ob irgendein Pixel davon einen Alpha-Wert gesetzt hat.
- 3:36:15Und wenn ja, dann mache ich mich selber einfach weiß.
- 3:36:17Und für alle Pixel, die dann quasi außerhalb der Silhouette sich befinden,
- 3:36:21würde sie sagen, oben, unten, links, rechts ist nichts.
- 3:36:24Also man muss immer so aus der Sicht des eigenen Pixels, das dann gerendert wird, denken.
- 3:36:28Da ist nichts, also bin ich komplett transparent.
- 3:36:30Ja, aber warte mal, im Shader hast du diese Information doch nicht.
- 3:36:33Also, weil wenn ich jetzt im Shader bin, kann ich ja nicht sagen,
- 3:36:37if Pixel neben mir ist red, denn du das ist ja das Problem.
- 3:36:44Also zwar auf der Grafikkarte werden zwar immer zweimal zwei Pixel gerendert,
- 3:36:48aber im Shader habe ich ja immer nur Zugriff auf mich selbst.
- 3:36:50Genau, genau. Und deswegen checke ich für mich selber, also da wird ja eine Textur gerendert.
- 3:36:56Du musst ja die Farbe für deinen eigenen Pixel schon aus der Textur lesen.
- 3:36:59Und deswegen hast du ja in der Regel auch sowas wie, hey, lese die Farbe von
- 3:37:03meiner Position, um mein Pixel zu bekommen.
- 3:37:06Genau.
- 3:37:06Und du könntest aber auch sagen, lese nicht die Farbe, wo ich gerade bin.
- 3:37:08Du hast ja so ein Parameter, also du gibst ja im Endeffekt die UV-Koordinaten an.
- 3:37:12Du kannst auch sagen, gib mir den Pixel auf meiner UV-Koordinate plus ein bisschen
- 3:37:16nach oben, ein bisschen nach unten, ein bisschen nach links und ein bisschen
- 3:37:17nach rechts. Und dieses bisschen, wie viel weiter ich gucke,
- 3:37:20ist einfach die Auflösen der Textur.
- 3:37:23Also beziehungsweise eins durch Texturgröße sozusagen. Und im Endeffekt passiert
- 3:37:28dann das schon im Shader, dass ich sage, alles klar, ich rendere mich selber.
- 3:37:32Und ich gucke aber auch, also ich lese auch aus der Textur oben, unten, links, rechts.
- 3:37:36Im Endeffekt sind es keine If-Abfragen. Im Endeffekt multipliziere ich die Werte,
- 3:37:39um so ein bisschen Ifs zu vermeiden. Aber das ist ein anderes Thema.
- 3:37:41Ah, also du hast einen Vorloop im Shader sozusagen.
- 3:37:43Ja.
- 3:37:44Du machst das viermal im Shader. Okay.
- 3:37:46Genau. beziehungsweise korrekterweise, glaube ich. Ich weiß gar nicht,
- 3:37:49ob ich die Diagonalen auch checke. Ich glaube nicht.
- 3:37:51Es gibt noch eine andere, da habe ich einen alten Artikel von mir,
- 3:37:56da ging es um Outlines, ich kann ja mal ein Video schicken, wie es auch geht, in dem Spiel Move or Die,
- 3:38:06Und wird so gemacht, dass das Sprite für die Outline achtmal gezeichnet wird.
- 3:38:14Und zwar einmal ein bisschen nach links verschoben, einmal ein bisschen nach
- 3:38:17oben, einmal nach rechts, einmal nach unten und dann noch auf die Diagonalen.
- 3:38:20Einfach so ein, in eurem Fall wäre es ein Pixel weiter nach links,
- 3:38:24rechts, oben, unten und so weiter.
- 3:38:25In Move or Die ist es kein Pixelspiel, aber so wurden da die Outlines gefakt.
- 3:38:31Das ist natürlich Overdoor-mäßig nicht so super optimiert, aber funktioniert.
- 3:38:35Ja, ich meine, Mufordai ist, glaube ich, also nicht kleines Spiel,
- 3:38:38aber so, du hast ja eine kleine Stage mit deinen Charakteren und so weiter.
- 3:38:41Und ich glaube, die haben ja keine ganze Open World, die dauerhaft geladen wird
- 3:38:44und so weiter. Ich glaube, da kann man sich sowas schon mal erlauben.
- 3:38:47Aber ja, gibt es ja viele interessante Methoden, Outlines zu machen.
- 3:38:50Auch im 3D ist ja auch oft, dass du deine Vertices irgendwie so ein bisschen,
- 3:38:54aufbläst in verschiedene Himmelsrichtungen oder sowas.
- 3:38:56Genau.
- 3:38:57Aber das klappt halt im 2D leider nicht und deswegen sind das ja ähnliche Ansätze.
- 3:39:01Genau, dazu, ich kann den Artikel auch mal verlinken, der heißt Cell Shading,
- 3:39:06aber der zeigt genau das, dass man eben das Modell, das Mesh sozusagen dupliziert,
- 3:39:12invertiert und anhand der normalen nach außen skaliert und dann kriegt man in 3D eine klassische,
- 3:39:18also das ist wirklich so dieser ganze Oldschool-Trick, um eine Outline in 3D zu machen.
- 3:39:23Ich glaube Borderlands hat da wesentlich andere Techniken und da habe ich tatsächlich
- 3:39:27einen sehr coolen Video letztens gesehen und zwar habe ich nämlich,
- 3:39:32kann ich hier Eigenwerke machen, Ich habe nämlich ein Newsletter jetzt auf Simon schreibt,
- 3:39:35das ist so ein TechArt VFX Newsletter und da habe ich nämlich gerade letztens
- 3:39:38erst, genau hier ist das Video,
- 3:39:41hat jemand nachvollzogen, wie der Death Stranding Scan Effekt gemacht wird und
- 3:39:46da ist auch eine Outline-Technik erklärt,
- 3:39:50die auf Pixelschitter Basis funktioniert und nicht irgendwie hier mit Duplizieren
- 3:39:57von Mech, das ist wirklich old school. Aber ja, genau.
- 3:40:02Verlinke ich euch natürlich auch für alle, die sich da interessieren.
- 3:40:08Schiebe ich definitiv mal in meine Watchlater-Liste bei YouTube.
- 3:40:11Ja, war ein schönes Video. War ein sehr schönes Video, genau.
- 3:40:14Ja, cool. Dann würde ich sagen...
- 3:40:20Können wir mal zum Ende kommen?
- 3:40:23Können wir gerne machen.
- 3:40:26Die Zeit auch verfliegt in so einem Podcast, finde ich sehr spannend.
- 3:40:29Ja, ist krass, oder? Also man kann auch mal vier Stunden quatschen und denkt so, hä?
- 3:40:35Ja, ja, ja, ja.
- 3:40:36Wo ist die Zeit hin? Genau. Ja, du, hast du denn noch etwas,
- 3:40:42was du an die Menschen da draußen geben möchtest, wenn jetzt Leute zuhören?
- 3:40:47Und also Studierende hören hier zu oder Professionals oder also durch die Bank
- 3:40:56einfach weg und weiß ich nicht, vielleicht hast du ja,
- 3:40:59keine Ahnung, vielleicht irgendwas, was dir auf dem Herzen brennt,
- 3:41:02wo du vielleicht denkst, ey, damals als ich studiert habe, hätte ich mir gewünscht,
- 3:41:06dass das mir mal jemand sagt oder irgend sowas.
- 3:41:09Boah, ist natürlich jetzt ein sehr allgemeiner Call, den man alle Menschen da
- 3:41:12so draußen gibt Ich glaube, wenn ich es so möglichst allgemein fassen wollen würde,
- 3:41:17ist es natürlich hey, macht das, worauf ihr Bock habt macht, wofür ihr brennt
- 3:41:21und auch, dass Droh war jetzt entstanden es liegt eigentlich nur darauf,
- 3:41:24dass ich eigentlich während des Studiums eigentlich schon eine ganze Zeit Spielentwicklung
- 3:41:27gemacht habe, aber eigentlich nur so ein bisschen für mich und dann mit anderen
- 3:41:29Teammitgliedern und dann aber kleine Spiele gemacht und Game Gems und ich hatte nie einen Plan,
- 3:41:34dass das hier mal hinfüllen würde, wo es jetzt hingeführt ist und deswegen weiß
- 3:41:37ich, geht euren Hobbys nach, geht euren Leidenschaften nach und wer weiß,
- 3:41:41wo das mal hinführt oder welche Türen es öffnet, welche Menschen ihr kennenlernt
- 3:41:45und was ihr zusammen so für coole Sachen irgendwann mal auf die Beine stellt.
- 3:41:48Ich höre das öfter irgendwie, dass Leute irgendwie Hobbys vielleicht nicht nachgehen,
- 3:41:51weil das bringt ja nichts oder kann ich ja eh nie was mitmachen oder die sich
- 3:41:55da so ein bisschen auch demotivieren lassen oder auch das Hobby nicht mehr als
- 3:41:58Hobby empfinden, sondern dann,
- 3:42:00ich mache das jetzt, um irgendwann Geld zu verdienen und dann macht es aber
- 3:42:03auch irgendwann keinen Spaß mehr oder sowas und sich einfach so ein bisschen
- 3:42:06ja von seinen Leidenschaften leiten lassen.
- 3:42:09Dann aber im Umkehrschluss aber auch, lasst euch nicht zu krass von euren Leidenschaften verleiten.
- 3:42:14Weil es kann auch echt manchmal Spaß an der Sache nehmen oder auch einen sehr
- 3:42:19stressen oder dass man nicht gut schläft oder sowas, wenn man so sehr mit einer
- 3:42:22Sache irgendwie so gefangen ist.
- 3:42:25Dass man auch wenig Platz für andere Sachen hat, auch vielleicht mal für Pause
- 3:42:28oder auch mal ein bisschen, was weiß ich, Sport, gesund ernähren,
- 3:42:31was auch immer, bla bla bla.
- 3:42:32Alles im Maßen, aber lasst euch so im Großen und Ganzen von Leidenschaften leiten.
- 3:42:37Ja gut, vielen Dank für das Schlusswort und vielen Dank, dass du so lange mit
- 3:42:40dabei warst und deine Expertise hier geteilt hast. Das war sehr,
- 3:42:42sehr spannend. Bin gespannt auf das Feedback.
- 3:42:45Ja, ich auch.
- 3:42:46Und ich bin auch gespannt und wünsche euch das Beste für was jetzt kommt als nächstes.
- 3:42:53Ja, bin ich auch sehr gespannt. Dankeschön.
- 3:42:55Just2D, genau, das ist spannend. Also ganz tolles Projekt.
- 3:42:59Habe sehr gerne gespielt. Und ja, also großen Respekt. Es ist wirklich krass.
- 3:43:05Also ich finde es sehr beeindruckend, was ihr da auf die Beine gestellt habt. Ganz, ganz toll. Ja.
- 3:43:12Dankeschön. Ja, ich auch nochmal danke, dass du mich hier hattest,
- 3:43:16gehostet hast quasi, zugehört hast, gute Fragen gestellt hast und auch echt
- 3:43:19für deine Recherche vorher. Also nochmal Respekt, das hatte ich nie so auf dem Schirm.
- 3:43:23Also ich belege jetzt auf Podcaster auf völlig andere Art und Weise,
- 3:43:27wenn jeder mindestens so viel Effort da reinsteckt wie du.
- 3:43:31Ja, also auch Respekt an das, was du tust. Und wie gesagt, ich hatte dich ja
- 3:43:35auch immer mal früher auf dem Schirm und auch so im Studium immer mal wieder
- 3:43:38und finde ich cool, was du tust. und ja.
- 3:43:41Ja, vielen Dank. Ihr habt es sehr einfach gemacht, weil ihr halt so toll dokumentiert
- 3:43:45habt, das ganze Projekt.
- 3:43:46Das war wirklich dann eine Freude, da nachzurecherchieren.
- 3:43:50Das macht es auch einfacher, coole Fragen zu finden.
- 3:43:54Genau, cool. Ja, dann ganz, ganz viel Erfolg für die Zukunft und Tschüssi.
- 3:43:59Mach's gut.