VR/README.md

240 lines
13 KiB
Markdown
Raw Permalink Normal View History

2024-01-11 20:18:30 +01:00
# Marcs VR Raum <!-- omit in toc -->
- [Konzept](#konzept)
- [Ideen und Skizzen, Ziele](#ideen-und-skizzen-ziele)
- [Requirements](#requirements)
- [Beschreibung](#beschreibung)
- [Scene Manager](#scene-manager)
- [Dynamisch platzierte Objekte](#dynamisch-platzierte-objekte)
- [OVRSceneManagerScript](#ovrscenemanagerscript)
- [MarcsWebLogger](#marcsweblogger)
- [Grabbable](#grabbable)
- [Schusswaffe](#schusswaffe)
- [Fenster](#fenster)
- [Rendertexture](#rendertexture)
- [Meta Example](#meta-example)
- [DepthReserve](#depthreserve)
- [Outside World](#outside-world)
- [Afterlife](#afterlife)
- [ChatGPT und Valem](#chatgpt-und-valem)
- [Git](#git)
2024-01-11 20:48:42 +01:00
- [Builden](#builden)
2024-01-11 20:18:30 +01:00
- [Storyboards](#storyboards)
- [Prototypen](#prototypen)
- [Screenshots](#screenshots)
- [Wie stellst du dir die finale App vor?](#wie-stellst-du-dir-die-finale-app-vor)
- [Was würdest du für eine gute UX / Usability noch brauchen?](#was-würdest-du-für-eine-gute-ux--usability-noch-brauchen)
- [Einrichten](#einrichten)
- [Unity](#unity)
- [Szenen](#szenen)
- [Porjekteinstellungen](#porjekteinstellungen)
- [Oculus](#oculus)
- [Einrichten des Raums](#einrichten-des-raums)
- [Entfernen der Boundry](#entfernen-der-boundry)
## 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](Documentation/value-proposition-canvas.png)
> 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).
#### OVRSceneManagerScript
Ist mein [OVRSceneManagerScript.cs](/Assets/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](https://github.com/oculus-samples/Unity-TheWorldBeyond) 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](/Assets/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](DEBUG-SERVER)
#### Grabbable
Die Würfel lassen sich greifen. Mehr nicht. Funktioniert, ist nicht besonders spannend.
#### Schusswaffe
Die Schusswaffe habe dank diesem [Tutorial](https://www.youtube.com/watch?v=vmxRjbLhmXM) 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](Assets/iamagun.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.
2024-01-11 20:48:42 +01:00
Leider schiesst die Waffe erst, wenn beide Controller sichtbar sind.
Und meine Hände sind doppelt.
2024-01-11 20:18:30 +01:00
#### 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](Assets/Prefabs/OVR%20Scene%20Manager%20Overrides/Picture/) gespawned. Dieses Fenster hat ein [WallArt](Assets/Prefabs/OVR%20Scene%20Manager%20Overrides/Picture/WallArt.cs) 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](Assets/Prefabs/OVR%20Scene%20Manager%20Overrides/Window/Window%20Variant.prefab) 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](Documentation/World-outside.png)
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](https://www.freecad.org/) 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.
2024-01-11 20:48:42 +01:00
#### 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.
2024-01-11 20:18:30 +01:00
### Storyboards
Keine erstellt
### Prototypen
Keine erstellt
### Screenshots
2024-01-11 20:59:08 +01:00
![](Documentation/0093efa816909c775939c09ca56c3319.png)
![](Documentation/1f5fe0193b1c5cbce634b653a6afaa67.png)
![](Documentation/26f477fa42ca7ed8d8a4b8f7a616f2ad.png)
![](Documentation/387bf993c130c72faea5f04418a26eb0.png)
![](Documentation/d9912396002843fc82b99d288148b2b7.png)
2024-01-11 20:18:30 +01:00
### 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.
2024-01-11 20:48:42 +01:00
Und natürlich: Kill your darling. Das Projekt ist total verbastelt und chaotisch. Es handelt sich hier um ein Projekt zum üben.
2024-01-11 20:18:30 +01:00
## Einrichten
### Unity
Dies muss nur beim Bearbeiten des Codes gemacht werden. Ist die Applikation bereits als `.apk` verfügbar kann bei [Einrichten > Oculus](#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!