Unity玩家移动速度莫名从1变为0.07问题求助
问题:PlayerController中moveSpeed莫名从1变为0.07的解决方法
问题根源
你在FixedUpdate方法里调用rb.Cast时,错误地使用了**赋值运算符=**来定义射线投射的最大距离,这直接把moveSpeed的值覆盖成了Time.fixedDeltaTime + collisionOffset的结果(Unity默认Time.fixedDeltaTime为0.02,加上0.05的collisionOffset正好是0.07),这就是数值突变的原因。
// 错误代码:这里用了=,直接修改了moveSpeed的值 int count = rb.Cast( movementInput, movementFilter, castCollisions, moveSpeed = Time.fixedDeltaTime + collisionOffset);
修复方案
把赋值运算符=改成乘法+加法的表达式,计算本次固定帧更新中玩家可移动的最大距离(速度×固定时间步长 + 碰撞偏移),不要修改moveSpeed本身:
// 修正后的代码:用表达式计算投射距离,不修改moveSpeed int count = rb.Cast( movementInput, movementFilter, castCollisions, moveSpeed * Time.fixedDeltaTime + collisionOffset);
完整修正后的PlayerController代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; public class PlayerController : MonoBehaviour { public float moveSpeed = 1f; public float collisionOffset = 0.05f; public ContactFilter2D movementFilter; Vector2 movementInput; Rigidbody2D rb; List<RaycastHit2D> castCollisions = new List<RaycastHit2D>(); void Start() { rb = GetComponent<Rigidbody2D>(); } void FixedUpdate() { if(movementInput != Vector2.zero) { int count = rb.Cast( movementInput, movementFilter, castCollisions, moveSpeed * Time.fixedDeltaTime + collisionOffset); if(count == 0) { rb.MovePosition(rb.position + movementInput * moveSpeed * Time.fixedDeltaTime); } } } void OnMove(InputValue movementValue) { movementInput = movementValue.Get<Vector2>(); } }
额外说明
因为moveSpeed是public变量,Unity编辑器的Inspector面板设置会覆盖代码默认值,但你之前的赋值操作会在运行时强制修改这个变量,导致编辑器设置失效。修复后,moveSpeed会保持你在编辑器中设置的数值,正常参与移动计算。
内容的提问来源于stack exchange,提问作者TheGamerGod
相关产品推荐
相关产品推荐

