Go to file
Marc Gauch cc16c9f9ec Merge branch 'main' into Bericht 2024-01-11 20:59:24 +01:00
.vscode Documentation 2024-01-11 20:18:30 +01:00
Assets Proper passthroug and hidden anchors 2024-01-11 20:46:32 +01:00
Blender Somewhat working 2023-12-29 19:00:20 +01:00
DEBUG-SERVER heureka 2023-12-14 19:37:24 +01:00
Documentation Added Images & Last text 2024-01-11 20:59:08 +01:00
FreeCAD Shpere, Cleanup 2024-01-06 14:18:35 +01:00
Packages initial from pc 2023-11-16 19:32:56 +01:00
ProjectSettings Proper passthroug and hidden anchors 2024-01-11 20:46:32 +01:00
app_Data Somewhat working 2023-11-26 18:34:01 +01:00
.gitignore initial from pc 2023-11-16 19:32:56 +01:00
README.md Added Images & Last text 2024-01-11 20:59:08 +01:00
UnityPlayer.so initial from pc 2023-11-16 19:32:56 +01:00
app.x86_64 initial from pc 2023-11-16 19:32:56 +01:00
mono_crash.mem.301302.1.blob initial from pc 2023-11-16 19:32:56 +01:00

README.md

Marcs VR Raum

Konzept

Ideen und Skizzen, Ziele

Ich kenne VR bereits von vorher. Jedesmal wird mir schlecht. Ich bin empfindlich gegen die Bewegungskrankheit. Wird es mir einmal schlecht so bleibt dies meistens bis ich einmal eine Nacht geschlafen habe. Perfekte voraussetzungen für VR...

Für mein Projekt habe ich mich entschieden, nachdem ich gesehen habe, dass ich mit der Oculus meinen Raum Scannen kann.

Value Propsition Canvas

Das Value Proposition Canvas, das ich bereits zu Beginn des Projektes erstellt habe.

Mein Spiel soll nicht in einer virtuellen Welt spielen, sondern die richtige Welt mit virtuellen Elemente anreichern. Der Spieler soll aus seiner Wohnung die Map bauen und darin ein Spiel erleben.

Somit kenne ich als Entwickler niemals die Map. Denn bei jedem Spieler ist sie anders.

Als Gameplay aus dem Raum ein kleines Horrorszenario passieren. Die Wände sollen durch dunkle Kellertexturen ersetzt werden. Mittels einer Schusswaffe, die gefunden werden kann, soll sich gegen Angreifer gewehrt werden können. Diese sollen durch Fenster und Türen einbrechen.

Requirements

  • Szene erkennen und Texturen ersetzen
  • Figuren hinzufügen
  • Welt ausserhalb
  • Fenster und Türen hinzufügen
  • Waffe platzieren

Beschreibung

Die Applikation ist leider nicht fertig geworden. Es wurde für mich mehr zu einem Übungsprojekt und vorallem einer Tech-Demo. Ich spreche hier auch über Misserfolge und Dinge, die nicht funktioniert haben. Dies mache ich bewusst. Ich schäme mich nicht dafür und für mich sind es wichtige learnings. Ich bin mit dem Stand meines Projektes durchaus zufrieden und habe mit Sicherheit mehr als die geforderte Zeit in Unity verbracht. Ich befürchte jetzt schon, dass ich irgendwann eine Oculus kaufen muss um weiter zu machen :)

Dabei habe ich folgendes Umgesetzt:

Scene Manager

Der OVR Scene Manager erkennt die in Oculus definierten Scene Anchors. Diese werden dann durch Volumes oder Planes mit einer Holztextur überschrieben.

Manchmal kann man zwischen Decke und Wänden durchschauen. Das liegt daran, dass die Quest ewas an Genauigkeit verliert und dann ist das so. Umgehen könnte man das wohl indem man die Planes etwas grösser skaliert. Solange man nicht ausserhalb des Raumes ist, sollte das auch einem Spieler nicht auffallen.

Dynamisch platzierte Objekte

Auf jedem Tisch wird ein Stack Würfel platziert. Es lädt die Wüfel. Sie fallen aber um und der Collider der Tischplatte ist nicht so gross wie die Platte. Da wird etwas nicht richtig mitskaliert im OVRSceneManagerScript.

OVRSceneManagerScript

Ist mein OVRSceneManagerScript.cs zum platzieren der Objekte. Ist ein Gemisch zwischen der OVRSceneManager, der ja auch schon Objekte platziert und dem Script. Wird ein Objekt im OVRSceneManager explitz als Null Objeckt (eigene Variante ohne Texturen) platziert funktioniert es. Wird kein Objekt angegeben lädt es auch nicht in meinem Script. Wird nichts gemacht wird der default genommen und das ist normalerweise mit einem blauen Gitter verziert.
Mein Script ist Original aus dem Beyond The World Beispiel von Meta. Das meiste ist aber durch unzählige Iterationen nicht mehr als kopiert erkennbar. Somit ist es mehr eine Inspiration und Anleitung gewesen.

