Unity玩家单次Teleport功能异常求助:落地后方可再次使用
修复Teleport单次使用+落地重置功能
原脚本核心问题
- 条件判断错误:
if (canTeleport = true && Input.GetMouseButtonDown(0))里的=是赋值运算符,而非比较运算符,导致canTeleport被强制设为true,权限控制完全失效。 - 死循环冻结:while循环里的
ground_check是局部变量,仅在调用t_PORT时获取一次值,不会随游戏帧更新,一旦进入循环就会无限阻塞游戏。 - 未利用现有落地事件: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; } }
关键修改说明
- 输入检测移至Update:
Input.GetMouseButtonDown是帧相关输入,必须在Update方法中处理才能准确捕获点击事件。 - 用落地事件替代循环检测:直接监听CharacterController2D的
OnLandEvent,玩家落地时自动重置canTeleport,无需手动轮询状态。 - 修复条件判断逻辑:用
canTeleport直接作为判断条件,替代错误的赋值操作。 - 修正Z轴偏移问题:添加
worldPosition.z = transform.position.z,避免2D角色因坐标转换导致的渲染异常。
事件绑定方式(二选一)
- 代码自动绑定:脚本中
characterController2D.OnLandEvent.AddListener(OnPlayerLand);已完成绑定,无需额外操作。 - 手动绑定:在Unity编辑器中选中玩家对象,找到CharacterController2D组件,在
OnLandEvent的下拉菜单中添加Teleport脚本的OnPlayerLand方法。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

