ui基本完毕,修了一大把的bug

This commit is contained in:
FloatGaming
2026-07-13 02:28:39 +08:00
parent 1e20d73e90
commit fd22501f71
958 changed files with 378289 additions and 41038 deletions
+190
View File
@@ -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;
}
}