You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity传送门冷却功能异常:传送后瞬间返回且状态反复切换

传送门冷却与来回传送问题解决方案

问题根源

  1. 传送后玩家直接落在目标传送门的触发区域内,触发对方的OnTriggerEnter2D方法,导致被立刻传回。
  2. 原代码先等待再执行传送,这段时间玩家持续处于触发范围内,会重复启动协程,造成justTeleported状态反复切换。
  3. 在字段初始化阶段调用FindGameObjectWithTag,容易因场景加载顺序问题出现空引用。

修正代码

public Transform Destination;
private GameObject Player;
private bool isOnCooldown; // 冷却状态标记

void Start()
{
    // 将玩家查找移至Start方法,避免空引用风险
    Player = GameObject.FindGameObjectWithTag("Player");
    isOnCooldown = false;
}

private void OnTriggerEnter2D(Collider2D coll)
{
    // 使用CompareTag比直接判断tag性能更优
    if (coll.CompareTag("Player") && !isOnCooldown)
    {
        StartCoroutine(TeleportWithCooldown());
    }
}

IEnumerator TeleportWithCooldown()
{
    // 立即标记为冷却中,阻止重复触发
    isOnCooldown = true;
    
    // 临时禁用玩家碰撞体,避免传送后立刻触发目标传送门
    var playerCollider = Player.GetComponent<Collider2D>();
    playerCollider.enabled = false;
    
    // 执行传送操作
    Player.transform.position = Destination.position;
    
    // 短暂等待确保玩家离开目标传送门触发范围,再恢复碰撞体
    yield return new WaitForSeconds(0.1f);
    playerCollider.enabled = true;
    
    // 5秒冷却结束后解除标记
    yield return new WaitForSeconds(5f);
    isOnCooldown = false;
}

关键修改点

  • 碰撞体临时禁用:传送前关闭玩家碰撞体,短暂延迟后恢复,从根源上避免触发目标传送门的检测逻辑。
  • 冷却逻辑调整:先标记冷却状态再执行传送,杜绝等待期间重复触发协程的问题。
  • 玩家获取优化:将FindGameObjectWithTag移至Start方法,规避场景加载顺序导致的空引用问题。

如果不想禁用碰撞体,也可以将传送位置轻微偏移,例如改为Destination.position + new Vector3(0, 0.6f, 0)(根据你的2D场景方向调整),确保玩家不在目标传送门的触发范围内。

内容的提问来源于stack exchange,提问作者retnuH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:40:31