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.
相关产品推荐
相关产品推荐

