Unity瓦片式玩家移动功能失效问题求助
问题分析与修复方案
你的代码存在两个核心问题,直接导致瓦片式移动功能失效:
1. 输入判断逻辑完全颠倒
Update方法里的if (isMoving)条件写反了——玩家正在移动时(isMoving为true)应该禁止接收新输入,只有未移动时(isMoving为false)才处理输入触发移动。原代码中只有移动状态下才读取输入,而初始状态isMoving为false,直接导致输入逻辑完全不执行。
2. 输入值未适配瓦片移动需求
GetAxis返回的是-1到1之间的平滑过渡值(比如按方向键会从0缓慢变化到目标值),这会让目标位置不是整格的瓦片坐标,移动后会偏离网格。瓦片移动需要用GetAxisRaw获取离散的-1/0/1值,保证每次移动都是整格跳转。
修复后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { public float moveSpeed; private bool isMoving; private Vector2 input; private void Update() { // 仅在未移动时处理输入 if (!isMoving) { // 获取离散方向值,适配瓦片移动 input.x = Input.GetAxisRaw("Horizontal"); input.y = Input.GetAxisRaw("Vertical"); // 可选:限制单方向移动,避免斜向跨格(需要斜向可删除此行) if (input.x != 0) input.y = 0; if (input != Vector2.zero) { // 计算目标位置(假设瓦片单位大小为1,非1则乘以对应边长) Vector3 targetPos = transform.position; targetPos.x += input.x; targetPos.y += input.y; StartCoroutine(Move(targetPos)); } } } IEnumerator Move(Vector3 targetPos) { isMoving = true; // 平滑移动至目标点 while ((targetPos - transform.position).sqrMagnitude > Mathf.Epsilon) { transform.position = Vector3.MoveTowards(transform.position, targetPos, moveSpeed * Time.deltaTime); yield return null; } // 修正浮点误差,强制对齐目标位置 transform.position = targetPos; isMoving = false; } }
额外检查项
- 确认Inspector面板中
moveSpeed设置了合理数值(建议5-10,数值过小会导致移动不明显)。 - 如果你的瓦片尺寸不是1单位,需要将
input.x/y乘以瓦片的实际边长(比如瓦片是2x2,就改成targetPos.x += input.x * 2)。
内容的提问来源于stack exchange,提问作者Jheyson Superlano
相关产品推荐
相关产品推荐

