Unity Energy Recovery System – Full Setup Guide
This tutorial explains how to implement a complete Energy Recovery System in Unity using Text and Slider UI elements. The script automatically refills player energy over time, even when the game is closed, and restores the progress when reopened.
🔋 Features
- Automatic energy recovery using real-time tracking.
- Full UI integration with
TextandSlidercomponents. - Persistent save system using
PlayerPrefs. - Works seamlessly on both Android and iOS platforms.
🧩 Step 1: Create UI in Canvas
To build your UI, follow these steps:
- Right-click in the Hierarchy → UI → Canvas.
- Inside the Canvas, create:
- UI → Text → rename to
EnergyText. - UI → Text → rename to
EnergyTime. - UI → Slider → rename to
EnergySlider.
- UI → Text → rename to
- Position your elements for clarity and adjust font colors as needed.
- For the Slider component:
- Max Value: 300
- Min Value: 0
- Uncheck Interactable (it’s a display only).
🧠 Step 2: Attach Script
- Create an empty GameObject named EnergyManager.
- Attach the script below.
- Drag UI components:
EnergyText→ Energy Text fieldEnergyTime→ Energy Time fieldEnergySlider→ Energy Slider field
💻 Full Script
// energyrecoverytime.cs
using UnityEngine;
using UnityEngine.UI;
using System;
using System.Collections;
public class energyrecoverytime : MonoBehaviour
{
public static energyrecoverytime instance;
[Header("Energy Settings")]
public float timeValue = 300;
public float TimeTest;
public int Energy = 5;
public Text Energytime;
public Text EnergyText;
public Slider EnergySlider;
private Coroutine energyCoroutine;
void Awake()
{
instance = this;
Energy = PlayerPrefs.GetInt("Energy", 5);
EnergyText.text = Energy.ToString();
if (EnergySlider != null)
{
EnergySlider.maxValue = 300;
EnergySlider.value = timeValue;
}
}
void Start()
{
if (PlayerPrefs.HasKey("TimeSave"))
{
long timestamp = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
string value = PlayerPrefs.GetString("Time");
long oldTimestamp = Convert.ToInt64(value);
long elapsedSeconds = timestamp - oldTimestamp;
TimeSpan interval = TimeSpan.FromSeconds(elapsedSeconds);
float days = interval.Days;
float hours = interval.Hours;
float minutes = interval.Minutes;
float seconds = interval.Seconds;
float Timesystem = (days * 24) + (hours * 60) + (minutes * 60) + seconds;
float TimeSaves = PlayerPrefs.GetFloat("TimeSave");
if (Timesystem > TimeSaves)
{
float t = Timesystem - TimeSaves;
if (t < 300)
{
if (Energy < 5) AddEnergy(1);
TimeTest = t;
}
else if (t < 600)
{
if (Energy < 4) AddEnergy(2);
else UpdateEnergy();
TimeTest = t - 300;
}
else if (t < 900)
{
if (Energy < 3) AddEnergy(3);
else UpdateEnergy();
TimeTest = t - 600;
}
else if (t < 1200)
{
if (Energy < 2) AddEnergy(4);
else UpdateEnergy();
TimeTest = t - 900;
}
else if (t < 1500)
{
if (Energy < 1) AddEnergy(5);
else UpdateEnergy();
TimeTest = t - 1200;
}
else
{
UpdateEnergy();
}
}
else
{
TimeTest = TimeSaves - Timesystem;
}
timeValue = TimeTest;
PlayerPrefs.DeleteKey("TimeSave");
PlayerPrefs.DeleteKey("Time");
}
if (Energy < 5)
{
if (energyCoroutine != null)
StopCoroutine(energyCoroutine);
energyCoroutine = StartCoroutine(EnergyRecoveryCoroutine());
}
}
IEnumerator EnergyRecoveryCoroutine()
{
while (Energy < 5)
{
if (timeValue > 0)
{
timeValue -= 1f;
DisplayTime(timeValue);
if (EnergySlider != null)
EnergySlider.value = 300 - timeValue;
yield return new WaitForSeconds(1f);
}
else
{
AddEnergy(1);
timeValue = 300;
if (Energy >= 5)
{
Energytime.text = "";
if (EnergySlider != null)
EnergySlider.value = 0;
yield break;
}
}
}
}
void UpdateEnergy()
{
Energy = 5;
PlayerPrefs.SetInt("Energy", Energy);
EnergyText.text = Energy.ToString();
timeValue = 300;
TimeTest = 0;
if (EnergySlider != null)
EnergySlider.value = 0;
}
void AddEnergy(int amount)
{
Energy += amount;
if (Energy > 5) Energy = 5;
PlayerPrefs.SetInt("Energy", Energy);
EnergyText.text = Energy.ToString();
if (Energy >= 5)
{
TimeTest = 0;
Energytime.text = "";
timeValue = 300;
if (EnergySlider != null)
EnergySlider.value = 0;
}
}
void DisplayTime(float timeToDisplay)
{
if (timeToDisplay < 0)
timeToDisplay = 0;
float minutes = Mathf.FloorToInt(timeToDisplay / 60);
float seconds = Mathf.FloorToInt(timeToDisplay % 60);
Energytime.text = string.Format("{0:00}:{1:00}", minutes, seconds);
}
void OnApplicationFocus(bool hasFocus)
{
if (!hasFocus)
{
if (noiluutru.instance.thoigianhoitien == true)
{
PlayerPrefs.SetFloat("thoigianquancao", chaythoigiantien.instance.timeValue);
long timestamp = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
string value = timestamp.ToString();
PlayerPrefs.SetString("Time", value);
}
}
}
public void BTN_time()
{
Energy -= 1;
if (Energy < 0) Energy = 0;
PlayerPrefs.SetInt("Energy", Energy);
EnergyText.text = Energy.ToString();
if (Energy < 5 && energyCoroutine == null)
{
energyCoroutine = StartCoroutine(EnergyRecoveryCoroutine());
}
}
}
✅ Step 3: Test the System
- Press play in Unity Editor.
- Use your in-game button to call BTN_time() and consume energy.
- Watch the timer start and refill automatically.
- Exit and reopen the app — the energy level restores correctly!
🧩 SEO Keywords
Unity energy recovery system, Unity energy regeneration, Unity refill timer, Unity slider UI tutorial, Unity stamina recovery, Unity PlayerPrefs save energy, Unity energy countdown system, Unity mobile game tutorial
📘 Conclusion
This Unity Energy Recovery System helps you design a modern stamina mechanic for mobile or idle games. By combining Text, Slider, and real-time PlayerPrefs saving, your game can deliver a smooth, persistent experience for all users.
Appalo Studio Appalo.net for more Unity tutorials.
0 Comments