using System.Collections; using UnityEngine; public class StalactiteFallTrigger : MonoBehaviour { [Header("References")] [SerializeField] private FallingStalactite[] stalactites; [Header("Trigger Settings")] [SerializeField] private bool triggerOnce = true; [Tooltip("RaftDamageReceiver가 붙은 RaftHitBox가 들어왔을 때만 작동합니다.")] [SerializeField] private bool requireRaftDamageReceiver = true; [Tooltip("특정 태그가 들어왔을 때도 작동시키고 싶으면 입력합니다. 비워두면 태그 검사를 하지 않습니다.")] [SerializeField] private string targetTag = ""; [Tooltip("트리거 후 종유석이 떨어지기까지의 추가 지연 시간입니다.")] [SerializeField] private float triggerDelay = 0f; [Tooltip("여러 종유석을 순차적으로 떨어뜨릴 때 간격입니다.")] [SerializeField] private float intervalBetweenStalactites = 0.15f; [Header("Debug")] [SerializeField] private bool showDebugLog = true; private bool hasTriggered; private Coroutine triggerRoutine; private void Reset() { Collider col = GetComponent(); if (col != null) col.isTrigger = true; } private void Awake() { Collider col = GetComponent(); if (col != null) col.isTrigger = true; if (stalactites == null || stalactites.Length == 0) { stalactites = GetComponentsInChildren(true); } } private void OnTriggerEnter(Collider other) { TryTrigger(other); } private void TryTrigger(Collider other) { if (triggerOnce && hasTriggered) return; if (!IsValidTarget(other)) return; hasTriggered = true; if (triggerRoutine != null) StopCoroutine(triggerRoutine); triggerRoutine = StartCoroutine(TriggerRoutine()); if (showDebugLog) Debug.Log($"[StalactiteFallTrigger] {name} 작동. 감지 대상: {other.name}", this); } private bool IsValidTarget(Collider other) { if (other == null) return false; bool valid = false; if (requireRaftDamageReceiver) { RaftDamageReceiver receiver = other.GetComponentInParent(); if (receiver != null) valid = true; } if (!string.IsNullOrEmpty(targetTag)) { if (other.CompareTag(targetTag)) valid = true; } if (!requireRaftDamageReceiver && string.IsNullOrEmpty(targetTag)) { valid = true; } return valid; } private IEnumerator TriggerRoutine() { if (triggerDelay > 0f) yield return new WaitForSeconds(triggerDelay); if (stalactites == null || stalactites.Length == 0) { if (showDebugLog) Debug.LogWarning("[StalactiteFallTrigger] 연결된 FallingStalactite가 없습니다.", this); yield break; } foreach (FallingStalactite stalactite in stalactites) { if (stalactite == null) continue; stalactite.TriggerFall(); if (intervalBetweenStalactites > 0f) yield return new WaitForSeconds(intervalBetweenStalactites); } triggerRoutine = null; } public void ResetTrigger() { hasTriggered = false; if (triggerRoutine != null) { StopCoroutine(triggerRoutine); triggerRoutine = null; } if (showDebugLog) Debug.Log($"[StalactiteFallTrigger] {name} 리셋", this); } }