Тема: Архітектура меню зі змінними кнопками
Привіт. Я шось туплю.
В мене є меню, котре містить всього 6 кнопок. Перша з кнопок може мати лише два вигляди, тому я створив дві кнопки, і по потребі приховую перший варіант кнопки і показую інший.
А от інші 6 кнопок можуть мати різні значення залежно від обранного розділу меню. Кожна з тих п'яти кнопок має зображення та два написи, котрі і змінюються при вибору іншого розділу меню.
Я міг би просто зробити декілька наборів з кнопок, і приховувати непотрібні набори та показувати потрібний (як я це зробив з першою кнопкою), але мені порадили робити це програмно. Адже форма та положення кнопок не змінюється, тому можна написати скрипт, котрий би просто заміняв картинки та текст кнопок.
Для всього цього дійства я використовую патерн MVC, і ось, як виглядає View кнопки (з коментарями)
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
using System;
public class ButtonView : FoGElement, IPointerDownHandler, IPointerExitHandler, IPointerUpHandler, IPointerClickHandler {
public Sprite normalSprite, pressedSprite; // посилання на картинки
public bool isFullAccess; // одна з 5 кнопок має трохи інший колір
public AudioSource clickMainMenu;// аудіофайл для програвання під час натиску на кнопку
public FoGNotification notification = FoGNotification.None; //типу вид повідомлення (mvc)
private Text[] texts; // текст, котрий є складової кнопки
private Image image; //компонент, котрий дозволяє змінювати зображення кнопки
private Color white, green; // коли ми не натискаємо на кнопку, то текст має один колір, а коли натискаємо, то вєе інший
void Start()
{
texts = transform.GetComponentsInChildren<Text>();
image = transform.GetComponent<Image>();
var wh = 0xe1/(float)0xff;
if (!isFullAccess)
white = new Color(wh, wh, wh); //задаємо два кольори, мої два кольори, білий, то коли не натиснена кнопка, а зелеееенииий, то любов (коли натиснута кнопка)
else
white = new Color(1, 0xfd / 1.0f,0);
green = new Color(0xcd /(float) 0xff, 0xd8 / (float)0xff, 0x93 /(float) 0xff);
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("down");
transform.localScale = new Vector3(1.3f, 1.3f, 1); // при натисканні та утриманні кнопки натисненою я збільшую саму кнопку у розмірах
image.sprite = pressedSprite; // змінюю зображення картинки на інше
foreach(var text in texts)
{
text.color = green; //текст кнопки фарбую в зелений
}
clickMainMenu.Play(); // програю аудіофайл натиснення
}
public void OnPointerExit(PointerEventData eventData)
{
Up();
}
public void OnPointerUp(PointerEventData eventData)
{
Up();
}
private void Up()
{
transform.localScale = new Vector3(1, 1, 1); // коли забрали палець з кнопки, то приводимо її розміри до норми
image.sprite = normalSprite; // замінюємо зображення
foreach (var text in texts)
{
text.color = white; // та фарбуємо текст в білий
}
}
public void OnPointerClick(PointerEventData eventData)
{
app.Notify(notification, this); // якщо натиснули на кнопку, то передаємо повідомлення в контролллер (mvc)
}
}
В мене виникло нерозуміння того, як мені зберігати в скриптах дані про різні набори кнопок.
По суті мені треба 3 набори, котрі будуть містити інформацію для п'яти кнопок. Ця інформація має містити в собі дві картинки (вигляд не натиснутої і натиснутої кнопки), дві строки з текстом, булеву змінну isFullAccess і ще змінну типу FoGNotification (це enum).
Як то все зробити, аби виглядало логічно і круто? В мене є ідея зробити клас MenuModel і клас ButtonModel. MenuModel тримав би в собі 15 штук ButtonModel, а також наповнював би їх потрібної інфої при ініціалізації.
Що скажете?