красивые БУКАВКИ и ЦИФОРКИ для счета/денег на экране

Научился сам? Помоги начинающему.

красивые БУКАВКИ и ЦИФОРКИ для счета/денег на экране

Сообщение romeo98 06 янв 2014, 16:05

Всем доброго времени суток! Я хотел бы рассказать, как вывести счет игры/индикатор денег в окно игры. Только все не простыми тонкими маленькими со стандартным шрифтом буквами, а с красивыми разноцветными буквами, нарисованные в графическом редакторе. Я занимаюсь unity3d и С# cовсем не давно и это мой первый урок для новичков и тех кто не хочет думать… Я написал этот скрипт за 5 мин, но думаю для кого-то он пригодиться. Метод конечно работает, но я не знаю на сколько он красив / правилен / оптимизирован и тд. Так что, старожилы форума, напишите в комменты, уместен ли этот код? Или я создаю велосипед? Или можно сделать на много проще?

Что мы получим? Мы получим, что-то вроде индикатора денег в GTA SA. http://hkar.ru/o1R2

На экране будет видно 7 цифер и значок доллара. Если у человека денег 0, то на экран будет выводиться «0000000$», если, например, у него 7000 долларов, то на экране «0007000$».

На самом деле код очень простой. Мы будем иметь 1 скрипт- moneyShow. В этом скрипте будет массив money, который будет отвечать за кол-во денег, пару переменных и будет всего 2 функции: OnGUI и charPositionX.

Начнем… Первым делом рисуем эти буквы. Т.к. у нас только цифры и 1 значок, я рисую цифры от 0-9 и значок $. После разделяем эти цифры. Каждая цифра должна быть в отдельном файле.
Далее создаем скин в unity3d (ПКМ в окне project > create > GUI Skin). В окне inspector открываем вкладку сustom styles. Устанавливаем size = 11 (т.к. у нас будет 11 картинок цифер. Т.е. 1, 2, 3,4,5,6,7,8,9, 0 и $). Меняем название вкладок с Example 1, 2, 3 и тд, на money_0, money_1 и тд. Заходим в money_0 -> normal и в поле background cуем картинку, где рисунок цифры 0. Так же делаем со всеми остальными.

Создаем скрипт moneyShow.cs.
создаем массив money:

Синтаксис:
Используется csharp
public int[] money = { 0, 0, 0, 0, 0, 0, 0 }; // нулей должно быть столько же, сколько цифер в макс. Возможном кол-ве денег. Например, если макс. Число – 9999999999, то нулей должно быть 10.


после делаем переменную для скина:
Синтаксис:
Используется csharp
        public GUISkin hudskin; // тоесть тут будет храниться тот скин, который мы создали


переменная отвечающая за высоту букв. обычно она одинаковая, это ширина может быть разной у каждой буквы:
Синтаксис:
Используется csharp
public int heightChar = тут у каждого свое;


и последняя переменная, которая будет отвечать за координату "y" у всех цифер:
Синтаксис:
Используется csharp
public int charPositionY = 10;// 10 будет достаточно, а потом вы сами под себя настроите.



Во функции OnGUI определяем скин:
Синтаксис:
Используется csharp
GUI.skin = hudskin;//когда мы закончим вешаем этот скрипт на игрока и добавляем скин который мы создали в эту переменную. это можно будет сделать в unity3d, просто перетащить скин из окна project в окно inspector и там будет поле во вкладке нашего скрипта.



делаем цикл for:
Синтаксис:
Используется csharp
for (int i = 0; i < x; i++){   } // x = кол-во нулей в массиве money.  В моем случае 7.


