Modular experience and leveling system for Unity with four configurable scaling modes:
- Linear
- Polynomial
- Exponential
- Time-based
- Native C# events for performance and decoupled design
- Custom editor previews for XP and time-based progression
- Enemy XP drop calculator included
- Package-ready structure for Unity Package Manager
- Open Unity Package Manager.
- Choose Add package from disk....
- Select
Assets/Libs/Miventech.ExperienceSystem/package.json.
- Add
ExperienceLevelSystemto a GameObject to manage player XP and levels. - Add
ExperienceEnemyDropCalculatorto enemy prefabs to calculate XP reward on defeat. - Use
Miventech.ExperienceSystem.AddXP(amount)to grant XP in Linear/Polynomial/Exponential modes. - Subscribe to events:
OnLevelUpOnXPChangedOnMaxLevelReached
using Miventech.ExperienceSystem;
using UnityEngine;
public class PlayerHUD : MonoBehaviour
{
[SerializeField] private ExperienceLevelSystem Miventech.ExperienceSystem;
private void OnEnable()
{
Miventech.ExperienceSystem.OnLevelUp += HandleLevelUp;
Miventech.ExperienceSystem.OnXPChanged += HandleXPChanged;
Miventech.ExperienceSystem.OnMaxLevelReached += HandleMaxLevel;
}
private void OnDisable()
{
Miventech.ExperienceSystem.OnLevelUp -= HandleLevelUp;
Miventech.ExperienceSystem.OnXPChanged -= HandleXPChanged;
Miventech.ExperienceSystem.OnMaxLevelReached -= HandleMaxLevel;
}
private void HandleLevelUp(int oldLevel, int newLevel)
{
Debug.Log($"Level up! {oldLevel} → {newLevel}");
// Update level label, play animation, etc.
}
private void HandleXPChanged(float currentXP, float xpToNext)
{
float progress = currentXP / xpToNext; // [0, 1]
Debug.Log($"XP: {currentXP:F0} / {xpToNext:F0} ({progress:P0})");
// Update XP bar, etc.
}
private void HandleMaxLevel()
{
Debug.Log("Max level reached!");
}
}using Miventech.ExperienceSystem;
using Miventech.ExperienceSystem.Tools;
using UnityEngine;
public class Enemy : MonoBehaviour
{
[SerializeField] private ExperienceEnemyDropCalculator xpDrop;
[SerializeField] private ExperienceLevelSystem playerExperience;
public void Die()
{
float reward = xpDrop.XPDrop;
playerExperience.AddXP(reward);
Debug.Log($"Enemy defeated. Granted {reward:F1} XP.");
Destroy(gameObject);
}
}using Miventech.ExperienceSystem;
using UnityEngine;
using UnityEngine.UI;
public class XPBar : MonoBehaviour
{
[SerializeField] private ExperienceLevelSystem Miventech.ExperienceSystem;
[SerializeField] private Slider slider;
[SerializeField] private Text levelLabel;
private void Update()
{
slider.value = Miventech.ExperienceSystem.XPProgress; // [0, 1]
levelLabel.text = $"Lv. {Miventech.ExperienceSystem.Level}";
}
}using Miventech.ExperienceSystem;
using UnityEngine;
public class PauseManager : MonoBehaviour
{
[SerializeField] private ExperienceLevelSystem Miventech.ExperienceSystem;
public void OpenMenu()
{
Miventech.ExperienceSystem.TimePaused = true;
}
public void CloseMenu()
{
Miventech.ExperienceSystem.TimePaused = false;
}
}using Miventech.ExperienceSystem.Tools;
using UnityEngine;
public class EnemyScaler : MonoBehaviour
{
[SerializeField] private ExperienceEnemyDropCalculator calculator;
private void Start()
{
for (int level = 1; level <= 10; level++)
{
float xp = calculator.CalculateXPDrop(level);
Debug.Log($"Level {level} enemy → {xp:F1} XP");
}
}
}- Package name:
com.miventech.Miventech.ExperienceSystem - Version:
1.0.0 - Supported Unity:
2020.1and newer