Files
Echo/Assets/_Project/Scripts/EndingSystem/EndingTrigger.cs
T
2026-07-08 20:42:51 +08:00

122 lines
3.9 KiB
C#

using UnityEngine;
namespace EndingSystem
{
[RequireComponent(typeof(BoxCollider))]
public class EndingTrigger : MonoBehaviour
{
[Header("Controller Reference")]
public EndingSequenceController sequenceController;
[Header("Trigger Settings")]
[Tooltip("If true, the sequence will start when the player enters the trigger. If false, you can call TriggerSequence() manually (e.g., from a UI Button).")]
public bool triggerOnCollision = true;
[Tooltip("Tag of the player object to detect collision")]
public string playerTag = "Player";
[Header("Win Condition")]
[Tooltip("If true, collision trigger requires EndingWinConditionService.CanTriggerEnding == true")]
public bool requireWinConditionToTrigger = true;
[Tooltip("If true, TriggerSequence() will ignore win condition (useful for debug buttons)")]
public bool allowManualTriggerWhenLocked = true;
private bool hasTriggered = false;
private void OnEnable()
{
enabled = true;
triggerOnCollision = true;
requireWinConditionToTrigger = false;
hasTriggered = false;
var coll = GetComponent<BoxCollider>();
if (coll != null) coll.isTrigger = true;
}
private void Awake()
{
enabled = true;
triggerOnCollision = true;
requireWinConditionToTrigger = false;
var coll = GetComponent<BoxCollider>();
coll.isTrigger = true;
if (sequenceController == null)
{
sequenceController = GetComponentInParent<EndingSequenceController>(true);
if (sequenceController == null)
{
sequenceController = FindObjectOfType<EndingSequenceController>(true);
}
}
}
private void OnValidate()
{
enabled = true;
triggerOnCollision = true;
requireWinConditionToTrigger = false;
var coll = GetComponent<BoxCollider>();
if (coll != null) coll.isTrigger = true;
if (sequenceController == null)
{
sequenceController = GetComponentInParent<EndingSequenceController>(true);
if (sequenceController == null)
{
sequenceController = FindObjectOfType<EndingSequenceController>(true);
}
}
}
private void OnTriggerEnter(Collider other)
{
if (hasTriggered) return;
if (other.CompareTag(playerTag))
{
TriggerSequence();
}
}
/// <summary>
/// 提供给外部调用的接口,比如 Button OnClick 事件,方便在开发阶段不检查碰撞直接触发
/// </summary>
public void TriggerSequence()
{
if (hasTriggered) return;
hasTriggered = true;
if (!allowManualTriggerWhenLocked && requireWinConditionToTrigger)
{
var wc = EndingWinConditionService.EnsureInstance();
if (wc != null && !wc.CanTriggerEnding)
{
hasTriggered = false;
return;
}
}
if (sequenceController == null)
{
sequenceController = GetComponentInParent<EndingSequenceController>(true);
if (sequenceController == null)
{
sequenceController = FindObjectOfType<EndingSequenceController>(true);
}
}
if (sequenceController != null)
{
sequenceController.StartEndingSequence();
}
else
{
Debug.LogError("[EndingTrigger] EndingSequenceController is not assigned!");
}
}
}
}