62 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using UnityEngine;
 | |
| 
 | |
| [RequireComponent(typeof(Collider))]
 | |
| public class TeleportPoint : MonoBehaviour
 | |
| {
 | |
|     [Header("Destination")]
 | |
|     public Transform destination;                 // set this to SkyCity_Spawn or any target
 | |
| 
 | |
|     [Header("Filtering")]
 | |
|     public string requiredTag = "Player";         // only teleport objects with this tag
 | |
| 
 | |
|     [Header("Behavior")]
 | |
|     public bool matchRotation = true;
 | |
|     [Tooltip("Shared ID for A<->B portals to avoid instant ping-pong.")]
 | |
|     public string portalId = "SkyCityGate";
 | |
|     [Tooltip("Seconds the entity cannot re-trigger a portal after using one.")]
 | |
|     public float reentryCooldown = 0.5f;
 | |
| 
 | |
|     private void Reset()
 | |
|     {
 | |
|         var c = GetComponent<Collider>();
 | |
|         c.isTrigger = true;
 | |
|     }
 | |
| 
 | |
|     private void OnTriggerEnter(Collider other)
 | |
|     {
 | |
|         if (!IsAllowed(other.gameObject)) return;
 | |
| 
 | |
|         var tm = TeleportManager.Instance;
 | |
|         if (tm == null) { Debug.LogWarning("[TeleportPoint] No TeleportManager in scene."); return; }
 | |
| 
 | |
|         if (!tm.CanUsePortal(other.gameObject, portalId, reentryCooldown)) return;
 | |
| 
 | |
|         tm.MarkUsed(other.gameObject, portalId, reentryCooldown);
 | |
|         tm.Teleport(other.gameObject, destination, matchRotation);
 | |
|     }
 | |
| 
 | |
|     private bool IsAllowed(GameObject go)
 | |
|     {
 | |
|         if (!string.IsNullOrEmpty(requiredTag) && !go.CompareTag(requiredTag))
 | |
|             return false;
 | |
| 
 | |
|         if (destination == null)
 | |
|         {
 | |
|             Debug.LogWarning($"[TeleportPoint] '{name}' has no destination assigned.");
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
| #if UNITY_EDITOR
 | |
|     private void OnDrawGizmos()
 | |
|     {
 | |
|         if (destination == null) return;
 | |
|         Gizmos.color = Color.cyan;
 | |
|         Gizmos.DrawWireSphere(transform.position, 0.3f);
 | |
|         Gizmos.DrawLine(transform.position, destination.position);
 | |
|         Gizmos.DrawWireSphere(destination.position, 0.3f);
 | |
|     }
 | |
| #endif
 | |
| } |