Вы добавили все обратные вызовы всегда к кнопке 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
, чтобы в конечном итоге избавиться от этого вызова.