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); if(pointstat >0) //если очков статов больше 0 делаем кнопки для повышения статов { GUI.Label(new Rect(10,250,300,20),"points "+pointstat.ToString()); if(GUI.Button (new Rect(150,155,20,20), "+")) //Для силы { if(pointstat > 0) { pointstat -= 1; stats.STR += 1; stats.newdmg(); } } if(GUI.Button (new Rect(150,170,20,20), "+")) //Для живучести { if(pointstat > 0) { pointstat -= 1; stats.vitality += 1; stats.newhp(); } } if(GUI.Button (new Rect(150,185,20,20), "+")) //Для маны { if(pointstat > 0) { pointstat -= 1; stats.energy += 1; stats.newmp(); } } } } else if(showstat == 0) useGUILayout=false; //Скрываем окно статов if(death==true) //Если умерли { if(GUI.Button (new Rect(Screen.width/2,Screen.height/2,100,50),"Переиграть")) //Ресуем кнопку переиграть { Application.LoadLevel (0); } } } } Так же пишем новый скрипт weaponstat Код using UnityEngine; using System.Collections; 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 () { } }

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-23 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: