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

Unity布尔值为真时调用函数及碰撞5秒物体上升仅生效一次求解

问题根因

  • 逻辑仅能触发一次的核心原因是isCreated变量第一次位移执行后被设置为true,全程没有重置逻辑,后续再满足碰撞时长条件也无法进入位移代码块。
  • 额外冗余问题:Unity的OnGUI是引擎自带的生命周期回调,会自动每帧调用多次,你在Update中手动调用属于多余操作,反而会增加额外开销。
  • 你当前的位移逻辑完全不需要放在OnGUI中执行,没有任何GUI渲染相关的操作,属于逻辑放错了位置。

修复代码

如果需求是每次持续碰撞满5秒,物体就向上移动2米,碰撞结束后重置状态等待下次触发,可以直接简化代码如下:

public float elapsedTime = 0f;
bool hasMoved = false;

void OnTriggerStay(Collider other)
{
    elapsedTime += Time.deltaTime;
    // 满足时长且还未执行过本次碰撞的位移逻辑时才执行
    if (elapsedTime >= 5.0f && !hasMoved)
    {
        Vector3 newPos = transform.position;
        newPos.y += 2f;
        transform.position = newPos;
        hasMoved = true;
    }
}

void OnTriggerExit(Collider other)
{
    // 退出碰撞时重置所有状态,下次碰撞可以正常触发
    elapsedTime = 0f;
    hasMoved = false;
}

如果需求是碰撞结束后物体要回到初始位置,只需要在OnTriggerExit中加对应的位置重置逻辑即可。

内容的提问来源于stack exchange,提问作者MaD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:21:03