GameObject.FindGameObjectWithTag не находит клонов - PullRequest
1 голос
/ 19 июня 2020

У меня есть скрипт Unity, который создает префаб врага, и другой скрипт, который перемещает врагов в зависимости от его тега. Однако созданные игровые объекты обнаруживаются, но не перемещаются. Например: Когда я ставлю игру на паузу и вручную добавляю префаб врага, он перемещается, но когда сценарий автоматически добавляет его, он не перемещается.


Здесь это мой сценарий создания экземпляра:

void Update()

{
    tillNextSpawn += Time.deltaTime;
    Debug.Log(tillNextSpawn);

    if (tillNextSpawn >= 2)
    {
        UnityEngine.Debug.Log("Instantiating circle");
        screenPosition = Camera.main.ScreenToWorldPoint(new Vector3(Random.Range(0, Screen.width), Random.Range(0, Screen.height), Camera.main.farClipPlane / 2));
        Instantiate(circle, screenPosition, Quaternion.identity);
        tillNextSpawn = 0.0f;
    }
}

И мой сценарий контроллера врага (перемещает врагов)

void FixedUpdate()
{
    /*GameObject[]*/
    var objects = GameObject.FindGameObjectsWithTag("Enemy");
    var objectCount = objects.Length;
    foreach (var obj in objects)
    {
        // Move the players accordingly
        var rb = obj.GetComponent<Rigidbody2D>();
        Debug.Log(rb);
        Vector2 direction = (player.position - obj.transform.position).normalized;
        rb.velocity = direction * moveSpeed;
    }


}

Вот изображение префаба врага при необходимости: enter image description here

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Если вы хотите, чтобы противник следил за игроком, попробуйте сделать следующее:

//Attach this script to the enemy

Transform player;
private Rigidbody2D rb;
private Vector2 movement;
public float moveSpeed;

    void Awake()
{
    player = ScriptNameOnPlayer.instance.gameObject.transform;

}


// Start is called before the first frame update
void Start()
{
    rb = this.GetComponent<Rigidbody2D>();
}

void Update()
{

    Vector3 direction = player.position - transform.position;
    direction.Normalize();
    movement = direction;  
}

void FixedUpdate()
{
    moveCharacter(movement);
}

void moveCharacter(Vector2 direction)
{
    rb.MovePosition((Vector2)transform.position + (direction * moveSpeed * Time.deltaTime));
}


//But make sure your player script has this line of code:

public static ScriptNameOnPlayer instance;

Надеюсь, это поможет!

1 голос
/ 19 июня 2020

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

https://github.com/webocs/unity-so-sample-tags

Насколько я могу судить, ваша консоль отправляет исключение

get_main is not allowed to be called...

Что мне приходит в голову, так это то, что это исключение нарушает все выполнение, и поэтому ничего не происходит.

Кстати, я не знаю ваш проект, поэтому не знаю, почему вы строите его таким образом. Сказал, почему вы не создаете скрипт Enemy, прикрепленный к префабу врага? Если у вас много врагов, вы будете находить и перебирать их всех в каждом обновлении ti c. Если вы создадите сценарий Enemy и прикрепите его к префабу, вы сможете управлять перемещением врага, используя преобразование объекта gameObject, к которому прикреплен сценарий. Таким образом, каждый враг является отдельной сущностью.

Надеюсь, все это поможет!

Изменить: Я отредактировал репо и добавил сцену под названием «Индивидуальные враги» это иллюстрирует то, что я сказал вам в комментариях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...