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
相关产品推荐
相关产品推荐

