Префаб GameObject не отображается в сцене при активации в моем скрипте

У меня есть 2 класса, прикрепленных к 2 разным графическим интерфейсам, PlayerInfoGUI и DiplomacyGUI.

Я пытаюсь использовать метод PlayerInfoGUI для динамического создания списка кнопок, который при нажатии будет вызывать DiplomacyGUI. (Оба графических интерфейса, а также динамические кнопки имеют свои собственные префабы)

Мой класс PlayerInfoGUI динамически заполняет панель кнопками с помощью метода PopulatePlayerList.

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
using System.Collections.Generic;


public class PlayerInfoGUI : MonoBehaviour
{
    public Image[] guiElements;
    public GameObject playerInfoButtonPrefab, canvasParent;
    public GameObject diplomacyMenu;

    void Awake ()
    {
        PopulatePlayerList (GameEngine.competingPlayers);
    }

    void PopulatePlayerList (List<CompetingPlayer> players)
    {

        for (int i = 0; i < players.Count; i++) {
            GameObject go = (GameObject)Instantiate 
            (playerInfoButtonPrefab);
            Button playerInfoButton = go.GetComponent<UnityEngine.UI.Button> 
                                                                         ();
            CompetingPlayer receivingPlayer = players [i];
            playerInfoButton.onClick.AddListener (() => handleDiplomacyMenu 
                                                         (receivingPlayer));
            go.transform.SetParent (canvasParent.transform, false);
        }
    }

    public void handleDiplomacyMenu (CompetingPlayer receivingPlayer)
    {
        diplomacyMenu.SetActive (true);
    }
}

Слушатель на кнопке PlayerInfo срабатывает при нажатии, но игровой объект дипломатииМеню не отображается в сцене. Большинство исследований, которые я читал, говорят, что это должна быть простая дипломатияMenu.SetActive(true) или дипломатия.gameObject.SetActive(true), но это не работает.

Я подтвердил, что код выполняется, но объект не виден. Заранее спасибо!

PlayerInfoPrefab

PlayerInfoButtonPrefab

DiplomacyPrefab


person nickassembly    schedule 09.04.2018    source источник
comment
Выкладывайте свой код, а не скриншот.   -  person Programmer    schedule 09.04.2018
comment
Спасибо за ответ. Отредактировал в.   -  person nickassembly    schedule 09.04.2018
comment
Первые два префаба вроде бы сохранены как неактивные.   -  person ZayedUpal    schedule 09.04.2018
comment
Вы хотите изменить состояние своего Object Instance, однако вы меняете свое состояние Prefab's. Вместо этого вы должны сделать так, как вы сделали выше, и создать экземпляр Object instance вашего Prefab, а затем изменить состояние этого экземпляра.   -  person Hristo    schedule 09.04.2018
comment
У меня это работает с .Instantiate(diplomacyMenu) перед .setactive(), спасибо за это.   -  person nickassembly    schedule 10.04.2018


Ответы (1)


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

person Daniel Matthews    schedule 09.04.2018
comment
Я использовал и дипломатиюMenu.gameObject.SetActive(), и дипломатиюMenu.SetActive(), и ни один из них не работал, но меня смутило их использование. Спасибо, что прояснили это. Меню дипломатии, которое я пытаюсь открыть, является родительским объектом, так что здесь нет проблем. - person nickassembly; 10.04.2018
comment
Нет проблем, также я не думаю, что мой ответ должен быть отмечен как лучший ответ. Мой ответ, похоже, не решил напрямую вашу проблему. - person Daniel Matthews; 10.04.2018