Unity C # Shop Menu - PullRequest
       24

Unity C # Shop Menu

0 голосов
/ 11 февраля 2019

enter image description here Привет, ребята, я строю меню магазина, которое активируется при нажатии кнопки.У меня в меню четыре кнопки, которые соответствуют нескольким покупаемым предметам в сетке.Прикрепленные кнопки, текст и изображение находятся внутри GameObject.Я пытаюсь переключаться между меню с помощью SetActive.Я успешно использовал SetActive, чтобы открывать и закрывать меню, но когда я пробую другие части, они остаются неактивными независимо.Даже когда кнопка якобы активирующая нажата.Картинка, которую я загрузил, показывает иерархию магазина.Кнопки находятся под ShopSelection, а фактическое меню - Under Shop

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

public class UIManager : MonoBehaviour {

    private static UIManager instance;
    public  static UIManager Instance;
    public GameObject shopMenu, motherShips, resources, fleets, research;
    bool menuIsOpen = false;
    bool motherShipOpen = false;
    bool resourcesOpen = false;
    bool fleetOpen = false;
    public Button shop, motherShipButton, resourceButton, fleetButton, exitButton; 

    void Start () {
        shopMenu.SetActive(false);
        //Open Shop Menu
        Button btn = shop.GetComponent<Button>();
        btn.onClick.AddListener(TaskOnClick);
        //Open Motherships portion of shop
        Button btn1 = shop.GetComponent<Button>();
        btn1.onClick.AddListener(TaskOnClick3);
        //Open resources portion of shop
        Button btn2 = shop.GetComponent<Button>();
        btn2.onClick.AddListener(TaskOnClick4);
        //Open fleet portion of shop
        Button btn3 = shop.GetComponent<Button>();
        btn3.onClick.AddListener(TaskOnClick5);
        //Open Research portion of shop
        Button btn4 = shop.GetComponent<Button>();
        btn4.onClick.AddListener(TaskOnClick6);
        //Exit Menu
        Button bttn = exitButton.GetComponent<Button>();
        bttn.onClick.AddListener(TaskOnClick2);
    }

    // Update is called once per frame
    void Update () {

    }
    void TaskOnClick()
    {
        shopMenu.SetActive(true);
        menuIsOpen = true;
        motherShips.SetActive(true);
    }
    void TaskOnClick2()
    {
        if (menuIsOpen == true)
        {
            shopMenu.SetActive(false);
            menuIsOpen = false;
        }
    }
    void TaskOnClick3()
    {
        if(menuIsOpen == true)
        {
            //Open Motherships Shop
            motherShips.SetActive(true);
            resources.SetActive(false);
            fleets.SetActive(false);
        }
    }
    void TaskOnClick4()
    {
        if (menuIsOpen == true)
        {
            //Open resources Shop
            motherShips.SetActive(false);
            resources.SetActive(true);
            fleets.SetActive(false);
        }
    }
    void TaskOnClick5()
    {
        if(menuIsOpen == true)
        {
            //Open Fleet Shop
            motherShips.SetActive(false);
            resources.SetActive(false);
            fleets.SetActive(true);
        }
    }
    void TaskOnClick6()
    {
        if (menuIsOpen == true)
        {
            //Open Research Page
            motherShips.SetActive(false);
            resources.SetActive(false);
            fleets.SetActive(false);
        }
    }
}

1 Ответ

0 голосов
/ 11 февраля 2019

Вы добавили все обратные вызовы всегда к кнопке shop, например,

Button btn2 = shop.GetComponent<Button>();
btn2.onClick.AddListener(TaskOnClick4);

, а не к предполагаемым кнопкам motherShipButton, resourceButton, fleetButton


Обратите внимание, что вам не нужно звонитьСнова GetComponent, если вы объявите переменную как Button, она автоматически будет ссылаться на компонент Button перетаскиваемого GameObject в Inspector, поэтому вместо него должно быть просто

shop.onClick.AddListener(TaskOnClick);

//Open Motherships portion of shop
motherShipButton.onClick.AddListener(TaskOnClick3);

//Open resources portion of shop
resourcesButton.onClick.AddListener(TaskOnClick4);

//Open fleet portion of shop
fleetButton.onClick.AddListener(TaskOnClick5);

//Open Research portion of shop
// Whatever button this belongs to
???.onClick.AddListener(TaskOnClick6);

//Exit Menu
exitButton.onClick.AddListener(TaskOnClick2);

Теперь также соответствующим образом назовите методынапример, OpenMenu, CloseMenu и т. д., чтобы вам и всем остальным было легче понять код.


Я также сомневаюсь, что вам нужен чек для if(menuIsOpen).Так как другие GameObjects являются дочерними элементами меню, они просто останутся невидимыми, даже если будет вызван SetActive.Вместо этого я бы удостоверился, что активна только одна панель, используя метод с, например, enum вместо

enum MenuPanel
{
    MotherShips,
    Resources,
    Fleets,
    Research
}

private void ShowPanel(MenuPanel panel)
{
    // First disable all
    motherShips.SetActive(false);
    fleets.SetActive(false);
    resources.SetActive(false);

    // Than only activate according panel
    switch(panel)
    {
        case MenuPanel.MotherShips:
            motherShips.SetActive(true);
            break;

        case MenuPanel.Reaources:
            resources.SetActive(true);
            break;

        case MenuPanel.Fleets:
            fleets.SetActive(true);
            break;
    }
}

И затем я бы использовал специальные методы для каждой панели, например

void Start()
{
    //...
    motherShipButton.onClick.AddListener(ShowMotherShips);
    //...
}

private void ShowMotherShips()
{
    ShowPanel(MenuPanel.MotherShips);
}

вы могли бы сделать это также непосредственно как лямбда-выражение

void Start()
{
    //...
    motherShipButton.onClick.AddListener(() => {
        ShowPanel(MenuPanel.MotherShips);
    });
    //...
}

Я обычно стараюсь избегать этого, поскольку 1. вы не можете использовать это выражение повторно, но вы можете вызвать его из другого места, а также 2.вы не сможете использовать RemoveListener, чтобы в конечном итоге избавиться от этого вызова.

...