Как получить переменные / функции от дочернего GameObject? - PullRequest
0 голосов
/ 08 января 2020

Здравствуйте! Я пытаюсь создать комнату, которая будет генерировать случайный макет из списка и получать переменную из этого макета. У меня были некоторые проблемы с этим, так как макета не существует с самого начала игры, и я работаю над этой проблемой уже несколько дней. В настоящее время GameObject «Room» ищет своих детей с тегами «Layouts», а затем, обнаружив , что GameObject, код получает переменную «waves» из компонента Layouts в Layout. Код здесь:

foreach (Transform child in transform)
{
   if (child.tag == "Layouts")
   {
      layout = child.gameObject.GetComponent<Layout>();
   }
}
layout.testFunction();
totalKillsNeeded = layout.waves;

Когда я запускаю код, ничего не происходит. Никаких ошибок или чего-либо еще. testFunction не запускается, несмотря на то, что моя Visual Studio показывает ссылку между двумя сценариями, а totalKillsNeeded возвращает 0, несмотря на то, что я проверяю и вижу, что layout.waves равен 1 или 2. Я пробовал несколько методов получения сценария Layout, каждый из которых вернули тот же результат. Вероятно, это что-то маленькое, что я не рассматривал, но я до сих пор не смог понять это. Спасибо!

1 Ответ

0 голосов
/ 21 апреля 2020

Ваш код должен работать, но в случае, попробуйте это. Вот ScriptA.cs, поместите это в родительский

using UnityEngine;

public class ScriptA: MonoBehaviour
{
    int totalKillsNeeded = 0;
    ScriptB layout;

    // Start is called before the first frame update
    void Start()
    {
        foreach(Transform child in transform)
        {
            if(child.CompareTag("Layouts"))
            {
                layout = child.gameObject.GetComponent<ScriptB>();
            }
        }

        layout.testFunction();
        totalKillsNeeded = layout.waves;

        Debug.Log($"Total Kills needed: {totalKillsNeeded}, layout waves {layout.waves}");
    }
}

И ScriptB.cs, поместите это в дочерние игровые объекты и установите волну в инспекторе, если необходимо

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

public class ScriptB: MonoBehaviour
{
    public int waves = 12;

    public void testFunction()
    {
        Debug.Log("Test Function Called, waves: {waves}");
    }
}

Вывод на консоль:

enter image description here

Иерархия должна выглядеть примерно так:

enter image description here

Если у вашего последнего ребенка 0 волн, то для l oop будет отображаться только последняя:

enter image description here

...