using GhostSystem; using UnityEngine; // Dieses Script ist für die Färbung erfasster Objekte zuständig. public class RecieveHeat : MonoBehaviour { public Renderer myRenderer; private float heatLevel; // von 0-255 private float heatLevelNormalized; // von 0-1 private Material myMat; private async void OnEnable() { 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() // Stetzt den Heat-Wert und somit die Färbung bei einem Restart des Replays zurück. { SetHeat(0); } private void Start() // In der Start-Methode wird der Zugriff auf das Material hergestellt. { if (myRenderer == null) { TryGetComponent(out myRenderer); } myMat = myRenderer.material; SetHeat(0); } 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; // Der Heat-Wert darf 1 nicht übersteigen, da das dem maximalen Rot-Wert von 255 entspricht. heatLevel = heat; 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) // Diese funktion addiert einen übergebenen Wert zum aktuellen Heat-Wert. Kann ebenfalls durch andere Skripte aufgerufen werden. { heatLevel += heat; 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); // 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) // Hier wird der lineare Anstieg in eine exponentielle Funktion überführt. { float y = Mathf.Pow(xNormalized, 0.5f); return Mathf.Clamp(y, 0f, 1f); } }