MarcsWebLogger

Ich habe mich darüber genervt, dass ich nicht Debuggen kann. Wenn etwas nicht geht habe ich keine Ahnung wieso. Da ich nicht nur Objekte platziert habe und dann schauen konnte wo sie sind, dann in Unity das Objekt neu platziert habe und dann neu gebildet habe.

Für mich was das extrem nervig. Blindflug-programmieren mit Unity und einem Framework, dass ich nicht kenne und natürlich nicht genug RTFM betrieben habe.

Somit musste eine Lösung her. Ich habe mir dann einen kleinen Webserver erstellt der auf HTTP-GET Requests hört. Nun konnte ich in Unity einen MarcsWebLogger.cs script erstellen. Diese nicht-threadsafe, statische Klasse macht einen GET-Request mit einem String als Payload. Auf meinem Computer kann ich mittels Webbrowser die Nachrichten nachlesen bzw. löschen. Das ganze wird als Docker-Container bei mir gehostet.

Erstellt mit ChatGPT. Wieso auch nicht? Die Idee kam von mir und es selber zu schreiben dauert einfach zu lange. Der Code liegt übrigens im Ordner DEBUG-SERVER

Grabbable

Die Würfel lassen sich greifen. Mehr nicht. Funktioniert, ist nicht besonders spannend.

Schusswaffe

Die Schusswaffe habe dank diesem Tutorial relativ leicht eingebaut.

Probleme hatte ich vorallem bei dem Greifen. Hier konnte ich nicht sauber Testen. Das Offset wollte einfach nicht funktionieren. Ich habe es dann anders gelöst

Im imagun.cs habe ich einfach die Waffe fix an den rechten Controller gehängt. Funktioniert, ist halt nicht besonders toll gelöst.

Die Bullets habe ich als Bullet getaggt.

Weils cool ist, habe ich der Waffe noch etwas Rückstoss gegeben. Die Controller vibrieren auch etwas. Mehr geht leider nicht.

Leider schiesst die Waffe erst, wenn beide Controller sichtbar sind.

Und meine Hände sind doppelt.

Fenster

Hier habe mit Abstand am meisten Zeit investiert.

Ich wollte aus den Fenstern nach draussen schauen können. Unity platziert aber die Fenster über der Wand. Also kann ich nicht durch die Wand schauen. Das geht einfach nicht.

Deshalb habe ich nach Lösungen gesucht.

Rendertexture

Überall wo ein Fenster ist wird ein Fenster gespawned. Dieses Fenster hat ein WallArt Script. Dieses Spawnt eine Kamera und erstellt eine RenderTexture worauf das Kamerabild gezeichnet wird. Zusätzlich folgt die Kamera immer dem Kopf des Spielers und schaut auf das Bild. So kann wirklich nach draussen geschaut werden. Es ist aber nicht ganz perfekt.

Wer es testen möchte: Die Picture Variant im Scene Manager auf WINDOW_FRAME ziehen.

Meta Example

Platziert einen Holzrahmen wo die Türen und Fenster sind. Funktioniert super. Hat mich Stunden gekostet alles zu exportieren und bei mir zu importieren. Hat auch bei mir funktioniert. Leider ist im Meta Example Passthrough aktiviert und wir schauen auf die richtigen Wände. Nur wo eine Tür ist schaut man dann in das in Unity gezeichnete Fenster und somit nach draussen. Löst also nicht mein Problem.

DepthReserve

Mit Googlen fand ich https://gamedev.stackexchange.com/a/172675. Das habe ich bei mir auf einen Cube getan und ich konnte nach draussen schauen. Funktioniert indem mit der Render Queue gespielt wird. Das Terrain ausserhalb sieht super aus. Es fühlt sich an wie ein Fenster.

Leider wurde draussen die Lava nicht gezeigt. Ich fand dann heraus, dass die Render Queue nicht mehr alles in der richtigen Reihenfolge drin hatte. Also musste ich da auch herumbasteln. Bäume und Lava von Draussen gehen. Gras habe ich ich nicht hinbekommen.

Outside World

