Установка кнопки OnClick для кнопки «Инсталяция», чтобы установить переменную gameobject? Единство C# - PullRequest
0 голосов
/ 09 апреля 2020

Привет, ребята! Впервые использую Stack Overflow из-за уникальной природы моей проблемы.

В настоящее время я создаю экземпляр кнопки, основанной на том, сколько игровых объектов с определенным сценарием У меня на сцене. Как бы я go позаботился о том, чтобы экземпляр onClick экземпляра Button устанавливал пустую переменную родительского скрипта gameObject var в (i) gameObject (физическая турель)?

private void Start()
{
    Turret_Script[] turretsOnTank = FindObjectsOfType<Turret_Script>();

    for (int i = 0; i < turretsOnTank.Length; i++)
    {
        GameObject turretButton = Instantiate(testingTurretButton, gameObject.transform.GetChild(0).GetChild(0).gameObject.transform);
        turretButton.transform.GetChild(0).GetComponent<Text>().text = turretsOnTank[i].name;
        turretButton.transform.position = new Vector3(150 + (100 * i), 330);

        //This is where I assume I'd make a button var based off of the turretButton var.

        //This is where I assume I'd change the OnClick of the button.
    }
}

1 Ответ

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

Если используемая вами кнопка Button, вы можете сделать это следующим образом:

for (int i = 0; i < turretsOnTank.Length; i++)
{
    GameObject turretButton = Instantiate(testingTurretButton, gameObject.transform.GetChild(0).GetChild(0).gameObject.transform);
    turretButton.transform.GetChild(0).GetComponent<Text>().text = turretsOnTank[i].name;
    turretButton.transform.position = new Vector3(150 + (100 * i), 330);
    turretButton.GetComponent<Button>().onClick.AddListner(
        () => turretHolder = turretsOnTank[i]);
}

() => turretHolder = turretsOnTank[i] - это лямбда, которая установит поле turretHolder с turretsOnTank[i], что i - это индекс башни.

Кстати, ваш код выглядит так, как будто он нуждается в реформировании. GetChild() возвращает преобразование, поэтому вам не нужно делать GetChild(0).gameObject.transform, чтобы получить преобразование. Достаточно всего лишь GetChild(0).

И, поле transform уже существует в MonoBehaviour, поэтому вам не нужно обращаться к transform через gameObject.

И, Instantiate может вернуть Transform тип, если prefab равен Transform. Итак, ваш код будет:

    Transform turretButton = Instantiate(testingTurretButton.transform, gameObject.transform.GetChild(0).GetChild(0));
    turretButton.GetChild(0).GetComponent<Text>().text = turretsOnTank[i].name;
    turretButton.position = new Vector3(150 + (100 * i), 330);
    turretButton.GetComponent<Button>().onClick.AddListner(
        () => turretHolder = turretsOnTank[i]);

, который имеет более менее избыточность.

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