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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:24:03