Smooth 3C & simplify hallucination trigger
This commit is contained in:
+7
-96
@@ -1,112 +1,23 @@
|
||||
using UnityEngine;
|
||||
using Unheimlich.Core.Audio;
|
||||
|
||||
namespace Unheimlich.Features.Hallucination
|
||||
{
|
||||
/// <summary>
|
||||
/// Fires a hallucination trigger when a specific AudioSource plays, finishes, or reaches a timestamp.
|
||||
/// Mirrors the pattern of ClueUnlockOnAudio but targets HallucinationManager.
|
||||
/// Fires a hallucination effect when a specific AudioSource plays, finishes, or reaches a timestamp.
|
||||
/// Call OnAudioPlay() from whatever drives the AudioSource to start monitoring.
|
||||
/// </summary>
|
||||
[RequireComponent(typeof(AudioSource))]
|
||||
public class HallucinationOnAudio : MonoBehaviour
|
||||
public class HallucinationOnAudio : AudioTriggerBase
|
||||
{
|
||||
public enum FireCondition
|
||||
{
|
||||
OnPlay,
|
||||
OnFinish,
|
||||
OnTimeReached
|
||||
}
|
||||
|
||||
[Header("Audio Trigger")]
|
||||
[Tooltip("When to fire the hallucination effect")]
|
||||
[SerializeField] private FireCondition _fireCondition = FireCondition.OnPlay;
|
||||
|
||||
[Tooltip("Playback time in seconds to reach before firing (only for OnTimeReached)")]
|
||||
[SerializeField] private float _triggerTime = 1f;
|
||||
|
||||
[Header("Hallucination Payload")]
|
||||
[Tooltip("Amount of sanity to add when this fires (0 = no change)")]
|
||||
[Tooltip("Amount of insanity to add when this fires (0 = no change)")]
|
||||
[SerializeField, Range(0f, 1f)] private float _insanityAmount = 0f;
|
||||
|
||||
[Tooltip("Optional discrete hallucination event to fire")]
|
||||
[SerializeField] private HallucinationEvent _hallucinationEvent;
|
||||
|
||||
[Header("Behaviour")]
|
||||
[Tooltip("Prevent firing more than once per Play Mode session")]
|
||||
[SerializeField] private bool _fireOnlyOnce = true;
|
||||
|
||||
[Header("Debug")]
|
||||
[SerializeField] private bool _debugMode;
|
||||
|
||||
private AudioSource _audioSource;
|
||||
private bool _hasFired;
|
||||
private bool _isMonitoring;
|
||||
|
||||
private void Awake()
|
||||
protected override void Execute()
|
||||
{
|
||||
_audioSource = GetComponent<AudioSource>();
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
_hasFired = false;
|
||||
_isMonitoring = false;
|
||||
|
||||
if (_audioSource != null && _audioSource.isPlaying)
|
||||
StartMonitoring();
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (!_isMonitoring || (_fireOnlyOnce && _hasFired))
|
||||
return;
|
||||
|
||||
if (_audioSource == null || !_audioSource.isPlaying)
|
||||
{
|
||||
if (_fireCondition == FireCondition.OnFinish)
|
||||
Execute();
|
||||
|
||||
_isMonitoring = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (_fireCondition == FireCondition.OnTimeReached && _audioSource.time >= _triggerTime)
|
||||
Execute();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Notify this component that the AudioSource has started playing.
|
||||
/// Wire this to whatever code or event drives the AudioSource.
|
||||
/// </summary>
|
||||
public void OnAudioPlay()
|
||||
{
|
||||
StartMonitoring();
|
||||
|
||||
if (_fireCondition == FireCondition.OnPlay)
|
||||
Execute();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resets the fired state so this can fire again.
|
||||
/// </summary>
|
||||
public void ResetFired()
|
||||
{
|
||||
_hasFired = false;
|
||||
_isMonitoring = false;
|
||||
}
|
||||
|
||||
private void StartMonitoring()
|
||||
{
|
||||
_isMonitoring = true;
|
||||
}
|
||||
|
||||
private void Execute()
|
||||
{
|
||||
if (_fireOnlyOnce && _hasFired)
|
||||
return;
|
||||
|
||||
_hasFired = true;
|
||||
_isMonitoring = false;
|
||||
|
||||
if (HallucinationManager.Instance == null)
|
||||
{
|
||||
Debug.LogError("[HallucinationOnAudio] HallucinationManager not found!", this);
|
||||
@@ -120,7 +31,7 @@ namespace Unheimlich.Features.Hallucination
|
||||
HallucinationManager.Instance.TriggerHallucinationEvent(_hallucinationEvent);
|
||||
|
||||
if (_debugMode)
|
||||
Debug.Log($"[HallucinationOnAudio] Fired on '{_fireCondition}'. Sanity now: {HallucinationManager.Instance.SanityLevel:F2}", this);
|
||||
Debug.Log($"[HallucinationOnAudio] Fired on '{_fireCondition}'. Sanity: {HallucinationManager.Instance.SanityLevel:F2}", this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user