С Новым годом! Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 08.02.2018
Сообщений: 109

UI controller. требуется критика

12.01.2019, 13:40. Показов 1415. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу приложение, состоящее из UI объектов.
UI объекты есть как статические, добавленные в редакторе, есть статические из префабов(добавленные на сцену в редакторе), и динамические(создаются из префабов в рантайме)
Все элементы помечены по типу в своих тагах.

Изначально было задумана смена цветовой схемы.
Сперва было сделано так (опрос все)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
 
 
 
public class MyTheme : MonoBehaviour //,IPointerDownHandler
{
    //public  AudioSource audioE;
     public  AudioSource audioSourceDown;
    public AudioSource audioSourceUp;
    public GameObject mineCanvas; //пихаем в инспекторе главный канвас
 
    //public GameObject mainCamera;
    Color colorMainCanvas;     //  цвет Главного канваса
    Sprite spritePanelFon;     //  спрайт фона панели
    Sprite spriteMainImage;    //  спрайт Рисунка главной панели
    Sprite spriteBtnLineImage; //  спрайт полоски на кнопке
    Sprite spriteBtnImage;       //  спрайт кнопки
    Sprite spriteBtnPress;     //  спрайт нажатого состояния кнопки
    Color сolorTextNorm;        //  цвет обычного шрифта
    Color colorSlider;          //  цвет слайдера
    Color colorToggleFon;       //  цвет фона галки переключателя
    Color colorToggleCheckMark; //  цвет галки переключателя
    Sprite spriteBtnBack;       //  спрайт кнопки назад  
    private void Awake()
    {
        // если есть в настройках ключ то меняем тему на тему из настроек, если нет то делаем чёрная
        if (PlayerPrefs.HasKey("Theme"))
        {
            ChangeTheme(PlayerPrefs.GetString("Theme"));
        }
        else
        {
            ChangeTheme( "чёрная");
        }
       
    }
 
    public void ChangeTheme (string myColorTheme) // меняет цвета и спрайты у всех соответственно теме myColorTheme
    {              
        // пишем в настройки изменение темы
        PlayerPrefs.SetString("Theme", myColorTheme);
        PlayerPrefs.Save();
        switch (myColorTheme)
        {
            case "чёрная":
                colorMainCanvas = Color.black;                                      //  цвет Главного канваса
                spritePanelFon = Resources.Load<Sprite>("Sprites/FonBlack");        //  спрайт фона панели
                spriteMainImage = Resources.Load<Sprite>("Sprites/MenBlack");       //  спрайт Рисунка главной панели
                spriteBtnLineImage = Resources.Load<Sprite>("Sprites/LineBlack");   //  спрайт полоски на кнопке
                spriteBtnImage = Resources.Load<Sprite>("Sprites/BlackPixel");      //  спрайт кнопки
                spriteBtnPress = Resources.Load<Sprite>("Sprites/LineBlackPressed");//  спрайт нажатого состояния кнопки
                сolorTextNorm = Color.white;                                        //  цвет обычного шрифта
                colorSlider = Color.white;                                          //  цвет слайдера
                spriteBtnBack=Resources.Load<Sprite>("Sprites/BackWhite");          //  спрайт кнопки назад
                break;
            case "белая":
                colorMainCanvas = Color.white;
                spritePanelFon = Resources.Load<Sprite>("Sprites/FonWhite");
                spriteMainImage = Resources.Load<Sprite>("Sprites/GirlWhite");
                spriteBtnLineImage = Resources.Load<Sprite>("Sprites/LineWhite");
                spriteBtnImage = Resources.Load<Sprite>("Sprites/WhitePixel");
                spriteBtnPress = Resources.Load<Sprite>("Sprites/LineWhitePressed");
                сolorTextNorm = Color.black;
                colorSlider = Color.black;
                spriteBtnBack = Resources.Load<Sprite>("Sprites/BackBlack");    
                break;                
        }
        AppMyTheme(myColorTheme);
    }
 
