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

Unity玩家单次Teleport功能异常求助:落地后方可再次使用

修复Teleport单次使用+落地重置功能

原脚本核心问题

  1. 条件判断错误:if (canTeleport = true && Input.GetMouseButtonDown(0))里的=是赋值运算符,而非比较运算符,导致canTeleport被强制设为true,权限控制完全失效。
  2. 死循环冻结:while循环里的ground_check是局部变量,仅在调用t_PORT时获取一次值,不会随游戏帧更新,一旦进入循环就会无限阻塞游戏。
  3. 未利用现有落地事件:CharacterController2D已经内置了OnLandEvent落地回调,无需手动循环检测落地状态。

修正后的Teleport脚本

using UnityEngine;

public class Teleport : MonoBehaviour {
    private CharacterController2D characterController2D;
    public bool canTeleport = true;

    void Awake()
    {
        characterController2D = GetComponent<CharacterController2D>();
        // 绑定落地事件,玩家落地时自动重置Teleport权限
        characterController2D.OnLandEvent.AddListener(OnPlayerLand);
    }

    void Update()
    {
        // 正确判断:Teleport权限开启 + 鼠标左键按下
        if (canTeleport && Input.GetMouseButtonDown(0)) 
        {
            Vector2 screenPosition = Input.mousePosition;
            Vector2 worldPosition = Camera.main.ScreenToWorldPoint(screenPosition);
            // 固定Z轴位置,避免2D角色被移到错误渲染层
            worldPosition.z = transform.position.z;
            transform.position = worldPosition;
            // Teleport后立即禁用权限
            canTeleport = false;
        }
    }

    // 落地时触发的回调方法
    private void OnPlayerLand()
    {
        canTeleport = true;
    }
}

关键修改说明

  1. 输入检测移至Update:Input.GetMouseButtonDown是帧相关输入,必须在Update方法中处理才能准确捕获点击事件。
  2. 用落地事件替代循环检测:直接监听CharacterController2D的OnLandEvent,玩家落地时自动重置canTeleport,无需手动轮询状态。
  3. 修复条件判断逻辑:用canTeleport直接作为判断条件,替代错误的赋值操作。
  4. 修正Z轴偏移问题:添加worldPosition.z = transform.position.z,避免2D角色因坐标转换导致的渲染异常。

事件绑定方式(二选一)

  1. 代码自动绑定:脚本中characterController2D.OnLandEvent.AddListener(OnPlayerLand);已完成绑定,无需额外操作。
  2. 手动绑定:在Unity编辑器中选中玩家对象,找到CharacterController2D组件,在OnLandEvent的下拉菜单中添加Teleport脚本的OnPlayerLand方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:20:38