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

Unity中如何为传送门触发函数设置冷却时间以避免对象循环传送?

解决Unity传送门循环的两种简单方案

嘿,这个问题太典型了——我当初刚学Unity做传送门的时候也踩过这个坑😆。原因很简单:当你的球体被传送到另一个传送门的位置时,它立刻进入了对方的触发范围,触发了OnTriggerEnter,于是又被传回来,就这样无限循环了。

给你两种简单易懂的解决方案,选你觉得顺手的就行:


方案一:给传送门加冷却时间

这个方法最直接,给每个传送门设置一段“冷却期”,传送之后在这段时间内不会再次触发传送逻辑。

修改你的Portal脚本如下:

using System.Collections;
using UnityEngine;

public class Portal : MonoBehaviour {
    public Transform spawnPoint;
    public float cooldownTime = 0.6f; // 可调整的冷却时间,建议0.5-1秒
    private bool _isOnCooldown = false;

    void OnTriggerEnter(Collider other) {
        // 如果不在冷却中,才执行传送
        if (!_isOnCooldown) {
            other.transform.position = spawnPoint.position;
            // 启动冷却协程
            StartCoroutine(ActivateCooldown());
        }
    }

    // 用协程控制冷却状态
    IEnumerator ActivateCooldown() {
        _isOnCooldown = true;
        yield return new WaitForSeconds(cooldownTime);
        _isOnCooldown = false;
    }
}

原理说明:

  • 当触发传送时,先检查_isOnCooldown的状态,只有未冷却时才执行传送
  • 传送完成后,启动一个协程,在设定的cooldownTime后解除冷却
  • 这段时间足够球体离开传送门的触发范围,不会立刻被另一个传送门检测到

方案二:给被传送的物体加“免疫标记”

这个方法更灵活,适合场景里有多个传送门的情况——给刚被传送的物体加一个临时标记,标记存在期间不会被任何传送门触发。

步骤1:新建一个PortalImmunity脚本

using UnityEngine;

public class PortalImmunity : MonoBehaviour {
    // 这个脚本只是作为“刚被传送”的标记,不需要额外逻辑
}

步骤2:修改你的Portal脚本

using UnityEngine;

public class Portal : MonoBehaviour {
    public Transform spawnPoint;
    public float immunityDuration = 0.5f; // 免疫持续时间

    void OnTriggerEnter(Collider other) {
        // 检查物体是否有免疫标记,没有才传送
        if (!other.GetComponent<PortalImmunity>()) {
            // 添加免疫标记
            PortalImmunity immunity = other.gameObject.AddComponent<PortalImmunity>();
            // 传送物体
            other.transform.position = spawnPoint.position;
            // 延迟自动移除免疫标记
            Destroy(immunity, immunityDuration);
        }
    }
}

原理说明:

  • 当物体被传送时,给它添加一个PortalImmunity组件作为标记
  • 另一个传送门检测到物体有这个组件时,就跳过传送逻辑
  • 过了immunityDuration后,这个组件会被自动销毁,物体可以再次被传送

小提示:

  • 两种方案的时间参数(cooldownTime/immunityDuration)可以根据你的球体移动速度调整,确保物体完全离开传送门触发范围后再恢复可传送状态
  • 如果你的传送门有旋转效果,记得不仅要传送位置,还要同步物体的旋转(比如other.transform.rotation = spawnPoint.rotation;),这样体验更真实

内容的提问来源于stack exchange,提问作者Bennett O'Neill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:57:29