    public void AppMyTheme(string myColorTheme)
    {            
        //меняем цвет главного канваса
        Image canvasImage = mineCanvas.GetComponent<Image>();
        canvasImage.color = colorMainCanvas;
       
        //получаем все объекты и сортируем по тагам        
        UIBehaviour[] myComponents = mineCanvas.GetComponentsInChildren<UIBehaviour>(true);
       
        foreach (UIBehaviour myComps in myComponents)
        {
            if (myComps is Selectable)
            {
                myComps.gameObject.AddComponent<BtnDownUp>();                
            }
            switch (myComps.tag)
            {
                //  спрайт фона панели
                case "tagFonBack":
                    myComps.GetComponent<Image>().sprite = spritePanelFon;
                    break;
                //  спрайт Рисунка главной панели
                case "tagMainImage":
                    myComps.GetComponent<Image>().sprite = spriteMainImage;
                    break;
                //  спрайт полоски на кнопке
                case "tagLineImage":
                    myComps.GetComponent<Image>().sprite = spriteBtnLineImage;
                    break;
                //  спрайт кнопки
                case "tagBtnMain":
                    myComps.GetComponent<Image>().sprite = spriteBtnImage;
                    //  спрайт нажатого состояния кнопки
                    var bt = myComps.GetComponent<Button>();
                    var spriteState = bt.spriteState;
                    spriteState.pressedSprite = spriteBtnPress;
                    bt.spriteState = spriteState;
                    //myComps.GetComponent<Text>().color = сolorTextNorm; //пересмотреть !!!!!!!!!!!
                    break;
                //  цвет обычного шрифта
                case "tagNormText":
                    myComps.GetComponent<Text>().color = сolorTextNorm;
                    break;
                //  цвет слайдера
                case "tagSliderBack":
                    myComps.GetComponent<Image>().color = colorSlider;
                    break;
                case "tagBtnBack":
                    myComps.GetComponent<Image>().sprite = spriteBtnBack ;                    
                    break;
            }
        }
    }        
 
     
}
class BtnDownUp : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
 
    public void OnPointerDown(PointerEventData eventData)
    {
        GameObject ASButtonDown = GameObject.Find("ASButtonDown");
        ASButtonDown.GetComponent<AudioSource>().Play();
       
    }
 
    public void OnPointerUp(PointerEventData eventData)
    {
        GameObject ASButtonDown = GameObject.Find("ASButtonUp");
        ASButtonDown.GetComponent<AudioSource>().Play();
    }
}
Начитался умных текстов и решил сделать UI контроллер:
на всех элементах висит скрипт
C#
1
2
3
4
5
6
7
8
9
using UnityEngine;
 
public class MyUiRegistration : MonoBehaviour
{
    void Start()
    {        
        MyUIController.MyRegOrChangeComps(gameObject.transform, gameObject.tag, true,true);
    }   
}
сам контроллер (висит на камере)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
 
public class MyUIController : MonoBehaviour
{    
    public  AudioSource audioSourceBtnDown; // buttons and others mouseonpointerdown events sound / added in inspector
    public  AudioSource audioSourceBtnUp;   // buttons and others mouseonpointerUp events sound     /added in inspector
 
    struct MyStructComp
        {
        public string myTag;
        public Component myC;   
        public MyStructComp(string myTag, Component myC) 
        {
            this.myTag = myTag;
            this.myC = myC;
        }
    }
    public static int  myNowThemeNumber;
    #region myTheme settings Lists
    static List<Color>  lst_CanvaMains_Colors; // цвета Главного канваса
    static List<Sprite> lst_PaneMainFon_Sprites;  //  спрайты фона главных панелей
    static List<Sprite> lst_ImageMain_Sprites; //  спрайтs Рисунка главной панели      
    static List<Sprite> lst_BtnLine_Sprites; //  спрайт полоски на кнопке        
    static List<Sprite> lst_BtnHalfLine_Sprites;    // спрайт половины полоски         
    static List<Sprite> lst_BtnMenuImage_sprites;  // спрайт кнопки меню         
    static List<Sprite> lst_BtnMenuPressImage_sprites;  // sprite of pressed menu button        
    static List<Color>  lst_TextUsual_Colors;  //  Usual Text Color        
    static List<Color>  lst_SliderSettings_Colors;  //  settings slider color       
    static List<Sprite> lst_BtnBack_sprites;   // sprite of  button back
        
    #endregion
 
