207 lines
7.1 KiB
C#
207 lines
7.1 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using TMPro;
|
|
using System;
|
|
|
|
|
|
public class RewardsManager : MonoBehaviour {
|
|
public Slider levelBar; //Slider showing the level based on XP
|
|
public TMP_Text XP_show; // Reference to the XP TextMeshPro component
|
|
public TMP_Text level_value; // Reference to the level TextMeshPro component
|
|
public TMP_Text rank_value; // Reference to the rank TextMeshPro component
|
|
public TMP_Text rank_level_UI; // Reference to the InputField component
|
|
|
|
int current_level;
|
|
int x_value;
|
|
|
|
// References to PLAYERPREFS Key for the Player's Rewards Data
|
|
private const string player_RewardsData = "Player_RewardsData";
|
|
|
|
private PlayerData playerData; // List of character information
|
|
|
|
|
|
//Loads and updates XP at component creation.
|
|
private void Awake(){
|
|
// Load player data and update text field immediately upon component creation
|
|
LoadAndUpdateXP();
|
|
}
|
|
|
|
//Loads and updates XP when component becomes enabled.
|
|
private void OnEnable(){
|
|
// Load player data and update text field when component becomes enabled
|
|
LoadAndUpdateXP();
|
|
}
|
|
|
|
//Loads PlayerData and updates the XP text field.
|
|
private void LoadAndUpdateXP(){
|
|
// Load player data
|
|
PlayerData retrieved_playerData = LoadPlayerData();
|
|
int player_xp = retrieved_playerData.xp;
|
|
|
|
if (player_xp < 0){
|
|
player_xp = 0;
|
|
retrieved_playerData.xp = 0;
|
|
SavePlayerData(retrieved_playerData);
|
|
}
|
|
|
|
// Update the text field
|
|
UpdateTextMeshProValue(player_xp.ToString());
|
|
}
|
|
|
|
|
|
//Initializes PlayerData, sets up UI text, and subscribes to InputField change events.
|
|
private void Start(){
|
|
|
|
// If already there's rewards data saved
|
|
if (PlayerPrefs.HasKey(player_RewardsData)){
|
|
playerData = LoadPlayerData();
|
|
|
|
}else{ //no rewards data saved, start somewhere, save and load
|
|
playerData = new PlayerData { xp = 0, rank = "Bronze", prevRank = "Bronze", overall_matches = 0, win_streak = 0, loss_streak = 0, overall_wins = 0, overall_losses = 0, rank_level = 1, prevrank_level = 1,
|
|
rank_game = 0, eliminations = 0, deaths = 0, revives = 0 };
|
|
|
|
SavePlayerData(playerData); //Saves the player's mission_progress data
|
|
playerData = LoadPlayerData();
|
|
}
|
|
|
|
if (playerData.rank != playerData.prevRank){
|
|
Debug.Log("There has been change in the Rank");
|
|
}
|
|
|
|
rank_level_UI.text = "Level " + playerData.rank_level;
|
|
rank_value.text = playerData.rank;
|
|
|
|
}
|
|
|
|
|
|
// Function called whenever the value of the InputField changes
|
|
private void UpdateTextMeshProValue(string newValue){
|
|
// Update the TextMeshPro text with the new value
|
|
if (int.Parse(newValue) != 0){
|
|
StartCoroutine(AnimateTextMeshProValue(newValue));
|
|
}else{
|
|
XP_show.text = newValue;
|
|
}
|
|
|
|
//There is an alternative way of doing this
|
|
int intValue = int.Parse(newValue);
|
|
|
|
// Define level ranges
|
|
int[] levelRanges = { 100, 2650, 3900, 4750, 5600, 6350, 7100, 7850, 8150, 8600, 9050, 9500, 9950, 10400, 10850,
|
|
11300, 11750, 12200, 12350, 12500, 12650, 12800, 12950, 13100, 13250, 13400, 13550, 13700, 13850, 14000,
|
|
14150, 14300, 14450, 14600, 14750, 14900, 15050, 15200, 15350, 15500, 15650, 15800, 15950, 16100, 16250,
|
|
16400, 16550, 16700, 16850, 17000, 17150, 17300, 17450, 17600, 17750, 17900, 18000 };
|
|
|
|
for (int i = 0; i < levelRanges.Length; i++){
|
|
if (intValue <= levelRanges[i]){
|
|
if (intValue < 100){
|
|
current_level = i + 1;
|
|
}
|
|
|
|
// if (intValue == levelRanges[i]){
|
|
if (intValue == levelRanges[i]){
|
|
current_level = i + 1;
|
|
}
|
|
|
|
if ((intValue != levelRanges[i]) && !(intValue < 100)){
|
|
current_level = i;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (current_level != 1){
|
|
//Create animation
|
|
StartCoroutine(Animate_LevelValue(current_level.ToString()));
|
|
}else{
|
|
level_value.text = current_level.ToString();
|
|
}
|
|
|
|
x_value = Mathf.Clamp(current_level, 1, 58);
|
|
float normalizedValue = Mathf.Clamp01((float)x_value / 58f);
|
|
|
|
// Set the normalized value to the Slider
|
|
if (current_level != 0){
|
|
levelBar.StartCoroutine(AnimateSliderValue(normalizedValue));
|
|
}else{
|
|
levelBar.value = normalizedValue;
|
|
}
|
|
}
|
|
|
|
|
|
// Create Slider animation coroutine
|
|
private IEnumerator AnimateSliderValue(float targetValue){
|
|
float animationDuration = 1.0f; // You can adjust the duration of the animation
|
|
float startValue = 0;
|
|
|
|
for (float t = 0f; t < 1.0f; t += Time.deltaTime / animationDuration)
|
|
{
|
|
float animatedValue = Mathf.Lerp(startValue, targetValue, t);
|
|
levelBar.value = animatedValue;
|
|
yield return null;
|
|
}
|
|
|
|
levelBar.value = targetValue;
|
|
}
|
|
|
|
|
|
// Create XP text Animation
|
|
private IEnumerator AnimateTextMeshProValue(string targetValue){
|
|
int targetIntValue = int.Parse(targetValue);
|
|
float animationDuration = 1.0f; // You can adjust the duration of the animation
|
|
|
|
for (float t = 0f; t < 1.0f; t += Time.deltaTime / animationDuration){
|
|
int animatedValue = Mathf.RoundToInt(Mathf.Lerp(0, targetIntValue, t));
|
|
XP_show.text = animatedValue.ToString();
|
|
yield return null;
|
|
}
|
|
|
|
XP_show.text = targetValue;
|
|
|
|
// The rest of your original code
|
|
int intValue = targetIntValue;
|
|
|
|
int[] levelRanges = { /* your level ranges here */ };
|
|
|
|
for (int i = 0; i < levelRanges.Length; i++){
|
|
// Your existing level calculation logic here
|
|
}
|
|
|
|
level_value.text = current_level.ToString();
|
|
}
|
|
|
|
|
|
// Animates changing Level value
|
|
private IEnumerator Animate_LevelValue(string targetValue){
|
|
int targetIntValue = int.Parse(targetValue);
|
|
float animationDuration = 1.0f; // You can adjust the duration of the animation
|
|
|
|
for (float t = 0f; t < 1.0f; t += Time.deltaTime / animationDuration){
|
|
int animatedValue = Mathf.RoundToInt(Mathf.Lerp(0, targetIntValue, t));
|
|
level_value.text = animatedValue.ToString();
|
|
yield return null;
|
|
}
|
|
|
|
level_value.text = targetValue;
|
|
|
|
}
|
|
|
|
|
|
// ** PLAYERPREFS used in this script
|
|
//Saves PlayerData to PlayerPrefs.
|
|
private void SavePlayerData(PlayerData data){
|
|
string jsonData = JsonUtility.ToJson(data);
|
|
PlayerPrefs.SetString(player_RewardsData, jsonData); // Details stored as "PlayerData"
|
|
PlayerPrefs.Save();
|
|
}
|
|
|
|
//Load player data from PlayerPrefs
|
|
PlayerData LoadPlayerData(){
|
|
string jsonData = PlayerPrefs.GetString(player_RewardsData, "{}"); // Details were stored as "PlayerData"
|
|
return JsonUtility.FromJson<PlayerData>(jsonData);
|
|
}
|
|
|
|
}
|