Unity如何检测触发触发器的对象 实现按F键消灭近距离敌人功能
问题修复方案
你的代码存在的核心问题
- 回调参数类型错误:Unity 3D触发器的进入回调
OnTriggerEnter的参数类型应为Collider而非自定义的Trigger,类型不匹配会导致回调完全不触发。 - 输入检测逻辑位置错误:
OnTriggerEnter仅在物体进入触发器的单帧执行,几乎不可能刚好和你按F键的时机重合,所以检测不到输入是必然的。 - 语法与逻辑错误:逻辑判断应该用短路与运算符
&&,你用的&是位运算符;同时代码里的Enemy变量未定义,手动声明多个敌人变量的写法冗余且不可扩展。 - 未持有当前碰撞的敌人对象引用:你不需要提前声明所有敌人变量,直接通过碰撞信息就能拿到对应的敌人对象。
修正后的实现逻辑
核心思路:用一个集合动态存储当前处于攻击范围内的所有敌人,每帧检测F键按下,按下时直接对范围内的敌人执行消失操作。
using UnityEngine; using System.Collections.Generic; public class PlayerCombat : MonoBehaviour { // 存储当前处于攻击范围内的所有敌人 private HashSet<GameObject> enemiesInRange = new HashSet<GameObject>(); private void Update() { // 每帧检测F键按下(GetKeyDown仅触发按下的第一帧,避免连续触发) if (Input.GetKeyDown(KeyCode.F)) { // 遍历范围内所有敌人,执行隐藏操作,需要销毁可替换为Destroy(enemy) foreach (var enemy in enemiesInRange) { enemy.SetActive(false); } // 操作完成后清空范围内的敌人集合 enemiesInRange.Clear(); } } // 敌人进入触发器时加入集合 private void OnTriggerEnter(Collider other) { if (other.CompareTag("Enemy")) { enemiesInRange.Add(other.gameObject); } } // 敌人离开触发器时从集合移除 private void OnTriggerExit(Collider other) { if (other.CompareTag("Enemy")) { enemiesInRange.Remove(other.gameObject); } } }
额外配置检查项
- 确保玩家的触发器球体勾选了
Is Trigger选项,且玩家对象挂载了Rigidbody组件(Unity触发器回调要求碰撞双方至少有一方带有Rigidbody)。 - 确保所有敌人对象都挂载了碰撞体,且Tag设置为
Enemy。 - 如果需要单次按F仅消灭单个敌人,遍历集合时只取第一个元素操作即可,不需要处理全部元素。
内容的提问来源于stack exchange,提问作者HashDankHog
相关产品推荐
相关产品推荐