    //List for comps registration with GO as component and tag
    static List<MyStructComp> ListMyUIComponents = new List<MyStructComp>(); 
    
   
    private void Awake()
    {
        // take the theme number from the settings, or if  no key then theme number=0 (Black) and  create a key  "ThemeNumber"
        if (PlayerPrefs.HasKey("ThemeNumber"))
        {
            myNowThemeNumber=PlayerPrefs.GetInt("ThemeNumber");
        }
        else
        {
            myNowThemeNumber = 0;
            PlayerPrefs.SetInt("ThemeNumber", 0);
        }
 
        #region My theme List Initialization
        lst_CanvaMains_Colors = new List<Color>()   //  цвета Главного канваса
        {
            Color.black,
            Color.white
        };
        lst_PaneMainFon_Sprites = new List<Sprite>()  //  спрайты фона главных панелей
        {
            Resources.Load<Sprite>("Sprites/FonBlack"),
            Resources.Load<Sprite>("Sprites/FonWhite")
        };
        lst_ImageMain_Sprites = new List<Sprite>() //  спрайтs Рисунка главной панели
        {
            Resources.Load<Sprite>("Sprites/MenBlack"),
            Resources.Load<Sprite>("Sprites/GirlWhite")
        };
        lst_BtnLine_Sprites = new List<Sprite>()   //  спрайт полоски на кнопке
        {
            Resources.Load<Sprite>("Sprites/LineBlack"),
            Resources.Load<Sprite>("Sprites/LineWhite")
        };
        lst_BtnHalfLine_Sprites = new List<Sprite>()   // спрайт половины полоски 
        {
            Resources.Load<Sprite>("Sprites/LineHalfBlack"),
            Resources.Load<Sprite>("Sprites/LineHalfWhite")
        };
        lst_BtnMenuImage_sprites = new List<Sprite>()   // спрайт кнопки меню 
        {
            Resources.Load<Sprite>("Sprites/BlackPixel"),
            Resources.Load<Sprite>("Sprites/WhitePixel")
        };
        lst_BtnMenuPressImage_sprites = new List<Sprite>()   // sprite of pressed menu button 
        {
            Resources.Load<Sprite>("Sprites/LineBlackPressed"),
            Resources.Load<Sprite>("Sprites/LineWhitePressed")
        };
        lst_TextUsual_Colors = new List<Color>()  //  Usual Text Color
        {
            Color.white,
            Color.black
        };
        lst_SliderSettings_Colors = new List<Color>()  //  settings slider color
        {
            Color.white,
            Color.black
        };
        lst_BtnBack_sprites = new List<Sprite>()   // sprite of  button back
        {
            Resources.Load<Sprite>("Sprites/BackWhite"),
            Resources.Load<Sprite>("Sprites/BackBlack")
        };
        #endregion
    }
 
    // assigns colors or sprite in "myComp" according to the "tag" and adds to the "ListMyUIComponents" if "bool regInList" is true
    public static  void MyRegOrChangeComps(Component myComp,string tag, bool regInList,bool AddNormClickSound) 
    {
        switch (tag)
        {
            case "tagCanvasMain":
                myComp.GetComponent<Image>().color = lst_CanvaMains_Colors[myNowThemeNumber];                
                break;
            case "tagFonBack":
                myComp.GetComponent<Image>().sprite = lst_PaneMainFon_Sprites[myNowThemeNumber];
                break;
            case "tagMainImage":
                myComp.GetComponent<Image>().sprite = lst_ImageMain_Sprites[myNowThemeNumber];
                break;
            case "tagLineImage":
                myComp.GetComponent<Image>().sprite = lst_BtnLine_Sprites[myNowThemeNumber];
                break;
            case "tagHalfLineImage":
                myComp.GetComponent<Image>().sprite = lst_BtnHalfLine_Sprites[myNowThemeNumber];
                break;
            case "tagBtnMain":
                myComp.GetComponent<Image>().sprite = lst_BtnMenuImage_sprites[myNowThemeNumber];
                var bt = myComp.GetComponent<Button>();
                var spriteState = bt.spriteState;
                spriteState.pressedSprite = lst_BtnMenuPressImage_sprites[myNowThemeNumber];
                bt.spriteState = spriteState;
                break;
            case "tagNormText":
                myComp.GetComponent<Text>().color = lst_TextUsual_Colors[myNowThemeNumber];                
                break;
            case "tagSliderBack":
                myComp.GetComponent<Image>().color = lst_SliderSettings_Colors[myNowThemeNumber];                
                break;
            case "tagBtnBack":
                myComp.GetComponent<Image>().sprite = lst_BtnBack_sprites[myNowThemeNumber];                
                break;
        }
        if (regInList) // if regInList is true, adding to ListMyUIComponents
        {
            MyStructComp strComp;
            strComp.myTag = tag;
            strComp.myC = myComp;
            ListMyUIComponents.Add(new MyStructComp(tag, myComp));
        }
        if(myComp is Selectable&& AddNormClickSound) //  if AddNormClickSound is true and compt is selectable , adding sounds for mouse down and up event
        {
            var btnDownUp = myComp.gameObject.AddComponent<BtnDownUp>();
           // btnDownUp.ASButtonUp = audioSourceUp;
           // btnDownUp.ASButtonDown = audioSourceDown;
        }
 
    }
 
