FindGameObjectsWithTag
в качестве подсказок по имени возвращает GameObject[]
.
Чтобы связать прикрепленный Rigidbody2D
, используйте GetComponent<Rigidbody2D>
Это должно быть либо GameObject[]
, либо просто var
/*GameObject[]*/ var objects = GameObject.FindGameObjectsWithTag("Enemy");
var objectCount = objects.Length;
foreach (var obj in objects)
{
// Move the players accordingly
var rb = obj.GetComponent<Rigidbody2D>()
Vector2 direction = (player.position - transform.position).normalized;
rb.velocity = direction * moveSpeed;
}
Вторая была просто последующей ошибкой, поскольку вы объявили objects
как GameObject
, что действительно, как говорится в ошибке не имеет реализации GetEnumerator
.
В общем, многократно использовать FindObjectsWithTag
- не лучший вариант. Я бы предпочел использовать шаблон со списком static
всех существующих экземпляров, например
// Put this component on your enemy prefabs / objects
public class EnemyController : MonoBehaviour
{
// every instance registers to and removes itself from here
public static HashSet<EnemyController> Instances = new HashSet<EnemyController>();
// If possible already drag the Rigidbody into this slot via the Inspector!
[SerializedField] private Rigidbody2D rb;
// public read-only access
public Rigidbody2D Rb => rb;
private void Awake()
{
if(!rb) rb = GetComponent<Rigidbody2D>();
Instances.Add(this);
}
private void OnDestroy()
{
Instances.Remove(this);
}
}
, а затем использовать
var enemies = EnemyControler.Instances;
foreach (var enemy in enemies)
{
// Move the players accordingly
Vector2 direction = (player.position - transform.position).normalized;
enemy.Rb.velocity = direction * moveSpeed;
}