Smooth 3C & simplify hallucination trigger
This commit is contained in:
+49
-13
@@ -4,30 +4,66 @@ using Unheimlich.Core.Events;
|
||||
namespace Unheimlich.Features.Hallucination
|
||||
{
|
||||
/// <summary>
|
||||
/// Fires a GameEventTrigger (and therefore a HallucinationTrigger) when the player
|
||||
/// enters a physics trigger collider. Pair with GameEventTrigger + HallucinationTrigger
|
||||
/// on the same GameObject.
|
||||
/// Self-contained zone that triggers a hallucination effect when the player enters.
|
||||
/// Handles the once-flag, optional delay, insanity increase, and a discrete HallucinationEvent
|
||||
/// — no GameEventTrigger or HallucinationTrigger required alongside it.
|
||||
/// </summary>
|
||||
[RequireComponent(typeof(GameEventTrigger))]
|
||||
public class HallucinationTriggerZone : TriggerZoneBase
|
||||
{
|
||||
[Header("Zone Behaviour")]
|
||||
[Tooltip("Allow the zone to fire again after the player exits and re-enters")]
|
||||
[SerializeField] private bool _retriggerable = false;
|
||||
|
||||
[Tooltip("Delay in seconds before the hallucination fires after the player enters")]
|
||||
[SerializeField] private float _delay = 0f;
|
||||
|
||||
[Header("Sanity")]
|
||||
[Tooltip("Amount of insanity added when the zone fires (0 = no change)")]
|
||||
[SerializeField, Range(0f, 1f)] private float _insanityAmount = 0f;
|
||||
|
||||
[Header("Hallucination Event")]
|
||||
[Tooltip("Optional discrete hallucination event (ghost word, vision flash, etc.)")]
|
||||
[SerializeField] private HallucinationEvent _hallucinationEvent;
|
||||
|
||||
[Header("Debug")]
|
||||
[SerializeField] private bool _debugMode;
|
||||
|
||||
protected override bool IsRetriggerable => _retriggerable;
|
||||
|
||||
private GameEventTrigger _eventTrigger;
|
||||
|
||||
protected override void Awake()
|
||||
{
|
||||
base.Awake();
|
||||
_eventTrigger = GetComponent<GameEventTrigger>();
|
||||
}
|
||||
|
||||
protected override void OnPlayerEntered(Collider playerCollider)
|
||||
{
|
||||
_eventTrigger.Fire();
|
||||
if (_delay > 0f)
|
||||
Invoke(nameof(Fire), _delay);
|
||||
else
|
||||
Fire();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fires the hallucination effect. Can also be called from external scripts or UnityEvents.
|
||||
/// </summary>
|
||||
public void Fire()
|
||||
{
|
||||
if (HallucinationManager.Instance == null)
|
||||
{
|
||||
Debug.LogError("[HallucinationTriggerZone] HallucinationManager not found in scene!", this);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_insanityAmount > 0f)
|
||||
{
|
||||
HallucinationManager.Instance.AddInsanity(_insanityAmount);
|
||||
|
||||
if (_debugMode)
|
||||
Debug.Log($"[HallucinationTriggerZone] Added {_insanityAmount:F2} insanity on '{gameObject.name}'.", this);
|
||||
}
|
||||
|
||||
if (_hallucinationEvent != null)
|
||||
{
|
||||
HallucinationManager.Instance.TriggerHallucinationEvent(_hallucinationEvent);
|
||||
|
||||
if (_debugMode)
|
||||
Debug.Log($"[HallucinationTriggerZone] Fired event: {_hallucinationEvent.Label}", this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user