Unity 2D屏幕速度表始终显示0的解决求助(附代码)
Unity 2D速度表始终显示0的解决方法
先检查基础配置
- 确认脚本挂载在带
Rigidbody2D组件的游戏物体上,且Inspector面板里的text变量已经拖入了对应的Text组件。 - 如果物体没有
Rigidbody2D,直接添加一个,注意把运动类型设为Dynamic(静态物体不会产生物理速度)。
- 确认脚本挂载在带
修复代码逻辑
你的代码存在几个问题:一是每帧调用GetComponent<Rigidbody2D>()浪费性能,二是没把Unity默认的米/秒单位转换成公里/小时,三是如果物体不是靠Rigidbody物理驱动移动,velocity会一直是0。下面分两种场景给你修改后的代码:
场景1:物体靠Rigidbody2D物理运动(比如加力、重力)
using UnityEngine; using UnityEngine.UI; public class Speedometer : MonoBehaviour { public Text speedText; private Rigidbody2D rb2D; void Start() { // 提前获取组件,避免重复调用 rb2D = GetComponent<Rigidbody2D>(); // 初始化显示 speedText.text = "0 km/h"; } void FixedUpdate() { // 把m/s转成km/h(乘以3.6),保留1位小数 float currentSpeed = rb2D.velocity.magnitude * 3.6f; speedText.text = $"{currentSpeed:F1} km/h"; } }场景2:物体靠Transform直接移动(比如代码里改position)
这种情况Rigidbody的velocity会是0,得用位移差计算速度:
using UnityEngine; using UnityEngine.UI; public class Speedometer : MonoBehaviour { public Text speedText; private Vector3 lastPosition; void Start() { lastPosition = transform.position; speedText.text = "0 km/h"; } void FixedUpdate() { // 计算两帧位移差,转成速度后再转km/h float distance = Vector3.Distance(transform.position, lastPosition); float currentSpeed = (distance / Time.fixedDeltaTime) * 3.6f; speedText.text = $"{currentSpeed:F1} km/h"; // 更新上一帧位置 lastPosition = transform.position; } }额外注意
如果还是显示0,检查物体是否真的在移动——比如运行游戏时看Inspector里物体的position或Rigidbody的velocity数值有没有变化,排除物体没动的情况。
内容的提问来源于stack exchange,提问作者Feynman Jr.
相关产品推荐
相关产品推荐

