Files
WhaleAdventure_VR/Assets/02_Scripts/Cave/StalactiteFallTrigger.cs
2026-06-23 17:17:00 +09:00

143 lines
3.7 KiB
C#

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<Collider>();
if (col != null)
col.isTrigger = true;
}
private void Awake()
{
Collider col = GetComponent<Collider>();
if (col != null)
col.isTrigger = true;
if (stalactites == null || stalactites.Length == 0)
{
stalactites = GetComponentsInChildren<FallingStalactite>(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<RaftDamageReceiver>();
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);
}
}