Unity中物体到达z=4时控制台未打印日志的原因排查
问题原因与解决方案
核心原因:浮点数精度误差
transform.position.z是浮点数类型,你每次移动的步长transform.forward * Time.deltaTime也是浮点数。由于浮点数的存储和计算存在精度限制,物体的z坐标几乎不可能精确等于4.0——它大概率会从略小于4的数值直接跳到略大于4的数值,完美跳过了transform.position.z == 4的判断条件,所以控制台不会输出日志。
可行解决方案
方案1:使用范围判断覆盖精度误差
通过判断z坐标是否接近目标值(设置一个极小的误差范围),来触发日志打印:
void Update() { // 当z坐标和4的差值小于0.001时,判定为到达目标位置 if (Mathf.Abs(transform.position.z - 4f) < 0.001f) { Debug.Log("we are here"); } if (transform.position.z < 4f) { transform.position += transform.forward * Time.deltaTime; } }
注意:这种方式可能会在多帧内重复触发日志,若要避免,可以额外添加一个布尔变量标记是否已经打印过。
方案2:使用状态标记触发一次日志
设置一个状态变量,当物体第一次到达或超过目标位置时打印日志,之后不再触发:
// 标记是否已经到达过目标位置 private bool hasReachedTarget = false; void Update() { if (!hasReachedTarget && transform.position.z >= 4f) { Debug.Log("we are here"); hasReachedTarget = true; } // 未到达目标时才继续移动 if (!hasReachedTarget) { transform.position += transform.forward * Time.deltaTime; } }
这个方案更可靠,既解决了精度问题,又能避免重复打印日志。
内容的提问来源于stack exchange,提问作者A111
相关产品推荐
相关产品推荐

