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
|
|
} |