Unity传送门冷却功能异常:传送后瞬间返回且状态反复切换
传送门冷却与来回传送问题解决方案
问题根源
- 传送后玩家直接落在目标传送门的触发区域内,触发对方的
OnTriggerEnter2D方法,导致被立刻传回。 - 原代码先等待再执行传送,这段时间玩家持续处于触发范围内,会重复启动协程,造成
justTeleported状态反复切换。 - 在字段初始化阶段调用
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
相关产品推荐
相关产品推荐

