Суббота, 21 Декабря 2024, 21:30

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [358]
Статьи об общих понятиях связанных с созданием игр.
Программирование [85]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [151]
Статьи о программах для создания игр, уроки и описания.
Софт [44]
Различные программы, в том числе в помощь игроделам.
2D-графика [14]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [17]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [169]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [133]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Типа какой из этих игр вы предпочитаете делать игры?
Всего ответов: 16805
Главная » Статьи » Создание игр

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 () {
   
  }
}
Категория: Создание игр | Добавил: rak (18 Ноября 2013) | Автор: rak
Просмотров: 34029 | Комментарии: 15 | Рейтинг: 4.8/21 |
Теги: Unity, Уроки unity3d, Анимация персонажа, основы c#, Build, новичкам, Unity3D, RPG, Бар персонажа, статы
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Unity3D. Создание RPG: Урок 3. Статы, HP и MP бары», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 15
+1-
14 Серебренный_Рыцарь   (27 Декабря 2014 01:55) [Материал]
Серебренный_РыцарьНу почему ты забросил курс? sad Такие хорошие уроки! Хотелось бы видеть остальные! rolleyes

+0-
11 P@nda   (22 Мая 2014 13:03) [Материал]
P@ndaк стати rak какая у тебя версия unity?

+0-
13 rak   (23 Мая 2014 01:00) [Материал]
Версия у меня всегда последняя, pro. Хотя pro здесь не нужно)

+0-
10 P@nda   (22 Мая 2014 12:59) [Материал]
P@ndarak очень понравились уроки жду продолжение. Очень хочется дописать до конца игруху biggrin

+0-
7 MeryString   (24 Марта 2014 13:18) [Материал]
MeryStringГосподин rak, а как же продолжение?

+0-
8 rak   (24 Марта 2014 14:09) [Материал]
Продолжение лежит на сгоревшем ноутбуке к сожалению. не могу материнку найти на него. все исходники там. сам понимаю что не хорошо получается. но оно обязательно будет.

+0-
9 MeryString   (09 Апреля 2014 12:51) [Материал]
MeryStringТак может переписать заново инвентарь с магазином, там вроде не сложно, могу своими наработками поделиться.

+0-
12 rak   (23 Мая 2014 00:56) [Материал]
Да уже и думаю заново начать писать. Ноут по ходу я не скоро увижу. sad

+0-
6 Izaron   (17 Февраля 2014 18:41) [Материал]
IzaronNGUI круче дефолтного юнитевского гуи, советую заценить

+0-
5 Серебренный_Рыцарь   (30 Ноября 2013 20:26) [Материал]
Серебренный_РыцарьАвтор молодец, многим твои советы помогли! Делай ещё уроки и не останавливайся на этом. thumb

+0-
4 Malgus   (20 Ноября 2013 10:21) [Материал]
Огромное спасибо, до твоих уроков с юнити вообще не дружил, теперь разобрался. все эти действия делаю интуитивно smile жду следующих уроков.

+2-
3 NEBR   (19 Ноября 2013 22:43) [Материал]
NEBRМолодец что не забросил ) Узнаю эти уроки, сильно переработанные, конечно ) Начинал с них в свое время. Самое трудное для меня тогда было понять get set, основы ООП, потому как с ООП вообще дела на тот момент не имел. Значит, следующая часть - Инвентарь, ждем!

+1-
1 Riketta   (19 Ноября 2013 16:42) [Материал]
RikettaСкрин результата бы.

+2-
2 rak   (19 Ноября 2013 17:08) [Материал]
На следующем уроке выложу компилированную сцену.

+0-
15 Par_Zi_Val   (03 Мая 2018 10:49) [Материал]
Я конечно извиняюсь, но когда уже он будет этот следующий урок?

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • FBA
  • Bos Wars
  • Picotron
  • Leadwerks
  • 3DSTATE Engine
  • EMG Studio
  • NeoAxis Engine
  • AresEd
  • Future Pinball
  • GLHeretic
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг