143 lines
3.7 KiB
C#
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);
|
|
}
|
|
} |