Ausserhalb der Welt liegt eine karge Welt mit Lava und Bäumen. Sowie einem Himmel. Outside World Es gibt einen Himmel, der sich langsam dreht. Die äussersten Berge durchbrechen alle den Himmel. Die vorderen sollen das etwas kaschieren. Dies war dem geschuldet, dass durch das Herumbasteln an der Render Queue die Bäume nicht mehr angezeigt werden solange sie vor der Skybox sind. Nur was vor Terrain ist wurde angezeigt. So wurden auch Äste konsequent abgeschnitten. Ich habe dann in FreeCad eine ausgehölte Kugel erstellt. Leider konnte ich da drauf keine Texture platzieren mit Sternen. Deshalb schwebt nun im Himmel eine Quad. Diese ist im Bild auch nicht sichtbar, da wir von oben drauf schauen. Wer aus dem Fenster schaut sieht den sich drehenden Himmel. Die Sphere ist aktuell deaktiviert, da ich durch die hohen Berge sie nicht mehr brauchte um die Bäume zu fixen.

Afterlife

Triggerwarnung. Selbstverletzung.

Am Kopf des Spielers hängt ein Capsule Collider. Falls etwas was mit dem Tag Bullet gezeichnet ist, mit dieser Sphere kollidiert. Wechselt die Szene in die AfterLife Szene. Dort ist auch Passthrough aktiviert und ein kleines Meme. Das erfährt aber nur jemand, der das hier auch alles gelesen hat oder es selber ausprobiert.

ChatGPT und Valem

Credits an denen. Habe alles mit ChatGPT 3.5 gemacht was ging. Einiges war super. Anderes war absolut tragisch.

Git

Git zu verwenden war eine so gute Entscheidung. Irgendwie hat Unity kein wirkliches Undo. Ich teste merhere Dinge aus in Unity. Ich verschiebe Objekte, ändere Eigenschaften, dann gehe ich in VSCode ond ändere ein Script. Wie soll hier noch ein Undo möglich sein? Ich war so oft froh um gut gesetzte Branches und Commits.

Builden

Das builden des Projekts ist ultra mühsam. Mindestens auf meinem Computer musste ich teilweise drei Mal auf Builden klicken. Liegt wohl an meinem PopOS.

Storyboards

Keine erstellt

Prototypen

Keine erstellt

Screenshots

Wie stellst du dir die finale App vor?

Was nun noch fehlt ist ein sinnvolles Gameplay. Ich habe etwas an den Grundlagen gearbeitet. Ein Folgekurs wo ich mich jemandem zusammensetze, der oder die Ideen hatte aber sie technsich nicht Umsetzen konnte und dann zusammen etwas bauen.

In meiner App bräuchte es noch Gegner, zerstörbare Wände, Animationen und ganz viel Playtests und Iterationen. Aktuell bin ich so weit von einem Spiel weg.

Was würdest du für eine gute UX / Usability noch brauchen?

Gameplay, mehr Zeit. Mehr Know-how. Ein Devteam, Grafikdesigner, Leveldesigner, Sounddesigner, mehr Brillen, Multiplayer.

Und natürlich: Kill your darling. Das Projekt ist total verbastelt und chaotisch. Es handelt sich hier um ein Projekt zum üben.

Einrichten

Unity

Dies muss nur beim Bearbeiten des Codes gemacht werden. Ist die Applikation bereits als .apk verfügbar kann bei Einrichten > Oculus weitergemacht werden.

Szenen

Beim Builden müssen beide Szenen hinzugefügt werden. Die MyWorld Szene soll als Hauptszene ausgewählt werden.

Porjekteinstellungen

Oculus

Einrichten des Raums

Das Projekt verwendet Scene Support. Zuerst muss ein Raum erfasst werden. Dies ist in der Oculus über

  1. Settings
  2. Physical Space
  3. Space Setup
  4. Space Setup

zu erreichen. Neben mindestens vier Wänden soll auch mindestens ein Tisch und ein Fenster oder Bild erfasst werden.

Du kannst Shelf verwenden um Wände zu platzieren. Mache sie einfach so hoch wie die Wände. Diese werden dann als weitere Wände dargestellt.

Verwende nur

  • Wände
  • Shelf
  • Bilder
  • Fenster

Verwende für alle unbeweglichen Gegenstände im Zweifel Shelf. Bewegliche Gegenstände sollen zuerst entfernt werden.

Entfernen der Boundry

Dies kann über

  1. Settings
  2. System
  3. Developer
  4. Boundry deaktiveren
  5. Bestätigen der Warnung

gemacht werden.

Achtung. Diese Einstellung ist extrem gefährlich. Versichere dich, dass innerhalb deines erstellen Raumes keine Gegenstände oder Tiere sind. Aktiviere die Boundry nachher unbedingt wieder. Es herrscht akute Verletzungsgefahr für dich und andere. Bitte jemanden, während du deine Brille trägst, dich zu begleiten um auf dich aufzupassen.
Die Applikation kann auch ohne diese Einstellung verwendet werden. Ich übernehme keine Haftung. Pass auf dich auf!