    // change the theme for each comps in dictionary dictMyUIComponents (needs to call from the settings panel when switchin theme there )
    public static void MyChangeTheme()
    {       
        foreach (MyStructComp strComp in ListMyUIComponents)
        {
            MyRegOrChangeComps(strComp.myC, strComp.myTag, false,false);
        }
    }
}
public class BtnDownUp : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    public AudioSource ASButtonUp, ASButtonDown;
    public void OnPointerDown(PointerEventData eventData)
    {        
        ASButtonDown.Play();
    }
 
    public void OnPointerUp(PointerEventData eventData)
    {
        ASButtonUp.Play();
    }
}
public static void MyChangeTheme() вызывается из меню настроек при смене темы

нужна критика
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.01.2019, 13:40
Ответы с готовыми решениями:

Требуется критика по коду
Приветствую! Я недавно начал заниматься фрилансом, пока что были заказы по HTML + CSS, JS, но теперь я хочу писать PHP-код на заказ. И я...

Требуется конструктивная критика
Я не волшебник, только учусь. Для обучения выбрал алгоритм поиска пути A*. Вот собственно моя реализация: Заголовочный файл A_search.h ...

Требуется критика кода
Доброго времени суток, уважаемые форумачане. Хотел бы вас попросить покритиковать код. Версия python 3.6. Код во вложении. В заранее...

27
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
12.01.2019, 14:29
Работает? Ну и не парься)
0
1 / 1 / 0
Регистрация: 08.02.2018
Сообщений: 109
12.01.2019, 14:34  [ТС]
)))
цель просто поставил делать грамотно , что б потом лапшу не вешать
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
12.01.2019, 15:00
Это уже со временем придет, не заморачивайся.
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
12.01.2019, 15:04
Тему желательно сделать классом с данными (цвета, спрайты, шрифты)
Списки элементов заменить на словарь списков
В скрипте уи элемента сделать массив описания типа
C#
1
2
3
4
5
6
7
8
9
10
11
12
[Serializable]
public class UIElement {
 public enum UIElementType { Text = 0, Button = 1, PanelInfo, Slider }
 public UIElementType type;
 public GameObject element;
}
public class UIReg : Monobehaviour {
 public UIElement[] elements;
 void Start() {
  UIController.RegisterUIElement(elements); 
 }
}
А в самом контроллере уже на основании енама извлекать нужные компоненты и добавлять в нужные списки.
Списки Color, надеюсь, не на элементы должны вести? Потому что Color - структура, она не ссылочная, поэтому лучше хранить именно компоненты (Button, Image, Panel, Slider) в соответствующих списках и получать из словаря по енаму типа (свой писать, да), вроде таких: ButtonDefault, Slider, TextHeader, TextPlain.

Добавлено через 1 минуту
В словаре можно хранить значения в виде интерфейса IList, чтобы обобщить списки разных типов
1
1 / 1 / 0
Регистрация: 08.02.2018
Сообщений: 109
12.01.2019, 15:46  [ТС]
Cr0c, спасибо, буду смотреть!
Страшно конечно, но зубов бояться - в ... не давать )))

Добавлено через 5 минут
отому что Color - структура, она не ссылочная поэтому лучше хранить именно компоненты (Button, Image, Panel, Slider)
это понимаю
храню компоненты только

спасибо!
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
12.01.2019, 16:30
vedmed2005, советую ещё в методе регистрации применение темы к этому элементу вызывать.
Тему разбить на отдельные темы каждого типа элемента и хранить их уже внутри этой самой темы типа
C#
1
2
3
4
5
class ThemeUI {
 public ThemeButton button;
 public ThemeSlider slider;
 public ThemeText text;
}
Ну и внутри темы элемента метод применения этой темы, что позволит инкапсулировать логику применения без усложнения контроллера.
1
1 / 1 / 0
Регистрация: 08.02.2018
Сообщений: 109
12.01.2019, 17:16  [ТС]
Cr0c, спасибо! Буду вникать, кошмарно конечно для моего понимания. Но неделю назад для меня и контроллер, который я написал - был тёмный лес.

