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

Unity 2017实现敌方多目标射击功能的Bullet脚本开发求助

问题修复与功能实现方案

现有代码错误点

  • 你声明的target是GameObject[]数组类型,直接调用target.transform属于语法错误,数组本身没有transform属性,必须先指定数组下标取到单个玩家对象才能调用transform
  • 没有预留指定目标的入口,当前代码只能自动查找所有带Player标签的对象,没法实现「指定对象射击」的需求

常用实现方案

方案1:单枚子弹随机选择一个玩家作为目标

这是最通用的实现,敌方每次射击生成一枚子弹,自动从当前存活玩家列表里随机挑选一个作为飞行目标,也支持外部手动指定目标:

using UnityEngine;
using System.Collections;

public class MultiBulletScript : MonoBehaviour {
    // 可在外部手动指定目标,不指定就自动找所有玩家随机选择
    public Transform target;
    public float speed;
    Rigidbody2D bulletRB;
    Vector3 respawn = new Vector3(-36, 0, 0);
    public GameObject blood;

    void Start () {
        bulletRB = GetComponent<Rigidbody2D>();
        // 无外部指定目标时自动查找玩家
        if (target == null)
        {
            GameObject[] allPlayers = GameObject.FindGameObjectsWithTag("Player");
            if (allPlayers.Length > 0)
            {
                int randomIndex = Random.Range(0, allPlayers.Length);
                target = allPlayers[randomIndex].transform;
            }
            else
            {
                // 场景无玩家时直接销毁子弹避免报错
                Destroy(gameObject);
                return;
            }
        }
        // 计算飞行方向
        Vector2 moveDir = (target.position - transform.position).normalized * speed;
        bulletRB.velocity = moveDir;
        Destroy(gameObject, 2f);
    }

    private void OnTriggerEnter2D(Collider2D other) {
        if (other.CompareTag("Player")) {
            Instantiate(blood, transform.position, Quaternion.identity);
            other.transform.position = respawn;
            Destroy(gameObject);
        }

        if (other.CompareTag("Bullet")) {
            Destroy(other.gameObject);
            Destroy(gameObject);
        }
    }
}

方案2:一次射击向所有玩家同时发射子弹

如果需要敌方同时攻击多个目标,只需在敌方的射击脚本中遍历所有玩家,为每个玩家生成一枚单独的子弹,分别指定目标即可,敌方射击脚本示例:

// 挂载在敌方单位上的射击逻辑示例
public class EnemyShoot : MonoBehaviour
{
    public GameObject bulletPrefab;
    public float shootInterval = 2f;
    float timer;

    void Update()
    {
        timer += Time.deltaTime;
        if (timer >= shootInterval)
        {
            timer = 0;
            ShootAllPlayers();
        }
    }

    void ShootAllPlayers()
    {
        GameObject[] allPlayers = GameObject.FindGameObjectsWithTag("Player");
        foreach (var player in allPlayers)
        {
            GameObject bullet = Instantiate(bulletPrefab, transform.position, Quaternion.identity);
            // 给每颗子弹单独指定对应的玩家目标
            bullet.GetComponent<MultiBulletScript>().target = player.transform;
        }
    }
}

注意事项

  • 如果需要子弹全程追踪移动的玩家,把Start里计算bulletRB.velocity的逻辑移到FixedUpdate方法中,每帧重新计算朝向目标的飞行方向即可
  • 做目标筛选时可增加玩家存活状态判断,避免子弹瞄准已经被消灭的玩家
  • 以上代码完全兼容Unity2017版本,可直接运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:54:03