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

Unity中如何获取OnTriggerStay2D触发的所有碰撞体列表?

问题分析与解决方案

首先你原代码存在几个明显问题:

  1. 方法签名错误:OnTriggerStay2D的参数是Collider2D,而非Collision2D——后者是OnCollisionStay2D的参数类型。
  2. 数组未初始化:直接声明Collider2D[] allEnemiesScannedInThisMethodCall;后就访问索引,会触发空引用错误。
  3. 调用逻辑不符:OnTriggerStay2D每次只会传入一个当前持续碰撞的Collider2D对象,不可能在单次调用中获取所有同时碰撞的敌人列表。

正确实现思路

要实现「挥剑时一次性检测范围内所有敌人,仅命中其中一个」的需求,不能依赖OnTriggerStay2D,而是要在挥剑动作触发的关键时机(比如攻击动画的指定帧、玩家按下攻击键的瞬间),主动调用2D物理检测接口,一次性获取范围内的所有敌人。

示例代码

// 挂载在剑的碰撞体所在对象上的脚本
public class SwordAttack : MonoBehaviour
{
    // 可在Inspector面板调整的检测参数
    public Vector2 attackRangeSize;
    public Vector2 attackRangeOffset;
    public LayerMask enemyLayer;

    // 攻击触发方法:绑定到攻击动画帧事件或玩家攻击按键回调
    public void TriggerAttack()
    {
        // 计算检测范围的中心点(基于剑的位置偏移)
        Vector2 detectionCenter = (Vector2)transform.position + attackRangeOffset;
        
        // 一次性检测范围内所有敌人层级的碰撞体
        Collider2D[] hitEnemies = Physics2D.OverlapBoxAll(
            detectionCenter, 
            attackRangeSize, 
            transform.rotation.z, 
            enemyLayer
        );
        
        // 命中第一个检测到的敌人
        if (hitEnemies.Length > 0)
        {
            hitEnemies[0].GetComponent<Enemy>().getHit(); // 假设Enemy脚本包含getHit方法
        }
    }
}

关键说明

  • 选择合适的检测方法:根据攻击范围形状,可替换为Physics2D.OverlapCircleAll(圆形范围)或Physics2D.OverlapCapsuleAll(胶囊形范围)。
  • 精准触发时机:将TriggerAttack绑定到攻击动画的关键帧(比如挥剑到位的瞬间),保证检测逻辑与视觉动作同步。
  • 层级过滤:通过LayerMask只检测敌人所在层级,避免误触发场景中的其他物体。

为什么不推荐用OnTriggerStay2D?

OnTriggerStay2D是Unity每帧对持续处于触发区内的对象逐一调用的方法——如果同时有3个敌人在触发区,Unity会分3次调用该方法,每次传入一个敌人,既无法在单次调用中获取全部敌人列表,其持续触发的逻辑也不符合「单次挥剑命中」的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:07:02