Система "Уровней" - Форум - Все для Unity3d

Все для Unity3d> Система "Уровней" - Форум>
Страница 1 из 11
Форум » Unity » Уроки » Система "Уровней" (Хорошая система "Уровней" для персонажей)
Система "Уровней"
DjCrazyДата: Воскресенье, 28.09.2014, 17:17 | Сообщение # 1
Новый писатель
Группа: Пользователи
Сообщений: 5
Статус: Offline
Здравствуйте, если посмотреть на большинство бесплатных систем уровней и скилов, то видно что они не достаточно гибкие и делать разные игры на них сложно.
Вот я решил немного написать чего то более универсального, пока что только система "Уровней", позже сделаю систему скилов.

И так нам нужно 2 файла C# первый именуем
xpInfo
В него пишем следующее
Код

using UnityEngine;
using System.Collections;

public class xpInfo : MonoBehaviour {
     
    public int level = 0;
    public float XP = 0.0f;
    public int skillpoints = 0;
    public int lvlDown = 0;

    public void lvlUP(int lvl, int skills)
    {
       level += lvl;
       if (lvlDown == 0)
          skillpoints += skills;
       else
          lvlDown--;
    }
    public void lvlDOWN(int lvl)
    {
       level -= lvl;
       lvlDown += lvl;
    }
    public void xpDOWN(int xp)
    {
       XP -= xp;
       if (level == 0 && XP < 0)
          XP = 0;
    }
}

Это у нас будет хранение значений уровня и опыта.
Второй файл называем
lvlsANDskills
В него записываем это
Код

using UnityEngine;  
using System.Collections;  

public class lvlsANDskills : MonoBehaviour {  
   
  public int MAXlevel = 20;

  public float multiplier = 2.0f;
  public float XPtoMultiply = 200.0f;

  public float[] XPtoLevels;

  public int skillPointsPerLVL = 1;
  float currentXP;
  int CurrentLevel;
  bool auto = true;
  float nextXPlvl;
  void Start(){  
   CurrentLevel = gameObject.GetComponent<xpInfo> ().level;
   currentXP = gameObject.GetComponent<xpInfo> ().XP;
   if (XPtoLevels.Length > 0)  
   {
    auto = false;
    MAXlevel = XPtoLevels.Length;
    if(CurrentLevel < MAXlevel)
     nextXPlvl = XPtoLevels[CurrentLevel];
   } else  
   {
    auto = true;
    nextXPlvl = XPtoMultiply;
    for (int i = 0; i < CurrentLevel; i++)  
    {
     nextXPlvl *= multiplier;
    }
   }
  }  
  void Update()
  {  
   CurrentLevel = gameObject.GetComponent<xpInfo> ().level;
   currentXP = gameObject.GetComponent<xpInfo> ().XP;
   if (CurrentLevel < MAXlevel)  
   {
    if( currentXP > nextXPlvl)
    {
     gameObject.GetComponent<xpInfo> ().XP -= nextXPlvl;
     gameObject.GetComponent<xpInfo> ().lvlUP(1, skillPointsPerLVL);
     if(auto)
     nextXPlvl *= multiplier;
     else
      if(gameObject.GetComponent<xpInfo> ().level < MAXlevel)
       nextXPlvl = XPtoLevels[gameObject.GetComponent<xpInfo> ().level];
    }
    if( currentXP < 0)
    {
     gameObject.GetComponent<xpInfo> ().lvlDOWN(1);
     if(auto)
      nextXPlvl /= multiplier;
     else
      nextXPlvl = XPtoLevels[gameObject.GetComponent<xpInfo> ().level];
     gameObject.GetComponent<xpInfo> ().XP = nextXPlvl + gameObject.GetComponent<xpInfo> ().XP;
    }
   }
  }
   
   
  void OnGUI()  
  {  
   CurrentLevel = gameObject.GetComponent<xpInfo> ().level;
   currentXP = gameObject.GetComponent<xpInfo> ().XP;
   if (CurrentLevel == MAXlevel)  
   {
    GUI.Box (new Rect (10, 10, 200, 30), "Максимальный уровень");  
   }  
   else  
   {
    GUI.Box (new Rect (10, 10, 200, 30), "Опыт:" + ((int)currentXP).ToString () + "/" + ((int)nextXPlvl).ToString ());  
    GUI.Box (new Rect (10, 50, 200, 30), "Уровень:" + CurrentLevel.ToString () + "/" + MAXlevel.ToString ());  
   }
  }  
}

Теперь этих 2 скрипта цепляем на наш контроллер(First Person Controller или ваш собственный)

Теперь немного о настройках

Для сохранения и загрузки уровней и всего остального сохраняем все public переменные в xpInfo, а при загрузке просто записываем значения обратно.

Есть 2 способа указания максимального уровня и сколько опыта для этого нужно

1 способ(простой)


Преимущество в том, что можно указать сколько угодно уровней и это быстро, но в то же время нельзя точно указать нужное количество опыта для каждого из уровней.

Для этого способа нужно указать для скрипта lvlsANDskills
MAXlevel - это максимальный уровень.
Multiplier - это множитель опыта для каждого следующего уровня.
XPto Multiply - это опыт для первого уровня.
При этом в XPto Levels выставить Size - 0.

Как все работает
Если выставить значения так
MAXlevel - 20
Multiplier - 2
XPto Myltiply - 200

Уровень - сколько опыта нужно
1 - 200
2 - 400
3 - 800
4 - 1600

то есть для каждого следующего уровня нужно опыта предыдущий уровень умножить на множитель.

2 способ

Более долгий способ, но так же более настраиваемый.

Для этого способа нужно указать
в XPto Levels изменить Size на то количество уровней, которое вам нужно и нажать Enter.
После чего ниже появится много полей
Element 0, Element 1, Element 2 и тд.
Каждый элемент значит сколько опыта нужно для соответствующего уровня
Element 0 - для 1 уровня,
Element 1 - для 2 уровня,
Element 2 - для 3 уровня и тд.
Вводим вручную сколько нужно и готово.

ОБЩИЕ ЗНАЧЕНИЯ и ПРАВИЛА
При получении уровня опыт обнуляется.
Если для 1 уровня вы набрали 200 опыта, а для 2 нужно 400, то это значит что вам заново нужно набрать 400 опыта.

Для зачисления очков скилов нужно выставить значение Skill Points Per LVL больше 0, это количество очков скилов за уровень.

Ну вроде все написал, и да те кто разбираются в программировании и не просто копипастят, то могут увидеть так же, что можно начислять очки скилов без начисления уровня, а так же можно отнимать опыт при этом уровень будет снижаться.

Так же пишем что еще нужно добавить в систему уровней для большей универсальности. Позже добавлю систему скилов(именно саму прокачку), а так же систему урона с защитой от разных тип атак и все такое.
 
DetekTORДата: Вторник, 19.07.2016, 19:33 | Сообщение # 2
Новый писатель
Группа: Пользователи
Сообщений: 3
Статус: Offline
Классная система!
 
Форум » Unity » Уроки » Система "Уровней" (Хорошая система "Уровней" для персонажей)
Страница 1 из 11
Поиск:
Свернуть
Развернуть
Необходима авторизация
0
ТОП-5 САЙТА
НОВЫЕ ИГРЫ
ГОРЯЧИЕ ТЕМЫ
СЛУЧАЙНЫЕ ФАЙЛЫ