从实例化按钮中识别按钮单击 - 隐藏数组中的游戏对象

问题描述 投票:0回答:1

代码只是为UI生成按钮,单击该按钮可隐藏数组中的游戏对象,一次只能显示一个。目前我正在努力获得一个工作按钮并更改可见的游戏对象,但已设法获取数组中的对象名称以替换按钮文本。请帮忙!

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]);
        }
    }
c# user-interface unity3d button instantiation
1个回答
0
投票

实例化GameObject时,可以从模板中复制。当您调用SetActive时,您可以在模板对象上调用它,因此它可能应用于预制件。

您应该在实例化对象上调用它,因此您需要另一个列表来存储每个克隆。

此外,您可以相当简化代码,为每个按钮提供一个索引(当它被实例化时),表示它在列表中的位置以及对列表本身的引用。

这样,您可以将Inspector中的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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.