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

Unity中如何实现OnTriggerEnter事件的多次触发?

Unity虚拟触诊按钮多次触发解决方案

核心问题原因

  • 当前代码仅在触发时将动画层权重设置为1,没有对应重置逻辑,首次触发后动画层持续处于激活状态,后续触发无视觉反馈,看起来像未生效
  • OnTriggerEnter仅在碰撞体首次进入触发区时调用一次,若虚拟手碰撞体未完全离开触发区,不会重复触发回调
  • 无冷却过滤逻辑,单次按压可能被物理引擎检测为多次碰撞,导致异常触发

具体修改方案

第一步:新增控制变量

在按钮挂载的脚本中新增两个全局变量,用于冷却控制:

// 按压冷却时间,可根据实际交互手感调整,单位为秒
public float pressCoolDown = 0.4f;
private bool _isInCoolDown = false;

第二步:完善触发逻辑

补充冷却判断、虚拟手校验、动画重置和冷却重置逻辑,完整代码如下:

private void OnTriggerEnter(Collider other)
{
    // 校验触发对象为虚拟手、且不在冷却期,避免其他物体误触发或者重复触发
    // 请将VirtualHand替换为你项目中虚拟手实际设置的Tag
    if (!other.CompareTag("VirtualHand") || _isInCoolDown) return;

    if (palpation_patient.animation_selection == 6 && palpation_patient.pain_level == 1)
    {
        palpation_patient.animator.SetLayerWeight(1, 1);
    }
    if (palpation_patient.animation_selection == 6 && palpation_patient.pain_level == 2)
    {
        palpation_patient.animator.SetLayerWeight(2, 1);
    }
    if (palpation_patient.animation_selection == 6 && palpation_patient.pain_level == 3)
    {
        palpation_patient.animator.SetLayerWeight(3, 1);
    }

    // 进入冷却,避免单次按压被多次检测
    _isInCoolDown = true;
    Invoke(nameof(ResetButtonState), pressCoolDown);
}

private void ResetButtonState()
{
    // 重置动画层权重和冷却状态
    if (palpation_patient.animation_selection == 6)
    {
        palpation_patient.animator.SetLayerWeight(1, 0);
        palpation_patient.animator.SetLayerWeight(2, 0);
        palpation_patient.animator.SetLayerWeight(3, 0);
    }
    _isInCoolDown = false;
}

必查配置项

  • 确认按钮的碰撞体勾选了Is Trigger属性
  • 确认虚拟手的碰撞体勾选了Is Trigger属性,且挂载了刚体组件,刚体的Use Gravity设置为否、Is Kinematic设置为是
  • 如果需要手离开按钮才重置动画,可以将动画层权重重置的逻辑移到OnTriggerExit回调中即可

内容的提问来源于stack exchange,提问作者Luis B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:54:04