Что мы получим? Мы получим, что-то вроде индикатора денег в 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;
}
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. Без этого функция не будет работать. По идеи это условие не должно вызываться.
}
}
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_$"));
}
}
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_$"));
}
}
Если старожилы одобрят скрипт и кому-то захочется я могу сделать урок, как убрать не нужные нолики или как к этому счету добавлять денег. Будут вопросы пишите! Будут замечания пишите! Если есть другой, более легкий способ...
Скрытый текст: