122 lines
3.9 KiB
C#
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!");
|
|
}
|
|
}
|
|
}
|
|
}
|