/* * SPDX-License-Identifier: AGPL-3.0-or-later * Copyright (C) 2025 Sergej Görzen * This file is part of OmiLAXR. */ using System; using OmiLAXR.StressLevel; using UnityEngine; namespace OmiLAXR.TrackingBehaviours { /// /// Monitors stress level changes and triggers events based on configurable thresholds. /// Tracks stress level updates, increases, decreases, and stress/relaxation states. /// public class StressLevelTrackingBehaviour : TrackingBehaviour { /// /// Minimum change required to trigger stress level change events. /// [Range(0f, 1f)] public float changeThreshold = 0.05f; /// /// Event triggered whenever the stress level value changes. /// public readonly TrackingBehaviourEvent OnStressLevelUpdated = new TrackingBehaviourEvent(); /// /// Event triggered when stress level increases beyond the change threshold. /// public readonly TrackingBehaviourEvent OnStressLevelIncreased = new TrackingBehaviourEvent(); /// /// Event triggered when stress level decreases beyond the change threshold. /// public readonly TrackingBehaviourEvent OnStressLevelDecreased = new TrackingBehaviourEvent(); /// /// Event triggered when stress level crosses into high stress range (>0.75). /// public readonly TrackingBehaviourEvent OnStressDetected = new TrackingBehaviourEvent(); /// /// Event triggered when stress level drops to relaxed range (<0.4). /// public readonly TrackingBehaviourEvent OnRelaxationDetected = new TrackingBehaviourEvent(); /// /// Previously recorded stress level for change detection. /// private float _lastLevel; /// /// Flag tracking whether user is currently in stressed state. /// private bool _isStressed; /// /// Reference to the stress level data provider component. /// private StressLevelProvider _provider; /// /// Initialize stress level provider reference. /// private void Start() { _provider = GetComponent(); // Or inject } /// /// Monitor stress level changes each frame and trigger appropriate events. /// private void Update() { var current = _provider.GetStressLevel(); // Skip processing if no significant change if (Math.Abs(current - _lastLevel) < 0.001f) return; // Check for significant increases or decreases var delta = current - _lastLevel; // Always notify of any stress level update OnStressLevelUpdated?.Invoke(this, current, delta); if (delta > changeThreshold) OnStressLevelIncreased?.Invoke(this, current, delta); else if (delta < -changeThreshold) OnStressLevelDecreased?.Invoke(this, current, delta); // Check for stress state transitions if (current > 0.75f && !_isStressed) { // Entered high stress state _isStressed = true; OnStressDetected?.Invoke(this, current); } else if (current < 0.4f && _isStressed) { // Returned to relaxed state _isStressed = false; OnRelaxationDetected?.Invoke(this, current); } _lastLevel = current; } } }