В этом цикле делаем условный оператор switch:
Синтаксис:
Используется csharp
for (int i = 0; i < 7; i++){
switch (money[i]){// Тут условием будет ячейка в массиве с положением равное i в цикле.
                        //  если эта ячейка равная нулю, то мы рисуем картинку. О функции charPositionX я расскажу позже, но x координата нашей картинки будет равна результату этой функции. в название стиля money_0. Абсолютно так же делаем с другими картинками, только меняем значение после case, меняем, высоту картинки, ширину и название. Всего условий должно быть 10, т.к 10 цифер.
                        case 0: GUI.Box(new Rect(charPositionX (i), charPositionY, ”тут ширина картинки”  , heightChar), "", GUI.skin.GetStyle("money_0")); break;
                        }
 


Уже вне оператора и цикла дорисовываем значок. Тут координата по x будет статическая. То есть она изменяться не будет и функция charPositionX не нужна, но чтобы найти значение х надо сделать сначла эту функцию, а пока рисуем без x:
Синтаксис:
Используется csharp
GUI.Box(new Rect(“тут будет x”, charPositionY, ”тут ширина картинки”  ,  heightChar), "", GUI.skin.GetStyle("money_$"));


Создаем функцию charPositionX типа int:
Синтаксис:
Используется csharp
int charPositionX (int j){ // в функцию надо передать значение, это значение равно i в цикле выше. Если вы посмотрите, когда мы вызываем эту функцию, то увидите, что мы передаем значение i (j – это просто переменная в которую мы записываем i)  
                switch (j){//опять условный оператор. тут условий должно быть. 7, т.к. 7 значное максимальное число у меня будет 9999999.

                case 0: return 10; break        ; // результатом эта функция возвращает координату по x. Тоесть каждая цифра стоит в своем месте. Например, у меня 1 цифра будет стоять в 10 пикс. От начала координат. Все последующие значения исходят от размеров картинок.    
default: return 0; break;// если не одно число из выше приведённых не совпало, то возвращаем 0. Без этого функция не будет работать. По идеи это условие не должно вызываться.
                }
               
        }
 



Теперь смотрим на результат координаты x последнего case. И к нему прибавляем какое-то число и вписываем вместо “тут будет x”, когда мы рисовали доллар.

готовый код:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class heroBarDisplay : MonoBehaviour {
       
        public GUISkin hudskin;
        public int[] money = {0, 0, 0, 0, 0, 0, 0 };

       
        // Use this for initialization
        int charPositionX (int j){
               
                switch (j){
                case 0: return 10; break;
                case 1: return 63; break;
                case 2: return 116; break;
                case 3: return 169; break;
                case 4: return 222; break;
                case 5: return 275; break;
                case 6: return 328; break;
                default: return 0; break;
                }
               
        }
       
       
        // Update is called once per frame
        void OnGUI () {

                       
public GUISkin hudskin;
               
                        for (int i = 0; i < 7; i++){
                        switch (money[i]){
                       
                        case 0: GUI.Box(new Rect(charPositionX (i), charPositionY, тут ширина картинки, heightChar), "", GUI.skin.GetStyle("money_0")); break;
                        case 1: GUI.Box(new Rect(charPositionX (i), charPositionY, тут ширина картинки, heightChar), "", GUI.skin.GetStyle("money_1")); break;
                        case 2: GUI.Box(new Rect(charPositionX (i), charPositionY, тут ширина картинки, heightChar), "", GUI.skin.GetStyle("money_2")); break;
                        case 3: GUI.Box(new Rect(charPositionX (i), charPositionY, тут ширина картинки, heightChar), "", GUI.skin.GetStyle("money_3")); break;
                        case 4: GUI.Box(new Rect(charPositionX (i), charPositionY, тут ширина картинки, heightChar), "", GUI.skin.GetStyle("money_4")); break;
                        case 5: GUI.Box(new Rect(charPositionX (i), charPositionY, тут ширина картинки, heightChar), "", GUI.skin.GetStyle("money_5")); break;
                        case 6: GUI.Box(new Rect(charPositionX (i), charPositionY, тут ширина картинки, heightChar), "", GUI.skin.GetStyle("money_6")); break;
                        case 7: GUI.Box(new Rect(charPositionX (i), charPositionY, тут ширина картинки, heightChar), "", GUI.skin.GetStyle("money_7")); break;
                        case 8: GUI.Box(new Rect(charPositionX (i), charPositionY, тут ширина картинки, heightChar), "", GUI.skin.GetStyle("money_8")); break;
                        case 9: GUI.Box(new Rect(charPositionX (i),charPositionY, тут ширина картинки, heightChar), "", GUI.skin.GetStyle("money_9")); break;
                        }
                        }
                        GUI.Box(new Rect(“тут будет x”, charPositionY, ”тут ширина картинки”  , heightChar), "", GUI.skin.GetStyle("money_$"));


                       
               
        }
}
 



Если старожилы одобрят скрипт и кому-то захочется я могу сделать урок, как убрать не нужные нолики или как к этому счету добавлять денег. Будут вопросы пишите! Будут замечания пишите! Если есть другой, более легкий способ...
Скрытый текст:
пишите!
Я помог? Ты Unity разработчик? ПОМОГИ МНЕ! Поставь лайк за проект Mission: Defender на Unity Connect ЗДЕСЬ !
romeo98
UNITрон
 
Сообщения: 312
Зарегистрирован: 03 янв 2014, 15:54
Skype: romeotallinn
  • Сайт

Вернуться в Уроки

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3