让敌人跟随并用标签随机射击多个游戏对象



你好,我和我的朋友一直在努力解决Enemy脚本的问题。标签是";玩家";敌人不会随机跟随或射击,它只跟随一个,其余的不会读取其他游戏对象的标签。

感谢您的帮助

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class EnemyFollowPlayer : MonoBehaviour 
{
public float speed;
public float lineOfSite;
public float shootingRange;
public float fireRate = 1f;
private float nextFireTime;
public GameObject bullet;
public GameObject bulletParent;
public GameObject[] player;
private BlackthronpodPlayerX playerX;
void Update () 
{
EnemyS ();
}
// Use this for initialization
void Start () 
{
player = GameObject.FindGameObjectsWithTag("Player");
playerX = GameObject.FindGameObjectWithTag ("Player").GetComponent<BlackthronpodPlayerX>(); 
}
void EnemyS () 
{
foreach (GameObject PlayerX in player) 
{
float distanceFromPlayer = Vector2.Distance (PlayerX.transform.position, transform.position);
if (distanceFromPlayer < lineOfSite && distanceFromPlayer > shootingRange) 
{
transform.position = Vector2.MoveTowards (this.transform.position, PlayerX.transform.position, speed * Time.deltaTime);
} 
else if (distanceFromPlayer <= shootingRange && nextFireTime < Time.time) 
{
Instantiate (bullet, bulletParent.transform.position, Quaternion.identity);
nextFireTime = Time.time + fireRate;
}
}
}
}

你说你只想要最接近的玩家,所以我宁愿做一些事情,比如

using System.Linq;
...
private bool TryGetClosestPlayer(out GameObject closest)
{
// Sort the players by their distance to this object
var playersSortedByDistance = player.OrderBy(p => ((Vector2)p.transform.position - (Vector2)transform.position).sqrMagnitude);
// Get the first entry -> smallest distance
closest = playersSortedByDistance.FirstOrDefault();
// Returns true if a closest player was found
// If this returns false it means there is no object tagged "Player" in your scene the moment "Start" was called
return closest;
}
void EnemyS () 
{
// Now only consider this one closest player and ignore the others
if(TryGetClosestPlayer (out var closestPlayer))
{
var distanceFromPlayer = Vector2.Distance (closestPlayer.transform.position, transform.position);
if (distanceFromPlayer < lineOfSite && distanceFromPlayer > shootingRange) 
{
transform.position = Vector2.MoveTowards (this.transform.position, PlayerX.transform.position, speed * Time.deltaTime);
} 
else if (distanceFromPlayer <= shootingRange && nextFireTime < Time.time) 
{
Instantiate (bullet, bulletParent.transform.position, Quaternion.identity);
nextFireTime = Time.time + fireRate;
}
}
}

最新更新