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(); if (coll != null) coll.isTrigger = true; } private void Awake() { enabled = true; triggerOnCollision = true; requireWinConditionToTrigger = false; var coll = GetComponent(); coll.isTrigger = true; if (sequenceController == null) { sequenceController = GetComponentInParent(true); if (sequenceController == null) { sequenceController = FindObjectOfType(true); } } } private void OnValidate() { enabled = true; triggerOnCollision = true; requireWinConditionToTrigger = false; var coll = GetComponent(); if (coll != null) coll.isTrigger = true; if (sequenceController == null) { sequenceController = GetComponentInParent(true); if (sequenceController == null) { sequenceController = FindObjectOfType(true); } } } private void OnTriggerEnter(Collider other) { if (hasTriggered) return; if (other.CompareTag(playerTag)) { TriggerSequence(); } } /// /// 提供给外部调用的接口,比如 Button OnClick 事件,方便在开发阶段不检查碰撞直接触发 /// 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(true); if (sequenceController == null) { sequenceController = FindObjectOfType(true); } } if (sequenceController != null) { sequenceController.StartEndingSequence(); } else { Debug.LogError("[EndingTrigger] EndingSequenceController is not assigned!"); } } } }