문달기
This commit is contained in:
143
Assets/02_Scripts/Cave/StalactiteFallTrigger.cs
Normal file
143
Assets/02_Scripts/Cave/StalactiteFallTrigger.cs
Normal file
@@ -0,0 +1,143 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user