ui基本完毕,修了一大把的bug
This commit is contained in:
@@ -35,6 +35,13 @@ public class UI_Player : MonoBehaviour
|
||||
public Text firstFCsong;
|
||||
public Text totalPlayTime;
|
||||
|
||||
[Header("uLevel")]
|
||||
[SerializeField] private userLevel_skills_SO userLevelConfig;
|
||||
public Slider userLevelSlider;
|
||||
public Text userCurrentLevelText;
|
||||
public Text userNextLevelText;
|
||||
public Text userCurrentExpText;
|
||||
|
||||
[Header("uRks")]
|
||||
public Slider uRksSlider;
|
||||
public Text uRksText;
|
||||
@@ -50,6 +57,7 @@ public class UI_Player : MonoBehaviour
|
||||
{
|
||||
BindQuitButton();
|
||||
PlayerRksService.OnRksChanged += HandleRksChanged;
|
||||
PlayerExperienceLedger.EnsureInstance().OnExperienceChanged += HandlePlayerExperienceChanged;
|
||||
StartCoroutine(InitializeAsync());
|
||||
}
|
||||
|
||||
@@ -58,12 +66,17 @@ public class UI_Player : MonoBehaviour
|
||||
BindQuitButton();
|
||||
DisableBlockingBackgroundRaycasts();
|
||||
RefreshRksUi();
|
||||
RefreshLevelUi();
|
||||
RestartForceRefreshUiRoutine();
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
PlayerRksService.OnRksChanged -= HandleRksChanged;
|
||||
if (PlayerExperienceLedger.Instance != null)
|
||||
{
|
||||
PlayerExperienceLedger.Instance.OnExperienceChanged -= HandlePlayerExperienceChanged;
|
||||
}
|
||||
if (forceRefreshUiRoutine != null)
|
||||
{
|
||||
StopCoroutine(forceRefreshUiRoutine);
|
||||
@@ -163,6 +176,7 @@ public class UI_Player : MonoBehaviour
|
||||
StoreOwnershipLedger.EnsureInstance().InitializeIfNeeded();
|
||||
StoreOwnershipLedger.EnsureInstance().ForceSyncMirrorFlags();
|
||||
PlayerRksService.EnsureLoaded(pSO);
|
||||
PlayerExperienceLedger.EnsureInstance().AttachPlayerData(pSO);
|
||||
|
||||
string registerDate = EnsureFirstLaunchDate();
|
||||
UserInfoSnapshot snapshot = BuildUserInfoSnapshot(registerDate);
|
||||
@@ -170,6 +184,7 @@ public class UI_Player : MonoBehaviour
|
||||
ApplyLegacyTextMirrors(snapshot);
|
||||
RebuildInfoEntries(snapshot);
|
||||
RefreshRksUi();
|
||||
RefreshLevelUi();
|
||||
|
||||
yield return null;
|
||||
yield return StartCoroutine(LoadSteamProfileAsync(snapshot.isSteamOnline));
|
||||
@@ -180,6 +195,11 @@ public class UI_Player : MonoBehaviour
|
||||
RefreshRksUi();
|
||||
}
|
||||
|
||||
private void HandlePlayerExperienceChanged(int _)
|
||||
{
|
||||
RefreshLevelUi();
|
||||
}
|
||||
|
||||
private void RefreshRksUi()
|
||||
{
|
||||
float currentRks = PlayerRksService.RefreshAndPersist(pSO);
|
||||
@@ -197,6 +217,168 @@ public class UI_Player : MonoBehaviour
|
||||
}
|
||||
}
|
||||
|
||||
private void RefreshLevelUi()
|
||||
{
|
||||
if (userLevelSlider == null
|
||||
&& userCurrentLevelText == null
|
||||
&& userNextLevelText == null
|
||||
&& userCurrentExpText == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
userLevel_skills_SO levelConfig = ResolveUserLevelConfig();
|
||||
LevelUiState state = BuildLevelUiState(levelConfig, GetCurrentPlayerExperience());
|
||||
|
||||
if (userCurrentLevelText != null)
|
||||
{
|
||||
userCurrentLevelText.text = state.currentLevelText;
|
||||
}
|
||||
|
||||
if (userNextLevelText != null)
|
||||
{
|
||||
userNextLevelText.text = state.nextLevelText;
|
||||
}
|
||||
|
||||
if (userCurrentExpText != null)
|
||||
{
|
||||
userCurrentExpText.text = state.expText;
|
||||
}
|
||||
|
||||
if (userLevelSlider != null)
|
||||
{
|
||||
userLevelSlider.minValue = 0f;
|
||||
userLevelSlider.maxValue = 1f;
|
||||
userLevelSlider.value = state.progress01;
|
||||
}
|
||||
}
|
||||
|
||||
private int GetCurrentPlayerExperience()
|
||||
{
|
||||
if (Application.isPlaying)
|
||||
{
|
||||
return Mathf.Max(0, PlayerExperienceLedger.EnsureInstance().GetExperience());
|
||||
}
|
||||
|
||||
return pSO != null ? Mathf.Max(0, pSO.player_currentEXP) : 0;
|
||||
}
|
||||
|
||||
private userLevel_skills_SO ResolveUserLevelConfig()
|
||||
{
|
||||
if (userLevelConfig != null)
|
||||
{
|
||||
return userLevelConfig;
|
||||
}
|
||||
|
||||
uLevel_skills[] skillPanels = Resources.FindObjectsOfTypeAll<uLevel_skills>();
|
||||
for (int i = 0; i < skillPanels.Length; i++)
|
||||
{
|
||||
if (skillPanels[i] != null && skillPanels[i].ulsSO != null)
|
||||
{
|
||||
userLevelConfig = skillPanels[i].ulsSO;
|
||||
return userLevelConfig;
|
||||
}
|
||||
}
|
||||
|
||||
userLevel_skills_SO[] loadedConfigs = Resources.FindObjectsOfTypeAll<userLevel_skills_SO>();
|
||||
for (int i = 0; i < loadedConfigs.Length; i++)
|
||||
{
|
||||
if (loadedConfigs[i] != null)
|
||||
{
|
||||
userLevelConfig = loadedConfigs[i];
|
||||
return userLevelConfig;
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
if (userLevelConfig == null)
|
||||
{
|
||||
userLevelConfig = UnityEditor.AssetDatabase.LoadAssetAtPath<userLevel_skills_SO>(
|
||||
"Assets/playerInfoDisplay/uls/ulsSO.asset");
|
||||
}
|
||||
#endif
|
||||
|
||||
return userLevelConfig;
|
||||
}
|
||||
|
||||
private static LevelUiState BuildLevelUiState(userLevel_skills_SO config, int currentExp)
|
||||
{
|
||||
currentExp = Mathf.Max(0, currentExp);
|
||||
|
||||
if (config == null || config.skills == null || config.skills.Count == 0)
|
||||
{
|
||||
return new LevelUiState
|
||||
{
|
||||
currentLevelText = "0",
|
||||
nextLevelText = string.Empty,
|
||||
expText = "MAX",
|
||||
progress01 = 1f
|
||||
};
|
||||
}
|
||||
|
||||
List<userLevel_skills_SO.UserLevelSkillEntry> validLevels = new List<userLevel_skills_SO.UserLevelSkillEntry>();
|
||||
for (int i = 0; i < config.skills.Count; i++)
|
||||
{
|
||||
if (config.skills[i] != null)
|
||||
{
|
||||
validLevels.Add(config.skills[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (validLevels.Count == 0)
|
||||
{
|
||||
return new LevelUiState
|
||||
{
|
||||
currentLevelText = "0",
|
||||
nextLevelText = string.Empty,
|
||||
expText = "MAX",
|
||||
progress01 = 1f
|
||||
};
|
||||
}
|
||||
|
||||
validLevels.Sort((left, right) =>
|
||||
{
|
||||
int expCompare = Mathf.Max(0, left.thisLevelNeedExps).CompareTo(Mathf.Max(0, right.thisLevelNeedExps));
|
||||
if (expCompare != 0)
|
||||
{
|
||||
return expCompare;
|
||||
}
|
||||
|
||||
return left.userLevel.CompareTo(right.userLevel);
|
||||
});
|
||||
|
||||
int currentIndex = 0;
|
||||
for (int i = 0; i < validLevels.Count; i++)
|
||||
{
|
||||
if (currentExp >= Mathf.Max(0, validLevels[i].thisLevelNeedExps))
|
||||
{
|
||||
currentIndex = i;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
userLevel_skills_SO.UserLevelSkillEntry currentLevel = validLevels[currentIndex];
|
||||
bool isMaxLevel = currentIndex >= validLevels.Count - 1;
|
||||
int nextRequiredExp = isMaxLevel
|
||||
? Mathf.Max(0, currentLevel.thisLevelNeedExps)
|
||||
: Mathf.Max(0, validLevels[currentIndex + 1].thisLevelNeedExps);
|
||||
|
||||
float progress = isMaxLevel || nextRequiredExp <= 0
|
||||
? 1f
|
||||
: Mathf.Clamp01((float)currentExp / nextRequiredExp);
|
||||
|
||||
return new LevelUiState
|
||||
{
|
||||
currentLevelText = Mathf.Max(0, currentLevel.userLevel).ToString(),
|
||||
nextLevelText = isMaxLevel ? string.Empty : Mathf.Max(0, validLevels[currentIndex + 1].userLevel).ToString(),
|
||||
expText = isMaxLevel ? "MAX" : $"{currentExp}/{nextRequiredExp}",
|
||||
progress01 = progress
|
||||
};
|
||||
}
|
||||
|
||||
private string EnsureFirstLaunchDate()
|
||||
{
|
||||
string playerPrefsDate = PlayerPrefs.GetString(FirstLaunchDatePrefKey, string.Empty);
|
||||
@@ -581,4 +763,12 @@ public class UI_Player : MonoBehaviour
|
||||
public int totalGameEnterCount;
|
||||
public double totalPlaySeconds;
|
||||
}
|
||||
|
||||
private struct LevelUiState
|
||||
{
|
||||
public string currentLevelText;
|
||||
public string nextLevelText;
|
||||
public string expText;
|
||||
public float progress01;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user