Cleaned up and commented version.
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
using UnityEngine;
|
||||
|
||||
// Eine Helfer-Component um das Problem zu umgehen, dass GameObjects unter bestimmten Bedingungnen nciht über das Unity Event System aktiviert oder deaktiviert werden könnnen.
|
||||
// Dieses Skript kann einfach auf ein Objekt gelegt werden und die öffentliche Methode dann verlinkt werden.
|
||||
|
||||
public class ActiveToggle : MonoBehaviour
|
||||
{
|
||||
public void ToggleActive(GameObject obj)
|
||||
|
||||
@@ -8,6 +8,9 @@ using UnityEngine;
|
||||
using Newtonsoft.Json;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
// Dieses Script ermöglicht das Einlesen einer Log-Datei, wie sie von der VR-Anwendung im Offline-Modus erstellt wird.
|
||||
// Der Inhalt der Datei wird als Batch in die Datenbank hochgeladen.
|
||||
|
||||
public class BatchUploader : MonoBehaviour
|
||||
{
|
||||
public TMP_InputField fileNameInput;
|
||||
|
||||
@@ -3,14 +3,16 @@ using Unity.Cinemachine;
|
||||
using UnityEngine;
|
||||
using UnityEngine.InputSystem;
|
||||
|
||||
// Die Zoom-Funktion per Scrollrad musste erst händisch der Orbit-Kamera hinzugefügt werden. Dafür ist dieses Script zuständig.
|
||||
|
||||
public class CinemachinePositionComposerController : MonoBehaviour
|
||||
{
|
||||
[Header("Input Actions")]
|
||||
public InputActionReference zoomAction;
|
||||
public InputActionReference zoomAction; // Zuweisung einer Unity Input System Action.
|
||||
|
||||
public CinemachinePositionComposer positionComposer;
|
||||
public CinemachinePositionComposer positionComposer; // Zuweisung eines Position Composers der manipuliert werden soll.
|
||||
|
||||
private bool zoomBlocked = false;
|
||||
private bool zoomBlocked = false; // Blocker für Zoom (wie schon in OrbitCameraMouseControl).
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
@@ -22,20 +24,20 @@ public class CinemachinePositionComposerController : MonoBehaviour
|
||||
|
||||
void Update()
|
||||
{
|
||||
if (zoomAction != null && !zoomBlocked)
|
||||
{
|
||||
if (zoomAction != null && !zoomBlocked) // Wenn der Blocker nicht aktiv und die Action zugewiesen ist, wird in jedem Frame der Zustand des Scrollrads abgefragt
|
||||
{ // und auf dieser Basis die CameraDistance im Position Composer verändert.
|
||||
Vector2 zoomValue = zoomAction.action.ReadValue<Vector2>();
|
||||
positionComposer.CameraDistance = positionComposer.CameraDistance - zoomValue.y * 0.25f;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void SetBlocker(bool value)
|
||||
public void SetBlocker(bool value) // mit dieser Funktion kann der Blocker durch andere Skripte gesetzt werden.
|
||||
{
|
||||
zoomBlocked = value;
|
||||
}
|
||||
|
||||
public void SetLookahead(bool value)
|
||||
public void SetLookahead(bool value) // Die Aktivierung und Deaktivierung des in Cinemachine möglichen Lookaheads wurde hier ebenfalls untergebracht.
|
||||
{
|
||||
positionComposer.Lookahead.Enabled = value;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@ using System.Collections.Generic;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
|
||||
// Dieses Skript stellt die Funktionen für das Datums-Dropdown in der AAR-App bereit.
|
||||
|
||||
public class DateSelector : MonoBehaviour
|
||||
{
|
||||
public int selectedYear;
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
|
||||
// Eine simple Helfer-Component um Unity events auszulösen, wenn ein GemeObject aktiviert oder deaktiviert wird.
|
||||
|
||||
public class EnableDisableActions : MonoBehaviour
|
||||
{
|
||||
[SerializeField] UnityEvent onEnable;
|
||||
|
||||
@@ -5,6 +5,8 @@ using UnityEngine.SceneManagement;
|
||||
using UnityEngine.UI;
|
||||
using TMPro;
|
||||
|
||||
// Diese Klasse ist dafür da, die aktuell vorhandenen Szenen der ANwendung rauszusuchen und das Szenen-Dropdown damit zu füllen.
|
||||
|
||||
public class FillDopdownWithScenes : MonoBehaviour
|
||||
{
|
||||
public TMP_Dropdown dropdown;
|
||||
|
||||
@@ -2,6 +2,8 @@ using System.Collections.Generic;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
|
||||
// Diese Hilfsklasse wird verwendet, um das Dropdown-Menü für den Tag mit der kokkekten Anzahl an Tagen für den ausgewählten Monat zu füllen.
|
||||
|
||||
public class FillDropdownWithDays : MonoBehaviour
|
||||
{
|
||||
public TMP_Dropdown dropdown;
|
||||
|
||||
@@ -7,6 +7,8 @@ using UnityEngine.UI;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
// Skript der Basis-Szene, um den Szenenwechsel in der Version ohne Portale zu vollziehen.
|
||||
|
||||
public class FlushAndLoad : MonoBehaviour
|
||||
{
|
||||
public TMP_Text output;
|
||||
@@ -20,8 +22,8 @@ public class FlushAndLoad : MonoBehaviour
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
GhostRecorderBatch.OnUploadFinished += HandleUploadFinished;
|
||||
RoomManager.OnSceneIdReady += HandleSceneIdReady;
|
||||
GhostRecorderBatch.OnUploadFinished += HandleUploadFinished; // abonniert das Event, das ausgelöst wird, wenn der Upload in die Datenbank erfolgreich war.
|
||||
RoomManager.OnSceneIdReady += HandleSceneIdReady; // abonniert das Event, das ausgelöst wird, wenn die neue Szene vollständig hinzugeladen wurde.
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
@@ -30,18 +32,12 @@ public class FlushAndLoad : MonoBehaviour
|
||||
RoomManager.OnSceneIdReady -= HandleSceneIdReady;
|
||||
}
|
||||
|
||||
// Start is called once before the first execution of Update after the MonoBehaviour is created
|
||||
void Start()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
if (OVRInput.GetDown(OVRInput.Button.SecondaryIndexTrigger))
|
||||
if (OVRInput.GetDown(OVRInput.Button.SecondaryIndexTrigger)) // der rechte Trigger löst den Szenenwechsel aus.
|
||||
{
|
||||
if (sceneId == "End") Application.Quit();
|
||||
if (sceneId == "End") Application.Quit(); // außer nach der letzten Szene. Dort wird die Anwendung beendet.
|
||||
else
|
||||
{
|
||||
output.text = "Flush...";
|
||||
@@ -56,11 +52,11 @@ public class FlushAndLoad : MonoBehaviour
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleUploadFinished()
|
||||
private void HandleUploadFinished() // wenn der Upload in die Datenbank erfolgreich war, wird der Pass-Through-Layer wieder deaktiviert, um entweder die neue Szene zu zeigen
|
||||
{
|
||||
loadingScreen.SetActive(false);
|
||||
output.text = "";
|
||||
if (sceneId == "End")
|
||||
if (sceneId == "End") // oder nach der letzten Szene einen Info-Text.
|
||||
{
|
||||
output.text = "Durchlauf beendet.";
|
||||
}
|
||||
@@ -68,15 +64,15 @@ public class FlushAndLoad : MonoBehaviour
|
||||
|
||||
private void HandleSceneIdReady(string id, List<GameObject> doors, List<RecieveHeat> targets)
|
||||
{
|
||||
sceneId = id;
|
||||
sceneId = id; // wenn die neu hinzugeladene Szene bereit ist, wird die sceneID gesetzt.
|
||||
if (id == "Room1")
|
||||
{
|
||||
loadingScreen.SetActive(false);
|
||||
passthroughLayer.SetActive(false);
|
||||
loadingScreen.SetActive(false); // Bei Room1 wird zusätzlich der Pass-Through-Layer/Loding Screen deaktiviert, da hier noch keine Daten hochgeladen werden
|
||||
passthroughLayer.SetActive(false); // und somit das entsprechende Event nicht ausgelöst wird.
|
||||
}
|
||||
if (id == "End")
|
||||
{
|
||||
instruction.text = "Drücke den rechten Trigger, um die Anwendung zu beenden.";
|
||||
instruction.text = "Drücke den rechten Trigger, um die Anwendung zu beenden."; // Die zweite Ausnahme bildet die letzte Szene. Hier erscheint nur eine Info-Tafel.
|
||||
canvas.SetActive(true);
|
||||
passthroughLayer.SetActive(true);
|
||||
}
|
||||
@@ -88,10 +84,10 @@ public class FlushAndLoad : MonoBehaviour
|
||||
canvas.SetActive(false);
|
||||
}
|
||||
|
||||
private async UniTaskVoid LoadScene()
|
||||
{
|
||||
private async UniTaskVoid LoadScene() // Die eigentliche Funktion zum Laden der Szene aktiviert erst den Pass-Through-Layer/Loading Screen um Motion Sickness durch stehendes
|
||||
{ // Bild zu vermeiden. Dann wird der Flush-Befehl zum Upload der Recording-Daten in die Datenbank gegeben.
|
||||
await Loadingscreen();
|
||||
recorder.Flush();
|
||||
GetComponent<SceneLoader>().NewRoom();
|
||||
}
|
||||
GetComponent<SceneLoader>().NewRoom(); // Es wird der nächste Raum geladen. Der Pass-Through-Layer bleibt so lange aktiv, bis er durch die abonnierten Events deaktiviert
|
||||
} // wird. So kann Motion-Sickness durch stockende Bilder beim Laden vermieden werden.
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@ using System.Collections.Generic;
|
||||
using Unity.Netcode;
|
||||
using UnityEngine;
|
||||
|
||||
// Zur unterscheideung des localen Player-Rigs von adneren aus dem Multiplayer. Aktuell nicht in Benutzung.
|
||||
|
||||
public class LocalPlayerReference : NetworkBehaviour
|
||||
{
|
||||
public static LocalPlayerReference Instance { get; private set; }
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f0f419a0b003b0844b74f62b8a92de23
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+2
@@ -3,6 +3,8 @@ using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
// Ehemaliges Skript für die Start-Szene. Nicht mehr in Verwendung
|
||||
|
||||
public class GameStarter : MonoBehaviour
|
||||
{
|
||||
[SerializeField] int startScene = 1;
|
||||
+2
@@ -2,6 +2,8 @@ using System.Globalization;
|
||||
using Unity.Netcode;
|
||||
using UnityEngine;
|
||||
|
||||
// Hilfs-Skript um bestimmte Objekte für den lokalen Spieler unsichtbar zu machen. Findet momentan keine Anwendung.
|
||||
|
||||
public class InvisibleForLocalPlayer : NetworkBehaviour
|
||||
{
|
||||
// Start is called once before the first execution of Update after the MonoBehaviour is created
|
||||
+2
@@ -1,6 +1,8 @@
|
||||
using Unity.Netcode;
|
||||
using UnityEngine;
|
||||
|
||||
// Script zum Spawnen der Spieler im Multiplayer. Aktuell nicht in Benutzung.
|
||||
|
||||
public class PlayerSpawner : NetworkBehaviour
|
||||
{
|
||||
public override void OnNetworkSpawn()
|
||||
+2
@@ -3,6 +3,8 @@ using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.XR;
|
||||
|
||||
// Script zur automatisierten Ausrichtung der Basis-Szene am Spielbereich. Wird in der aktuellen Version nicht verwendet.
|
||||
|
||||
public class SpawnAtLongestEdge : MonoBehaviour
|
||||
{
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
using Unity.Netcode;
|
||||
using UnityEngine;
|
||||
|
||||
// Dieses Skript ist notwendig, um zum einen Smooth-Movement per Stick-Bewegung zu ermöglichen und zum anderen, dass der Character-Controller bei der physikalischen
|
||||
// Roomscale-Bewegung dem/der NutzerIn folgt.
|
||||
|
||||
[RequireComponent(typeof(CharacterController))]
|
||||
public class OVRStickAndRoomscaleMovement : NetworkBehaviour
|
||||
{
|
||||
@@ -12,13 +15,13 @@ public class OVRStickAndRoomscaleMovement : NetworkBehaviour
|
||||
private CharacterController characterController;
|
||||
private Vector3 velocity;
|
||||
|
||||
public float minHeight = 1.0f; // Kleinster Collider
|
||||
public float maxHeight = 2.2f; // Größter Collider
|
||||
public float skinWidth = 0.05f; // Charaktercontroller-Skin
|
||||
|
||||
public float minHeight = 1.0f; // Minimal mögliche Körpergröße (oder Größe wenn geduckt)
|
||||
public float maxHeight = 2.2f; // Maximal mögliche Körpergröße
|
||||
public float skinWidth = 0.05f; // Durchmesser des Kapsel-Colliders für den Körper. Darf nicht zu groß sein, um sich z.B. über Tische beugen zu können, ohne von der ingame-
|
||||
// Physik weggeschoben zu werden.
|
||||
void Start()
|
||||
{
|
||||
//if (!IsOwner) return;
|
||||
//if (!IsOwner) return; Wäre nur bei Multiplayer wichtig.
|
||||
|
||||
characterController = GetComponent<CharacterController>();
|
||||
|
||||
@@ -28,9 +31,9 @@ public class OVRStickAndRoomscaleMovement : NetworkBehaviour
|
||||
|
||||
void Update()
|
||||
{
|
||||
//if (!IsOwner) return;
|
||||
//if (!IsOwner) return; Wäre nur bei Multiplayer wichtig.
|
||||
|
||||
// 1. Real-World Position des Headsets bestimmen
|
||||
// 1. Position des Kopfes in der realen Welt bestimmen.
|
||||
Vector3 headLocalPos = rigRoot.InverseTransformPoint(cameraTransform.position);
|
||||
|
||||
// 2. Höhe anpassen (Stehen, Hocken)
|
||||
|
||||
@@ -5,12 +5,12 @@ using Unity.Cinemachine;
|
||||
public class OrbitCameraMouseControl : MonoBehaviour
|
||||
{
|
||||
[Header("Input Actions")]
|
||||
public InputActionReference aimAction; // CM Default / Aim
|
||||
public InputActionReference aimAction; // erlaubt die Zuweisung einer Unity Input System Action. Der Name AimAction kommt von der Belegung auf der rechten Maustaste.
|
||||
|
||||
[Header("Cinemachine Components")]
|
||||
public CinemachineInputAxisController inputAxisController;
|
||||
public CinemachineInputAxisController inputAxisController; // hier wird der InputAxisController der Cinemachine Camera verlinkt, der manipuliert werden soll.
|
||||
|
||||
private bool aimingBlocked = false;
|
||||
private bool aimingBlocked = false; // wird verwendet, um die Bewegung der Kamera zu verhindern, während die Maus über einem Menüelement hovert.
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
@@ -30,13 +30,13 @@ public class OrbitCameraMouseControl : MonoBehaviour
|
||||
|
||||
if (inputAxisController != null) // aimingBlocked wird durch hover States der Menü-Elemente gesetzt
|
||||
{
|
||||
inputAxisController.Controllers[0].Enabled = isAiming;
|
||||
inputAxisController.Controllers[0].Enabled = isAiming; // Die X und Y-Achse der der Orbit-Funktion werden freigeschaltet, solange die aimAction (hier RMT) gedrückt ist.
|
||||
inputAxisController.Controllers[1].Enabled = isAiming;
|
||||
inputAxisController.Controllers[2].Enabled = !aimingBlocked;
|
||||
inputAxisController.Controllers[2].Enabled = !aimingBlocked; // Die Scroll-Funktion ist freigeschaltet, solange die Maus nicht über einem Menüelement hovert.
|
||||
}
|
||||
}
|
||||
|
||||
public void SetBlocker(bool value)
|
||||
public void SetBlocker(bool value) // mit dieser Funktion kann der Blocker durch andere Skripte gesetzt werden.
|
||||
{
|
||||
aimingBlocked = value;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
using GhostSystem;
|
||||
using UnityEngine;
|
||||
|
||||
// Dieses Script ist für die Färbung erfasster Objekte zuständig.
|
||||
|
||||
public class RecieveHeat : MonoBehaviour
|
||||
{
|
||||
public Renderer myRenderer;
|
||||
@@ -10,20 +12,20 @@ public class RecieveHeat : MonoBehaviour
|
||||
|
||||
private async void OnEnable()
|
||||
{
|
||||
GhostReplayManager.OnRestartLoop += HandleRestartLoop;
|
||||
}
|
||||
GhostReplayManager.OnRestartLoop += HandleRestartLoop; // Das Event OnRestartLoop des GhostReplayManagers wird abonniert, um die Färbung der Objekte zurücksetzen zu
|
||||
} // können, wenn das Replay neu startet.
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
GhostReplayManager.OnRestartLoop -= HandleRestartLoop;
|
||||
}
|
||||
|
||||
private void HandleRestartLoop()
|
||||
private void HandleRestartLoop() // Stetzt den Heat-Wert und somit die Färbung bei einem Restart des Replays zurück.
|
||||
{
|
||||
SetHeat(0);
|
||||
}
|
||||
|
||||
private void Start()
|
||||
private void Start() // In der Start-Methode wird der Zugriff auf das Material hergestellt.
|
||||
{
|
||||
if (myRenderer == null)
|
||||
{
|
||||
@@ -33,24 +35,24 @@ public class RecieveHeat : MonoBehaviour
|
||||
SetHeat(0);
|
||||
}
|
||||
|
||||
public void SetHeat(float heat)
|
||||
public void SetHeat(float heat) // Diese Funktion kann von anderen Skripten (z.B. dem Raycast-Skript EyeTrackingCollisionPoints) aufgerufen werden, um den Heat-Wert zu setzen.
|
||||
{
|
||||
if (heat > 1f) return;
|
||||
if (heat > 1f) return; // Der Heat-Wert darf 1 nicht übersteigen, da das dem maximalen Rot-Wert von 255 entspricht.
|
||||
heatLevel = heat;
|
||||
float redAmount = CalcRedAmount(heatLevel);
|
||||
myMat.color = new Color(redAmount,0,0);
|
||||
float redAmount = CalcRedAmount(heatLevel); // der Rot-Wert wird für einen exponentiellen Anstieg innerhalb der Fixationsdauer noch einmal gemappt.
|
||||
myMat.color = new Color(redAmount,0,0); // Das Material wird entsprechend stark rot gefärbt.
|
||||
}
|
||||
|
||||
public void AddHeat(float heat)
|
||||
public void AddHeat(float heat) // Diese funktion addiert einen übergebenen Wert zum aktuellen Heat-Wert. Kann ebenfalls durch andere Skripte aufgerufen werden.
|
||||
{
|
||||
heatLevel += heat;
|
||||
if (heatLevel > 1f) return;
|
||||
if (heatLevel > 1f) return; // Die Funktionsweise entspricht weitesgehend der von SetHeat.
|
||||
float redAmount = CalcRedAmount(heatLevel);
|
||||
Debug.Log(gameObject.ToString() + "Heat in: " + heatLevel + "Heat out: " + redAmount);
|
||||
Debug.Log(gameObject.ToString() + "Heat in: " + heatLevel + "Heat out: " + redAmount); // Ein Debug-Log, um den zeitbasierten Anstieg der Färbung zu prüfen.
|
||||
myMat.color = new Color(redAmount, 0, 0);
|
||||
}
|
||||
|
||||
private float CalcRedAmount(float xNormalized)
|
||||
private float CalcRedAmount(float xNormalized) // Hier wird der lineare Anstieg in eine exponentielle Funktion überführt.
|
||||
{
|
||||
float y = Mathf.Pow(xNormalized, 0.5f);
|
||||
return Mathf.Clamp(y, 0f, 1f);
|
||||
|
||||
@@ -4,11 +4,13 @@ using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
// Dieses Skript enthält die Methode, die vom Scene-Dropdown in der Menüleiste der AAR-App bei Auswahl einer Szene ausgeführt wird.
|
||||
|
||||
public class ReplaySceneLoader : MonoBehaviour
|
||||
{
|
||||
public GhostReplayManager replayManager;
|
||||
private int currentScene;
|
||||
public void LoadSceneAdditive(int sceneIndex)
|
||||
public void LoadSceneAdditive(int sceneIndex) // Lädt die Szene, die im UI ausgewählt wurde.
|
||||
{
|
||||
sceneIndex += 1; // Um die Basis-Scene nicht zu laden
|
||||
if(SceneManager.loadedSceneCount > 1)
|
||||
|
||||
@@ -6,6 +6,9 @@ using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
// Dieses Script liest die RoomPrefs eines Raums beim Start der Szene aus, aktiviert oder deaktiviert die entsprechenden Objekte und löst das Event aus, dass die Szene vollständig
|
||||
// geladen wurde.
|
||||
|
||||
public class RoomManager : MonoBehaviour
|
||||
{
|
||||
public RoomPrefs myRoom;
|
||||
@@ -49,7 +52,7 @@ public class RoomManager : MonoBehaviour
|
||||
foreach (GameObject enemy in enemies) enemy.SetActive(true);
|
||||
}
|
||||
sceneId = myRoom.sceneId;
|
||||
OnSceneIdReady?.Invoke(sceneId, doors, targets);
|
||||
|
||||
OnSceneIdReady?.Invoke(sceneId, doors, targets); // Mit dem Event werden auch einige Informationen wie die SceneID, die Liste der Türen und die Liste der Target-Objekte
|
||||
// an Abonnenten übergeben.
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,8 @@ using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
// Dieses Skript ist für das Hinzuladen und Entladen der Szenen zuständig.
|
||||
|
||||
public class SceneLoader : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private int baseSceneIndex;
|
||||
|
||||
@@ -3,6 +3,8 @@ using UnityEngine.UI;
|
||||
using TMPro;
|
||||
using GhostSystem;
|
||||
|
||||
// Dieses Skript wurde nur zu Debug-Zwecken verwendet, um zu sehen, ob auch alle gewünschten Objekte getrackt wurden.
|
||||
|
||||
public class VRDebugger : MonoBehaviour
|
||||
{
|
||||
public TMP_Text trackedObjects;
|
||||
|
||||
Reference in New Issue
Block a user