using UnityEngine; public class TunnelNode : MonoBehaviour, IInteractable { public TunnelNode aboveNode; public TunnelNode belowNode; // [중요] 이 노드가 속한 터널의 최상단 부모를 캐싱합니다. private Transform _tunnelRoot; void Awake() { // 이름이 "Tunnel"로 시작하는 부모를 찾거나, 단순히 부모의 부모를 참조합니다. // 여기서는 이미지 구조에 맞게 부모(Visual)의 부모(Tunnel (1))를 찾습니다. _tunnelRoot = transform.parent.parent; } public void LinkVertical() { // 루트(Tunnel 1)의 위치로 내 위치 파악 Transform myRoot = transform.parent.parent; Vector3Int myPos = BuildManager.Instance.WorldToGrid3D(myRoot.position); // 위/아래 터널 찾기 TunnelNode targetAbove = BuildManager.Instance.GetTunnelAt(myPos + Vector3Int.up); TunnelNode targetBelow = BuildManager.Instance.GetTunnelAt(myPos + Vector3Int.down); if (targetAbove != null) { this.aboveNode = targetAbove; targetAbove.belowNode = this; // 상대방의 아래도 나로 설정 (양방향) } if (targetBelow != null) { this.belowNode = targetBelow; targetBelow.aboveNode = this; // 상대방의 위도 나로 설정 (양방향) } } private void OnDrawGizmos() { // 연결되었다면 Scene 뷰에서 선을 그림 if (aboveNode != null) { Gizmos.color = Color.blue; Gizmos.DrawLine(transform.position, aboveNode.transform.position); Gizmos.DrawSphere(aboveNode.transform.position, 0.2f); } if (belowNode != null) { Gizmos.color = Color.cyan; Gizmos.DrawLine(transform.position, belowNode.transform.position); Gizmos.DrawSphere(belowNode.transform.position, 0.2f); } } public void Interact(GameObject user) { var traveler = user.GetComponent(); if (traveler && !traveler.IsTraveling) traveler.StartTravel(this); } public string GetInteractionText() => "터널 이용 [E]"; }