Unity3D. Создание RPG: Урок 3. Статы, HP и MP бары
Пролог Для начала извиняюсь за такой длительный перерыв. Тем не менее вот и 3 урок. Все формулы использованные в коде носят лишь ознакомительный характер. И так план наших уроков немного изменился. Теперь он выглядит так: 3. Статы. HP и MP бар. 4. Инвентарь. Магазин 5. квесты. 6. AI. Спутник, мобы
План урока: 1. Пишем новый класс 2. Делаем статы персонажу 3. Рисуем бар персонажа
Пишем новый класс
Создадим новый c# скрипт stats и пишем в него
Код
using UnityEngine; using System.Collections;
namespace stats { //Пространство имен stats public class Stats //Объявляем новый класс Stats { public int lvl = 1; //Уровень (по умолчанию 1) public float HP; //Максимальное кол-во жизней(Высчитывается по формуле) public float MP; //Максимальное кол-во маны(Высчитывается по формуле) public float EXP = 1000; //Необходимое кол-во опыта на следующий уровень(По достижению считается заново) public int STR = 20; //Начальное кол-во силы public int vitality = 20; //Начальное кол-во живучести public int energy = 20; //Начальное кол-во энергии public int minATKweapon = 10; //Минимальная атака оружия public int maxATKweapon = 10; //максимальная атака оружия public int minDMG; //Минимальный наносимый урон(Высчитывается по формуле) public int maxDMG; //Максимальный наносимый урон (Высчитывается по формуле)
public Stats() //конструктор класса со стандартными значениями { this.newdmg (); //Считаем урон this.newhp (); //считаем кол-во жизни this.newmp(); //считаем кол-во маны }
public Stats(int lvl, int EXP, int STR, int vitality, int energy) //конструктор класса с о всеми значениями { this.lvl = lvl; //начальный уровень this.EXP = EXP; //необходимое кол-во опыта для следующего уровня this.STR = STR; //начальное кол-во силы this.vitality = vitality; //начальное кол-во живучисти this.energy = energy; //начальное кол-во энергии this.newdmg (); //Считаем урон this.newhp (); //считаем кол-во жизни this.newmp(); //счтаем кол-во маны }
public void lvlUP() //функция вызываемая при повышении уровня { this.lvl += 1; //уровень устанавливаем +1 this.EXP += Mathf.Floor(this.EXP /2.5f); //Высчитываем необходимое кол-во опыта для следующего уровня } public void newdmg() //функция пересчета урона { this.minDMG = minATKweapon * (this.STR + 100) / 100; //минимальный урон this.maxDMG = maxATKweapon * (this.STR + 100) / 100; //максимальный урон } public void newhp() //Пересчет кол-ва жизней { this.HP = Mathf.Floor(this.vitality * 3.6f); } public void newmp() //Пересчет кол-ва маны { this.MP = Mathf.Floor (this.energy * 1.1f); }
} }
Делаем статы персонажу Создадим новый скрипт c# playerstat который вешаем на наш персонаж
Код
using UnityEngine; using System.Collections; using stats; //Используем пространство stats
public class playerstat : MonoBehaviour { public Stats stats = new Stats(1, 600, 20, 20, 20); //Объявляем новый объект Stats public static bool death; //Глобальная переменная отвечающа нам жив ли персонаж int pointstat = 0; //кол-во поинтов дающихся при повышении int showstat = 0; //Отображать ли окно со статами public float curHP; //кол-во жизней персонаж нынешние public float curMP; //кол-во маны персонажа public float curEXP; //кол-во опыта
void Start() { death = false; //По умолчанию персонаж жив Time.timeScale=1; //Игра работает curHP = stats.HP; //В начале у персонажа кол-во жизней максимально curMP = stats.MP; //маны тоже }
void Update () { if(curHP > stats.HP) //если кол-во жизни будет выше максимального кол-ва жизней curHP=stats.HP; //Уравниваем их if(curHP<=0) //Если кол-во жизни меньше или равно 0 { curHP=0; //Ставим 0 дабы наш бар не рисовался не корректно death = true; //Ставим что персонаж мертв Time.timeScale = 0; //Останавливаем игру } if(curMP<0) //Если кол-во маны ниже 0 curMP=0; //Ставим 0 if(curMP > stats.MP) //если кол-во маны больше максимального кол-ва curMP=stats.MP;//уравниваем
if(showstat == 0) //Если окно со статами не отображается { if(Input.GetKeyDown (KeyCode.P)) //Принажатии на клавишу P showstat = 1; //окно со статами будет отображаться } else if(showstat == 1) //если окно со статами отображается { if(Input.GetKeyDown (KeyCode.P)) //При нажатии на клавишу P showstat = 0; //Окно исчезнет }
if(movePlayer.IsDrawWeapon == true) //Проверяем вытащено ли у нас оружие, и если вытащено { stats.minATKweapon = weaponstat.minATKweapon; //Устанавливаем значение минимальной атаки оружия stats.maxATKweapon = weaponstat.maxATKweapon; //Максимальной атаки оружия stats.newdmg(); //Пересчитываем урон согласно оружию } else //если не одето { stats.minATKweapon = 0; //ставим значения в 0 stats.maxATKweapon = 0; stats.newdmg(); //соответственно атака у нас 0 }
if( curEXP >= stats.EXP) //Если количество опыта у нас рано и ли больше нужного кол-ва опыта { stats.lvlUP(); //повышаем уровень curEXP=0; //кол-во опыта ставим 0 pointstat += 5; //Добавляем очки статов } } void OnGUI() { if(showstat == 1) //если статы отображаются { //Рисуем наши статы GUI.Box (new Rect(10, 70, 300, 300), "stats"); GUI.Label (new Rect(10, 95,300,300), "LvL: "+stats.lvl); GUI.Label (new Rect(10, 110,300,300), "hp: "+stats.HP); GUI.Label (new Rect(10, 125,300,300), "mp: "+stats.MP); GUI.Label (new Rect(10, 140,300,300), "exp: "+stats.EXP); GUI.Label (new Rect(10, 155,300,300), "str: "+stats.STR); GUI.Label (new Rect(10, 170,300,300), "vitality: "+stats.vitality); GUI.Label (new Rect(10, 185,300,300), "energy: "+stats.energy); GUI.Label (new Rect(10, 200,300,300), "minDMG: "+stats.minDMG); GUI.Label (new Rect(10, 215,300,300), "maxDMG: "+stats.maxDMG);
public class weaponstat : MonoBehaviour { public static int minATKweapon = 150; public static int maxATKweapon = 200; }
Его надо повесить на само оружие наше. Для этого его выделяем, что бы получилось так
Рисуем бар персонажа Для бара я нарисовал вот такие заготовки
Создаем новый GUI скин(В окне “Project” ПКМ “create>>GUI Skin”). В «Custom Styles» “Size” ставим 4. В появившихся свитках ставим «Name» Соответсвии с баром у меня это: «PlayerBar», «HPbar», «MPbar», «Expbar» В каждом из них в “Normal>>Background” присваеваем необходимый рисунок бара. И создаем новый скрипт PlayerBarDisplay который вешаем на камеру.
Код
using UnityEngine; using System.Collections;
public class PlayerBarDisplay : MonoBehaviour { public GUISkin mySkin; // Скин где хранятся текстуры баров, В инспекторе назначить наш новый созданный скин public playerstat Char; // Объект на котором висят статы public bool Visible = true; //Видимость бара
// Use this for initialization void Start () {
}
void OnGUI () { if(Visible) { //назначаем mySkin текущим скином для GUI GUI.skin = mySkin; //получаем переменную PlayerSt компонент PlayerStats //В инспекторе в Unity нужно указать на игрока playerstat PlayerSt = (playerstat)Char.GetComponent("playerstat"); //получаем значения float MaxHealth = PlayerSt.stats.HP; float CurHealth = PlayerSt.curHP; float MaxMana = PlayerSt.stats.MP; float CurMana = PlayerSt.curMP; float needExp = PlayerSt.stats.EXP; float curExp = PlayerSt.curEXP; //расчитываем коэффицент длинны полосы здоровья float HealthBarLen = CurHealth/MaxHealth; //если умножить на сто то будут проценты //расчитываем коэффицент длинны полосы маны float ManaBarLen = CurMana/MaxMana; //если умножить на сто то будут проценты //расчитываем коэффицент длинны полосы опыта float ExpBarLen = curExp/needExp; //если умножить на сто то будут проценты
//полоса здоровья игрока GUI.Box(new Rect(10,15,254*HealthBarLen,15), " ", GUI.skin.GetStyle("HPbar")); //полоса маны игрока GUI.Box(new Rect(10,30,254*ManaBarLen,15), " ", GUI.skin.GetStyle("MPbar")); //полоса опыта GUI.Box(new Rect(10,55,254*ExpBarLen,15), " ", GUI.skin.GetStyle("EXPbar"));
//рисуем сам бар GUI.Box(new Rect(10,10,254,64), " ", GUI.skin.GetStyle("PlayerBar"));
} }
// Update is called once per frame void Update () {
} }
Категория: Создание игр | Добавил: rak (18 Ноября 2013)
| Автор: rak
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Unity3D. Создание RPG: Урок 3. Статы, HP и MP бары», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
Продолжение лежит на сгоревшем ноутбуке к сожалению. не могу материнку найти на него. все исходники там. сам понимаю что не хорошо получается. но оно обязательно будет.
Молодец что не забросил ) Узнаю эти уроки, сильно переработанные, конечно ) Начинал с них в свое время. Самое трудное для меня тогда было понять get set, основы ООП, потому как с ООП вообще дела на тот момент не имел. Значит, следующая часть - Инвентарь, ждем!