Добавлено через 1 минуту
Интересная тема, черт возьми, но времени мало ((

Добавлено через 22 минуты
в методе регистрации применение темы к этому элементу вызывать.
это же реализовано
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
12.01.2019, 17:24
vedmed2005, всё просто: каждый элемент имеет свою логику темы (цвет/шрифт/etc), которая внутри класса темы используется (скрыта от контроллера). Тема уи состоит из набора тем каждого элемента. Из-за того, что один элемент может иметь разное оформление внутри одной темы (текст, заголовок, etc) - надо это определять независимо в каждом объекте уи, для чего и используется енам в настройке объекта. Контроллер получает этот енам и объект, логика темы из объекта извлекает нужные компоненты.
0
1 / 1 / 0
Регистрация: 08.02.2018
Сообщений: 109
12.01.2019, 18:19  [ТС]
полностью согласен, понять только надо......))
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
12.01.2019, 18:47
Цитата Сообщение от vedmed2005 Посмотреть сообщение
но времени мало ((
Дедлайн?
0
1 / 1 / 0
Регистрация: 08.02.2018
Сообщений: 109
13.01.2019, 09:53  [ТС]
1max1, нет)
Это не заказ, это хобби.
Могу только после работы заниматься , и то недолго
0
1 / 1 / 0
Регистрация: 08.02.2018
Сообщений: 109
16.01.2019, 20:33  [ТС]
Cr0c,

Цитата Сообщение от Cr0c Посмотреть сообщение
Списки элементов заменить на словарь списков
В скрипте уи элемента сделать массив описания типа
C#
Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
[Serializable]
public class UIElement {
public enum UIElementType { Text = 0, Button = 1, PanelInfo, Slider }
public UIElementType type;
public GameObject element;
}
public class UIReg : Monobehaviour {
public UIElement[] elements;
void Start() {
UIController.RegisterUIElement(elements) ;
}
}
А в самом контроллере уже на основании енама извлекать нужные компоненты и добавлять в нужные списки.
в это я въехал.

Цитата Сообщение от Cr0c Посмотреть сообщение
Контроллер получает этот енам и объект, логика темы из объекта извлекает нужные компоненты.
это тоже понял
Цитата Сообщение от Cr0c Посмотреть сообщение
Ну и внутри темы элемента метод применения этой темы
тут логика тоже понятна

долго думал, непойму как реализовать класс темы типа элемента и присвоить элементу
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
16.01.2019, 20:55
Цитата Сообщение от vedmed2005 Посмотреть сообщение
класс темы типа элемента и присвоить элементу
Я вот это не понял
0
1 / 1 / 0
Регистрация: 08.02.2018
Сообщений: 109
17.01.2019, 10:21  [ТС]
Cr0c, я неправильно выразился.
Ваш предложенный принцип мне понятен:

1. Есть элемент "MenuText" (тип Text)
2. На него вешаю скрипт
C#
1
2
3
4
[Serializable]
public class UIElement {
 public enum UIElementType { Text = 0, Button = 1, PanelInfo, Slider }
.........................................
3. Элемент при запуске приложения предаёт контроллеру свой тип (Text) и ссылку на себя.
4. Контроллер помещает ссылку на элемент в соответствующий по типу список в словаре
и заодно применяет тему к этому элементу.

Так же понимаю что для каждого типа элемента нужно сделать свой класс темы. Этот класс темы внутри содержит метод, который применяет тему к элементу, на основе его типа(из переданного контроллеру enum UIElementType ), это все я понял.
Для меня трудность заключается в том, то что я не пойму что из себя по структуре должен представлять это класс темы элемента! Это конечно плохой тон просить расписать класс, но хотя бы пример или что то подобное можно ?
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
17.01.2019, 10:35
Класс темы должен содержать всё необходимое для применения темы, логично))
Цвет, размер, положение и т.д.
0
1 / 1 / 0
Регистрация: 08.02.2018
Сообщений: 109
17.01.2019, 12:27  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
Класс темы должен содержать всё необходимое для применения темы, логично))
Цвет, размер, положение и т.д.
Похоже я не могу правильно сформулировать свой вопрос на понятном кодеру языке

Добавлено через 38 минут
Короче изначально я привел свой вариант контроллера и попросил критики с точки зрения грамотности написания кода.
Одним из советов был - создать свой класс темы для каждого типа УИ элемента.
Похоже последний мой вопрос должен звучать так -

