Unity中实现带阵营敌对AI:解决自瞄与友军误射问题
解决方案
一、区分阵营,实现敌人只瞄准敌方目标
- 定义阵营枚举
创建新的C#脚本Faction.cs,用枚举统一管理阵营:
public enum Faction { Red, Blue, Green // 可根据需求新增阵营 }
- 给敌人添加阵营标识与目标筛选逻辑
在敌人的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
相关产品推荐
相关产品推荐

