Распознать нажатие кнопки из созданной кнопки - скрыть игровой объект в массиве - PullRequest
0 голосов
/ 05 марта 2019

Код - это просто генерирование кнопок для пользовательского интерфейса, а нажатие кнопки скрывает игровой объект в массиве, при этом только один виден одновременно.В данный момент я пытаюсь заставить работать кнопку и изменить видимый игровой объект, но сумел получить имена объектов в массиве, чтобы заменить текст кнопки.Пожалуйста помоги!

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

public class ButtonListControl : MonoBehaviour
{

    [SerializeField]
    private GameObject ButtonTemplate;

    [SerializeField]
    private GameObject[] ApplianceList;
    GameObject ApplianceGUI;
    private int index;

    void Start()
    {
        ApplianceGUI = GameObject.Find("Canvas_GUI_ScrollList");
        ApplianceGUI.SetActive(false);

        // Finds GUI and turns off on run.

        foreach (GameObject Appliance in ApplianceList)
        {
            GameObject Button = Instantiate(ButtonTemplate) as GameObject;
            Button.GetComponent<ButtonListButton>().SetText(Appliance.name);
            Button.transform.SetParent(ButtonTemplate.transform.parent, false);

            Appliance.SetActive(false);

            if (ApplianceList[0])
                ApplianceList[0].SetActive(true);
            Button.SetActive(true);
        }
    }
  public void Option1Clicked()
    {
        foreach (GameObject Appliance in ApplianceList)
        {
            Appliance.SetActive(false);
            //Sets the current Game Object to false 

            ApplianceList[1].SetActive(true);
            Debug.Log("New Appliance Chosen, Hiding Old model and displaying:", ApplianceList[1]);
        }
    }
       public void Option2Clicked()
    {
        foreach (GameObject Appliance in ApplianceList)
        {
            Appliance.SetActive(false);
            //Sets the current Game Object to false 

            ApplianceList[2].SetActive(true);
            Debug.Log("New Appliance Chosen, Hiding Old model and displaying:", ApplianceList[2]);
        }
    }
       public void Option3Clicked()
    {
        foreach (GameObject Appliance in ApplianceList)
        {
            Appliance.SetActive(false);
            //Sets the current Game Object to false 

            ApplianceList[3].SetActive(true);
            Debug.Log("New Appliance Chosen, Hiding Old model and displaying:", ApplianceList[3]);
        }
    }
       public void Option4Clicked()
    {
        foreach (GameObject Appliance in ApplianceList)
        {
            Appliance.SetActive(false);
            //Sets the current Game Object to false 

            ApplianceList[4].SetActive(true);
            Debug.Log("New Appliance Chosen, Hiding Old model and displaying:", ApplianceList[4]);
        }
    }

1 Ответ

0 голосов
/ 08 марта 2019

Когда вы создаете экземпляр GameObject, вы делаете копию из шаблона.Когда вы вызываете SetActive, вы вызываете его для объектов шаблона, так что он, вероятно, применяется к префабу.

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

Кроме того, вы можете немного упростить код, назначив каждой кнопке индекс (когда он создается), представляющий ее позицию в списке и ссылку на сам список.

Таким образом, вы можетеустановите для обратного вызова OnClick в Инспекторе собственный метод ButtonListButton вместо создания OptionNClicked для каждого.

public sealed class ButtonListControl : MonoBehaviour
{
    private GameObject[] ApplianceList;

    // Hide every button except the one with the given index
    public void HideAllBut(int index)
    {
        for (int i = 0; i < ApplianceList.Length; i++)
        {
            ApplianceList[i].SetActive(i == index);
        }
    }

}
public sealed class ButtonListButton : MonoBehaviour
{
    [SerializeField]
    public int Index;
    [SerializeField]
    ButtonListControl List;

    // This asks the list to hide every button except for this one
    public void HideOthers()
    {
        List.HideAllBut(Index);
    }
}
...