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

Unity中如何让子弹数组分别追踪对应Enemy数组中的目标?

Unity子弹追踪敌人功能修复与实现

错误原因梳理

你的代码出现的三个错误具体原因:

  • CS0103:未定义bulletRotation变量,且缺少GenerateSpawnPosition方法实现
  • CS7036:调用BulletMove()时未传入方法要求的GameObject[]参数,且该方法的参数设计不合理(不需要数组,单个敌人对象即可)
  • CS1061:enemy.transform调用错误,因为参数是数组类型,数组没有transform属性

修复与实现方案

要实现"每波生成对应数量子弹,每颗子弹追踪一个敌人"的逻辑,需要拆分职责:SpawnManager负责生成敌人和子弹并分配追踪目标,单独写一个子弹控制器处理追踪逻辑。

1. 新增BulletController脚本(挂载到子弹预制体)

这个脚本负责让子弹持续追踪绑定的敌人目标:

using UnityEngine;

public class BulletController : MonoBehaviour
{
    public GameObject targetEnemy;
    public float bulletSpeed;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        if (targetEnemy != null)
        {
            // 计算朝向敌人的方向
            Vector3 lookDirection = (targetEnemy.transform.position - transform.position).normalized;
            // 施加力让子弹向敌人移动
            rb.AddForce(lookDirection * bulletSpeed);
        }
        else
        {
            // 敌人已被销毁,销毁子弹
            Destroy(gameObject);
        }
    }
}

2. 修正SpawnManager脚本

修复错误并实现正确的波次生成、子弹-敌人绑定逻辑:

using UnityEngine;
using System.Collections.Generic;

public class SpawnManager : MonoBehaviour
{
    public GameObject powerupPrefab;
    public GameObject[] enemyPrefab;
    public GameObject bulletPrefab; // 重命名为bulletPrefab更清晰
    public GameObject player;

    private float spawnRange = 9;
    public float bulletSpeed;

    public int enemyCount;
    public int waveNumber;
    private List<GameObject> currentWaveEnemies = new List<GameObject>(); // 存储当前波次的敌人

    void Start()
    {
        // 第一波直接生成
        waveNumber = 1;
        SpawnEnemyWave(waveNumber);
        SpawnBulletsForCurrentWave();
    }

    void Update()
    {
        enemyCount = GameObject.FindGameObjectsWithTag("Enemy").Length;

        if (enemyCount == 0)
        {
            waveNumber++;
            currentWaveEnemies.Clear(); // 清空上一波敌人列表
            SpawnEnemyWave(waveNumber);
            SpawnBulletsForCurrentWave(); // 敌人生成后生成对应子弹
        }
    }

    // 生成当前波次的子弹,每个子弹绑定一个敌人
    void SpawnBulletsForCurrentWave()
    {
        for (int i = 0; i < currentWaveEnemies.Count; i++)
        {
            // 从玩家位置生成子弹
            GameObject newBullet = Instantiate(bulletPrefab, player.transform.position, Quaternion.identity);
            BulletController bulletController = newBullet.GetComponent<BulletController>();
            if (bulletController != null)
            {
                bulletController.targetEnemy = currentWaveEnemies[i];
                bulletController.bulletSpeed = bulletSpeed;
            }
        }
    }

    // 生成敌人波次,同时记录当前波次的敌人
    void SpawnEnemyWave(int enemiesToSpawn)
    {
        for (int i = 0; i < enemiesToSpawn; i++)
        {
            int enemyIndex = Random.Range(0, enemyPrefab.Length);
            GameObject spawnedEnemy = Instantiate(enemyPrefab[enemyIndex], GenerateSpawnPosition(), enemyPrefab[enemyIndex].transform.rotation);
            currentWaveEnemies.Add(spawnedEnemy); // 添加到当前波次敌人列表
        }
    }

    // 实现随机生成位置方法
    Vector3 GenerateSpawnPosition()
    {
        float spawnPosX = Random.Range(-spawnRange, spawnRange);
        float spawnPosZ = Random.Range(-spawnRange, spawnRange);
        return new Vector3(spawnPosX, 0, spawnPosZ);
    }
}

关键逻辑说明

  • 用currentWaveEnemies列表存储每波生成的敌人,确保每个子弹能精准绑定到当前波的敌人
  • 子弹的追踪逻辑放到独立的BulletController中,符合单一职责原则,避免SpawnManager逻辑臃肿
  • 只在波次切换(敌人全部消灭)时生成新的子弹,不会在Update每帧重复生成
  • 子弹生成位置改为玩家位置,更符合射击逻辑(你也可以根据需求调整)
  • 当敌人被销毁时,子弹会自动销毁,避免无效子弹残留

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:20:28