1

Тема: Архітектура меню зі змінними кнопками

Привіт. Я шось туплю.
В мене є меню, котре містить всього 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, а також наповнював би їх потрібної інфої при ініціалізації.
Що скажете?

тут спілкуються українці, про політику, і інше (серед них є програмісти, але дуже мало, тому не заходьте туди лише з питаннями про програмування)
https://discord.gg/Zk29v4P

2

Re: Архітектура меню зі змінними кнопками

Я міг би просто зробити декілька наборів з кнопок, і приховувати непотрібні набори та показувати потрібний (як я це зробив з першою кнопкою), але мені порадили робити це програмно.

Коли ви будете знати, нащо ви робите це програмно, то питання як правильно зробити відпаде саме собою.

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ
Подякували: leofun011

3

Re: Архітектура меню зі змінними кнопками

quez написав:

Я міг би просто зробити декілька наборів з кнопок, і приховувати непотрібні набори та показувати потрібний (як я це зробив з першою кнопкою), але мені порадили робити це програмно.

Коли ви будете знати, нащо ви робите це програмно, то питання як правильно зробити відпаде саме собою.

я роблю то програмно, аби не створювати додаткових кнопок

тут спілкуються українці, про політику, і інше (серед них є програмісти, але дуже мало, тому не заходьте туди лише з питаннями про програмування)
https://discord.gg/Zk29v4P

4

Re: Архітектура меню зі змінними кнопками

Ці архітектурні навороти доречні, якщо ви збираєтесь цю частину програми якось змінювати і розраховуєте вгадати так, щоб зміна пройшла легко і безболісно. Вам видніше, але мені здається, що це оверінжиніринг.

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ

5

Re: Архітектура меню зі змінними кнопками

quez написав:

Ці архітектурні навороти доречні, якщо ви збираєтесь цю частину програми якось змінювати і розраховуєте вгадати так, щоб зміна пройшла легко і безболісно. Вам видніше, але мені здається, що це оверінжиніринг.

ну лади, зберу три по п'ять кнопок

тут спілкуються українці, про політику, і інше (серед них є програмісти, але дуже мало, тому не заходьте туди лише з питаннями про програмування)
https://discord.gg/Zk29v4P

6 Востаннє редагувалося Fox (08.01.2016 18:57:01)

Re: Архітектура меню зі змінними кнопками

Не по темi
Вибачте трохи затупив.
Нажаль видалити тут не можна