using UnityEngine; public class TunnelNode : MonoBehaviour, IInteractable { public bool isTop; [SerializeField] private TunnelNode partnerNode; // 같은 프리팹 내 반대쪽 노드 // [자동 연결] 닿아있는 다른 터널의 노드 private TunnelNode neighborNode; // 물리적으로 닿으면 자동으로 연결 고리 생성 private void OnTriggerEnter(Collider other) { if (other.TryGetComponent(out var neighbor)) { // 상단 노드는 하단 노드와만, 하단은 상단과만 연결 (잘못된 조립 방지) if (this.isTop != neighbor.isTop) { neighborNode = neighbor; } } } private void OnTriggerExit(Collider other) { if (other.TryGetComponent(out var neighbor)) { if (neighborNode == neighbor) neighborNode = null; } } public void Interact(GameObject player) { // 내가 체인의 끝단(입구/출구)일 때만 작동 if (neighborNode != null) return; // 반대쪽 끝 노드를 찾아서 이동 요청 TunnelNode endNode = FindUltimateEndNode(); if (player.TryGetComponent(out var traveler)) { traveler.StartTravel(endNode.transform.position, !endNode.isTop); } } private TunnelNode FindUltimateEndNode() { TunnelNode current = this; // [연결 고리 추적] 파트너 -> 이웃 -> 파트너 -> 이웃... while (true) { // 1. 현재 노드의 프리팹 반대쪽(파트너)으로 이동 TunnelNode partner = current.partnerNode; // 2. 파트너와 연결된 다음 터널의 노드가 있는지 확인 if (partner.neighborNode != null) { current = partner.neighborNode; // 다음 터널로 점프 } else { return partner; // 더 이상 연결이 없으면 파트너가 최종 목적지 } } } // 디버깅: 연결 상태를 씬 뷰에서 확인 private void OnDrawGizmos() { Gizmos.color = isTop ? Color.cyan : Color.blue; Gizmos.DrawWireSphere(transform.position, 0.2f); if (neighborNode != null) { Gizmos.color = Color.red; Gizmos.DrawLine(transform.position, neighborNode.transform.position); } } }