Установленный сборный дом не движется, как ожидалось - PullRequest
0 голосов
/ 23 февраля 2020

У меня проблема с созданием префабов в Unity.

Я работаю над игрой, в которой враги движутся к вам, и вы должны их убить. Мой оригинальный вражеский игровой объект двигался навстречу игроку без особых проблем, но экземпляры этого объекта не двигались.

Чтобы еще больше сбить с толку, когда я скопировал игровой объект и добавил его на сцену без создания экземпляров, оба игровых объекта будут очень хорошо двигаться к игроку.

Сценарий противника:

public class EnemieController : MonoBehaviour
{
    [SerializeField]
    float moveSpeed = 1;

    [SerializeField]
    private Rigidbody2D rb;
    public Transform player;
    public float health = 50;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        Debug.Log(player);
    }

    // Update is called once per frame
    void Update()
    {
        MoveTowardsPlayer();
    }

    void MoveTowardsPlayer()
    {
        Vector3 mousepos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector2 direction = (player.position - transform.position).normalized;
        rb.velocity = new Vector2(direction.x * moveSpeed, direction.y * (moveSpeed * 1));

    }
}

Код подтверждения

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//using System;

[System.Serializable]
public class GameManagement : MonoBehaviour
{
    public GameObject 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));
        GameObject enemie = Instantiate(circleEnemie, screenPosition, Quaternion.identity) as GameObject;
        enemie.name = "enemiecircle";
        enemie.tag = "Enemie";
    }

    // Update is called once per frame
    void Update()
    {
    }

}

И если требуется Вот технические характеристики инспектора врагов Технические характеристики инспектора

Извините за ссылку, мои очки репутации еще не достигли 10, поэтому я не могу публиковать изображения напрямую.

1 Ответ

0 голосов
/ 23 февраля 2020

Я полагаю, что 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...