/* * SPDX-License-Identifier: AGPL-3.0-or-later * Copyright (C) 2025 Sergej Görzen * This file is part of OmiLAXR. */ using System.ComponentModel; using OmiLAXR.Actors.HeartRate; using UnityEngine; namespace OmiLAXR.TrackingBehaviours { /// /// Tracking behavior specifically designed to monitor heart rate data at regular intervals. /// Requires a HeartRateProvider component in the parent pipeline to function properly. /// Automatically disables itself if no valid provider is found. /// [AddComponentMenu("OmiLAXR / 3) Tracking Behaviours / Heart Rate Tracking Behaviour")] [Description("Tracks the heart rate of an actor.")] public class HeartRateTrackingBehaviour : TrackingBehaviour { /// /// Time interval in seconds between heart rate measurements. /// Determines how frequently the OnHeartBeat event is triggered. /// public float intervalSeconds = 1.0f; /// /// Event triggered at regular intervals with the current heart rate value. /// Provides heart rate as an integer value (beats per minute). /// public readonly TrackingBehaviourEvent OnHeartBeat = new TrackingBehaviourEvent(); /// /// Initializes the heart rate tracking by locating the provider and setting up the interval timer. /// Validates that a HeartRateProvider exists and is enabled before starting tracking. /// private void Start() { // Search for HeartRateProvider in parent hierarchy var provider = GetComponentInParent(); if (provider == null || !provider.enabled) { // No valid provider found - disable this component enabled = false; DebugLog.OmiLAXR.Warning($"Cannot find any in parent pipeline '{Pipeline.name}'. The Heart Rate Tracking Behaviour was disabled."); return; } // Set up interval-based heart rate monitoring SetInterval(() => { // Get current heart rate from provider and trigger event OnHeartBeat?.Invoke(this, provider.GetHeartRate()); }, intervalSeconds); } } }