Я полагаю, что Player
, на который ссылается ваш префаб, является самим префабом, который никогда не двигается.
Вы должны сделать само поле префаба типа EnemyController
. Это гарантирует, что здесь вы можете ссылаться только на префаб, который на самом деле имеет и EnemyController
.
Затем, после Instantiate, вы можете передать игроку ссылку на скрипт GameManagement
, например
public class GameManagement : MonoBehaviour
{
// Give this field the correct type
public EnemyController circleEnemie;
public Transform player;
[SerializeField]
float moveSpeed = 1;
// Start is called before the first frame update
void Start()
{
//Get random position to spawn ball
Vector3 screenPosition = Camera.main.ScreenToWorldPoint(new Vector3(Random.Range(0, Screen.width), Random.Range(0, Screen.height), Camera.main.farClipPlane / 2));
// Instantiate returns the same type as the given prefab
EnemyController enemy = Instantiate(circleEnemie, screenPosition, Quaternion.identity);
enemy.name = "enemiecircle";
enemy.gameObject.tag = "Enemie";
// Now pass in the player reference
enemy.player = player;
}
// NOTE: When not needed better remove Unity message methods
// It would just cause overhead
//void Update()
//{
//}
}
Sidenote: Для вашего EnemyController
в MoveTowardsPlayer
для чего вам это нужно?
Vector3 mousepos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Затем, когда имеешь дело с Rigidbody
, делайте вещи в FixedUpdate
в противном случае это может нарушить физику и обнаружение столкновений!
Тогда также не используйте значения Transform
, но снова Rigidbody
private void FixedUpdate ()
{
MoveTowardsPlayer();
}
private void MoveTowardsPlayer ()
{
var direction = ((Vector2)(player.position - rb.position)). normalized;
rb.velocity = direction * moveSpeed;
}