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

Unity空战游戏:如何检测敌机进出导弹锁定锥并实现多目标锁定?

Unity 3D空战游戏多目标导弹锁定实现方案

一、核心数据结构设计

不要维护两个独立的“待锁定”和“已锁定”列表,建议用字典+自定义状态类统一跟踪所有目标的锁定状态,避免重复管理元素的冗余操作:

// 跟踪单个敌机的锁定数据
public class LockTrackingData
{
    public EnemyAircraft Target; // 敌机引用
    public float LockTimer; // 当前锁定计时
    public bool IsLocked; // 是否已完成锁定
}

// 玩家脚本中声明跟踪字典
private Dictionary<EnemyAircraft, LockTrackingData> _lockTrackingDict = new Dictionary<EnemyAircraft, LockTrackingData>();

二、锁定区域检测优化

放弃锥形碰撞体方案,改用向量夹角计算实现精准的锁定锥检测,完全匹配“前方锥形区域”的需求:
每帧执行以下逻辑筛选符合条件的敌机:

// 获取所有敌机(可通过对象池、标签或全局管理器获取)
List<EnemyAircraft> allEnemies = EnemyManager.Instance.GetAllEnemies();
List<EnemyAircraft> enemiesInLockZone = new List<EnemyAircraft>();

float lockConeAngle = 30f; // 锁定锥半角(可调整)
float maxLockDistance = 1000f; // 最大锁定距离

foreach(var enemy in allEnemies)
{
    if(enemy == null || !enemy.IsAlive) continue;
    
    // 计算玩家到敌机的向量
    Vector3 dirToEnemy = enemy.transform.position - transform.position;
    float distanceToEnemy = dirToEnemy.magnitude;
    
    // 判断是否在锁定锥内:夹角小于阈值且距离在有效范围
    if(distanceToEnemy <= maxLockDistance && 
       Vector3.Angle(transform.forward, dirToEnemy.normalized) <= lockConeAngle)
    {
        enemiesInLockZone.Add(enemy);
    }
}

三、锁定状态流转逻辑

基于每帧获取的enemiesInLockZone,更新跟踪字典中的状态:

  1. 处理已跟踪但离开区域的目标:
// 收集需要移除的无效目标
List<EnemyAircraft> targetsToRemove = new List<EnemyAircraft>();
foreach(var pair in _lockTrackingDict)
{
    EnemyAircraft enemy = pair.Key;
    LockTrackingData data = pair.Value;
    
    if(!enemiesInLockZone.Contains(enemy) || !enemy.IsAlive)
    {
        targetsToRemove.Add(enemy);
        continue;
    }
    
    // 目标仍在区域内,更新计时
    if(!data.IsLocked)
    {
        data.LockTimer += Time.deltaTime;
        // 达到锁定阈值,切换为已锁定状态
        if(data.LockTimer >= 2f) // 2秒锁定时间,可调整
        {
            data.IsLocked = true;
            // 触发锁定成功的UI/音效反馈
            OnTargetLocked(enemy);
        }
    }
}

// 移除无效目标
foreach(var enemy in targetsToRemove)
{
    _lockTrackingDict.Remove(enemy);
    // 触发解锁的UI/音效反馈
    OnTargetUnlocked(enemy);
}
  1. 添加新进入区域的目标:
foreach(var enemy in enemiesInLockZone)
{
    if(!_lockTrackingDict.ContainsKey(enemy))
    {
        _lockTrackingDict.Add(enemy, new LockTrackingData()
        {
            Target = enemy,
            LockTimer = 0f,
            IsLocked = false
        });
    }
}

四、多目标锁定的稳定性处理

  • 锁定缓冲机制:给离开区域的目标增加短暂缓冲时间(比如1秒),若缓冲时间内回到区域则保留计时,避免频繁解锁锁定。
  • 最大锁定数限制:设定同时锁定的最大目标数(比如4个),当待锁定目标超过上限时,优先保留距离更近、角度更小的目标,替换优先级低的待锁定条目。
  • 目标销毁处理:在敌机的销毁逻辑中,主动通知玩家脚本移除对应跟踪数据,避免空引用错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:30:32