Вот есть Button c типом "tagBtnMain"
делаю итерацию списка зареганных элементов и по свичу применяю тему
C#
1
2
3
4
5
6
7
8
9
10
 switch (tag)
        {
case "tagBtnMain":
                myComp.GetComponent<Image>().sprite = lst_BtnMenuImage_sprites[myNowThemeNumber];
                var bt = myComp.GetComponent<Button>();
                var spriteState = bt.spriteState;
                spriteState.pressedSprite = lst_BtnMenuPressImage_sprites[myNowThemeNumber];
                bt.spriteState = spriteState;
                break;
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
но судя по совету (не оспариваю, так как новичёк) , мне надо сделать класс темы
то есть как то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class BtnMainTheme
{
Sprite BtnMenuImage=lst_BtnMenuImage_sprites[myNowThemeNumber];
Sprite BtnMenuPressImage=lst_BtnMenuPressImage_sprites[myNowThemeNumber];
GameObject element;
 
и тут еще метод написать присвоения темы
public void ChangeTheme (Button myComp)
   {
                myComp.GetComponent<Image>().sprite = BtnMenuImage;
                var bt = myComp.GetComponent<Button>();
                var spriteState = bt.spriteState;
                spriteState.pressedSprite = BtnMenuPressImage;
                bt.spriteState = spriteState;
                break;
   }
 
}
а потом этот класс темы элемента , с классами тем других элементов заворачивать в общий класс темы
Цитата Сообщение от Cr0c Посмотреть сообщение
C#Выделить код1
2
3
4
5
class ThemeUI {
public ThemeButton button;
public ThemeSlider slider;
public ThemeText text;
}
вот я и непойму, то ли я непонял, то ли меня непоняли , то ли вообще черте знает что твориться))

Добавлено через 1 минуту
поэтому и спрашиваю, для чего и почему ,в отличии от моего варианта, грамотнее создавать класс темы элемента ?

Добавлено через 10 минут
Анекдот вчера вычитал, может и баян конечно(не относится к теме обсуждения):
Американский форум - человек задал вопрос - ему ответили на вопрос
Еврейский форум - человек задал вопрос ему ответили вопросом
Российский форум - человек задал вопрос - ему долго объясняли какой он му..ак)
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
17.01.2019, 12:33
vedmed2005,
C#
1
2
3
4
5
6
7
8
9
10
public class ThemeButton {
 public ColorBlock colorMain;
 public void ApplyTheme(Button button);
}
public class ThemeButtonText {
 public Color textColor;
 public Font font;
 public void ApplyTheme(Text text);
}
}
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
17.01.2019, 12:34
Цитата Сообщение от vedmed2005 Посмотреть сообщение
грамотнее создавать класс темы элемента ?
Чтобы сделать грамотно, нужно очень много знать, и то не факт что сделаешь)
Здесь больше вопрос стоит в понимании своего же кода, читабельности и оптимизации. Конечно вариант с разделением на классы выглядит лучше, чем хранить всё в одном большом, но тут еще много нюансов.
1
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
17.01.2019, 12:35
Разбиваешь на мелкие независимые классы тему. Тонкости тем разных элементов больше не влияют, расширение крайне простое.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.01.2019, 12:35
Помогаю со студенческими работами здесь

Игровой компьютер. Требуется совет и аргументированная критика по выбору железа
1. Бюджет: 100+ 2. Москва, сборка из нескольких магазинов 3. Игровой, для монтажа. Монитор пока 1920х1080, не каких SLI 4. Разгон...

Controller Serve Raid M5014 SAS/SATA Controller совместимость с HDD
Здравствуйте! Есть контроллер Controller Serve Raid M5014 SAS/SATA Controller и жесткие диски HDD 1ТБ, Western Digital RE, WD1004FBYZ ...

Я теряю данные на пути Controller-View-Controller. Как правильно получить модель из представления?
У меня есть модель, которая содержит несколько свойств. Есть List&lt;Point&gt; и ThranslatingCam. Свойство ThranslatingCam содержит свойства,...

Controller Serve Raid M5014 SAS/SATA Controller
Здравствуйте! Нужна очень помощь знатоков по этому контроллеру! Вопрос есть ли инструкция как создать два Raid1+ Raid1 через биос. ...

Смена Root View Controller в Navigation Controller
Доброго времени суток. В приложении есть Storyboard. В нем navigation controller выставлен как initial view controller. При первом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru