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

Unity中实现带阵营敌对AI:解决自瞄与友军误射问题

解决方案

一、区分阵营,实现敌人只瞄准敌方目标

  1. 定义阵营枚举
    创建新的C#脚本Faction.cs,用枚举统一管理阵营:
public enum Faction
{
    Red,
    Blue,
    Green // 可根据需求新增阵营
}
  1. 给敌人添加阵营标识与目标筛选逻辑
    在敌人的AI脚本(例如EnemyAI.cs)中加入以下代码,实现随机分配阵营、筛选敌方目标:
using UnityEngine;

public class EnemyAI : MonoBehaviour
{
    public Faction ownFaction;
    public float attackRange = 10f;
    public GameObject bulletPrefab;
    public Transform firePoint;

    private GameObject currentTarget;

    void Start()
    {
        // 生成时随机分配阵营
        ownFaction = (Faction)Random.Range(0, System.Enum.GetValues(typeof(Faction)).Length);
    }

    void Update()
    {
        FindEnemyTarget();
        // 目标在攻击范围内时发射子弹
        if (currentTarget != null && Vector2.Distance(transform.position, currentTarget.transform.position) <= attackRange)
        {
            ShootBullet();
        }
    }

    void FindEnemyTarget()
    {
        currentTarget = null;
        // 获取场景中所有带EnemyAI组件的敌人
        EnemyAI[] allEnemies = FindObjectsOfType<EnemyAI>();
        
        foreach (EnemyAI enemy in allEnemies)
        {
            // 排除自身和同阵营友军
            if (enemy != this && enemy.ownFaction != ownFaction)
            {
                currentTarget = enemy.gameObject;
                break; // 新手阶段可先取第一个找到的敌方,后续可优化为选最近目标
            }
        }
    }

    void ShootBullet()
    {
        GameObject bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
        Bullet bulletScript = bullet.GetComponent<Bullet>();
        if (bulletScript != null)
        {
            // 给子弹传递发射方阵营和目标
            bulletScript.shooterFaction = ownFaction;
            bulletScript.target = currentTarget;
        }
        // 子弹发射后脱离父物体,避免跟随发射方移动
        bullet.transform.parent = null;
    }
}

二、让子弹识别发射方,避免攻击友军/自身

替换你的子弹脚本(命名为Bullet.cs)为以下内容:

using UnityEngine;

public class Bullet : MonoBehaviour
{
    public float force = 5f;
    public Faction shooterFaction;
    public GameObject target;
    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        
        if (target != null)
        {
            // 计算朝向目标的方向并设置速度
            Vector3 direction = target.transform.position - transform.position;
            rb.velocity = direction.normalized * force;

            // 调整子弹朝向
            float rot = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
            transform.rotation = Quaternion.Euler(0, 0, rot);
        }
    }

    void OnCollisionEnter2D(Collision2D collision)
    {
        // 检测碰撞对象是否为敌方
        EnemyAI hitEnemy = collision.gameObject.GetComponent<EnemyAI>();
        if (hitEnemy != null && hitEnemy.ownFaction != shooterFaction)
        {
            // 此处添加击中敌方的逻辑,如扣血、销毁敌人
            Destroy(hitEnemy.gameObject);
        }
        // 无论碰撞到地形还是单位,销毁子弹
        Destroy(gameObject);
    }
}

核心逻辑说明

  • 阵营区分:通过枚举Faction给每个敌人标记阵营,筛选目标时仅匹配不同阵营的对象,直接排除自身和友军。
  • 目标传递:由发射方AI提前选好目标并传给子弹,避免子弹自主找目标时出现误判。
  • 脱离父物体:子弹发射后解除与发射方的父子关系,既防止跟随移动,也避免碰撞检测时误识别为发射方的一部分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:17:42