You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:15:43