ui基本完毕,修了一大把的bug
This commit is contained in:
@@ -1,32 +1,205 @@
|
||||
using System;
|
||||
using Bansonic;
|
||||
using GameServer.Client;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using TMPro;
|
||||
|
||||
public class gameSettings : MonoBehaviour
|
||||
{
|
||||
[Header("multiNotesSigns")]
|
||||
public Toggle multiNoteNoticeToggle;
|
||||
public Text multiNoteNoticeText; // Using Legacy Text object
|
||||
public Text multiNoteNoticeText;
|
||||
|
||||
private const string PrefKey_EnableSyncNotePrefab = "EnableSyncNotePrefab";
|
||||
[Header("joinRankingList")]
|
||||
public Toggle user_accept_joinRankingList;
|
||||
public Text jrlWarningText;
|
||||
|
||||
void Start()
|
||||
private const string PrefKeyEnableSyncNotePrefab = "EnableSyncNotePrefab";
|
||||
private bool _isUpdatingJoinRankingToggle;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (multiNoteNoticeToggle != null)
|
||||
{
|
||||
// Initialize toggle state from PlayerPrefs, default to 1 (true)
|
||||
bool isEnabled = PlayerPrefs.GetInt(PrefKey_EnableSyncNotePrefab, 1) == 1;
|
||||
multiNoteNoticeToggle.isOn = isEnabled;
|
||||
multiNoteNoticeToggle.onValueChanged.RemoveListener(HandleMultiNoteNoticeToggleChanged);
|
||||
multiNoteNoticeToggle.onValueChanged.AddListener(HandleMultiNoteNoticeToggleChanged);
|
||||
}
|
||||
|
||||
// Initialize text based on current toggle value
|
||||
UpdateText(isEnabled);
|
||||
if (user_accept_joinRankingList != null)
|
||||
{
|
||||
user_accept_joinRankingList.onValueChanged.RemoveListener(HandleJoinRankingListToggleChanged);
|
||||
user_accept_joinRankingList.onValueChanged.AddListener(HandleJoinRankingListToggleChanged);
|
||||
}
|
||||
}
|
||||
|
||||
// Add listener to save value and update text when changed
|
||||
multiNoteNoticeToggle.onValueChanged.AddListener((isOn) =>
|
||||
private void OnEnable()
|
||||
{
|
||||
RefreshMultiNoteNoticeState();
|
||||
_ = RefreshJoinRankingStateFromServerAsync();
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
if (multiNoteNoticeToggle != null)
|
||||
{
|
||||
multiNoteNoticeToggle.onValueChanged.RemoveListener(HandleMultiNoteNoticeToggleChanged);
|
||||
}
|
||||
|
||||
if (user_accept_joinRankingList != null)
|
||||
{
|
||||
user_accept_joinRankingList.onValueChanged.RemoveListener(HandleJoinRankingListToggleChanged);
|
||||
}
|
||||
}
|
||||
|
||||
private void RefreshMultiNoteNoticeState()
|
||||
{
|
||||
if (multiNoteNoticeToggle == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bool isEnabled = PlayerPrefs.GetInt(PrefKeyEnableSyncNotePrefab, 1) == 1;
|
||||
multiNoteNoticeToggle.SetIsOnWithoutNotify(isEnabled);
|
||||
UpdateText(isEnabled);
|
||||
}
|
||||
|
||||
private async Awaitable RefreshJoinRankingStateFromServerAsync()
|
||||
{
|
||||
if (user_accept_joinRankingList == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
NetworkManager nm = NetworkManager.Instance;
|
||||
if (nm == null)
|
||||
{
|
||||
PlayerPrefs.SetInt(PrefKey_EnableSyncNotePrefab, isOn ? 1 : 0);
|
||||
PlayerPrefs.Save();
|
||||
UpdateText(isOn);
|
||||
});
|
||||
RefreshJoinRankingListStateFromLocal();
|
||||
await RefreshJoinRankingWarningTextAsync(null);
|
||||
return;
|
||||
}
|
||||
|
||||
LeaderboardMembershipResponse resp = await nm.GetLeaderboardMembership();
|
||||
bool isJoined = resp != null ? resp.is_joined : LeaderboardConsentUtility.HasLeaderboardConsent();
|
||||
LeaderboardConsentUtility.SetLeaderboardConsent(isJoined);
|
||||
|
||||
_isUpdatingJoinRankingToggle = true;
|
||||
user_accept_joinRankingList.SetIsOnWithoutNotify(isJoined);
|
||||
_isUpdatingJoinRankingToggle = false;
|
||||
|
||||
await RefreshJoinRankingWarningTextAsync(resp);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogWarning($"[gameSettings] Failed to refresh leaderboard membership state: {ex.Message}");
|
||||
RefreshJoinRankingListStateFromLocal();
|
||||
await RefreshJoinRankingWarningTextAsync(null);
|
||||
}
|
||||
}
|
||||
|
||||
private void RefreshJoinRankingListStateFromLocal()
|
||||
{
|
||||
if (user_accept_joinRankingList == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_isUpdatingJoinRankingToggle = true;
|
||||
user_accept_joinRankingList.SetIsOnWithoutNotify(LeaderboardConsentUtility.HasLeaderboardConsent());
|
||||
_isUpdatingJoinRankingToggle = false;
|
||||
}
|
||||
|
||||
private async Awaitable RefreshJoinRankingWarningTextAsync(LeaderboardMembershipResponse membership)
|
||||
{
|
||||
if (jrlWarningText == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (membership != null && membership.changed_today && !string.IsNullOrWhiteSpace(membership.next_change_at))
|
||||
{
|
||||
jrlWarningText.text = BuildChangeCooldownText(membership.next_change_at);
|
||||
return;
|
||||
}
|
||||
|
||||
jrlWarningText.text = "下次排行榜更新时间:正在获取...";
|
||||
|
||||
try
|
||||
{
|
||||
jrlWarningText.text = membership != null && !string.IsNullOrWhiteSpace(membership.next_settle_at)
|
||||
? "下次排行榜更新时间:" + membership.next_settle_at
|
||||
: await LeaderboardConsentUtility.BuildNextSettleWarningTextAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogWarning($"[gameSettings] Failed to refresh ranking warning text: {ex.Message}");
|
||||
jrlWarningText.text = "下次排行榜更新时间:--";
|
||||
}
|
||||
}
|
||||
|
||||
private static string BuildChangeCooldownText(string nextChangeAt)
|
||||
{
|
||||
if (DateTime.TryParse(nextChangeAt, out DateTime parsed))
|
||||
{
|
||||
return $"{parsed.Hour}时{parsed.Minute:D2}分后可切换";
|
||||
}
|
||||
|
||||
return "今日已切换";
|
||||
}
|
||||
|
||||
private void HandleMultiNoteNoticeToggleChanged(bool isOn)
|
||||
{
|
||||
PlayerPrefs.SetInt(PrefKeyEnableSyncNotePrefab, isOn ? 1 : 0);
|
||||
PlayerPrefs.Save();
|
||||
UpdateText(isOn);
|
||||
}
|
||||
|
||||
private async void HandleJoinRankingListToggleChanged(bool isOn)
|
||||
{
|
||||
if (_isUpdatingJoinRankingToggle)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
NetworkManager nm = NetworkManager.Instance;
|
||||
if (nm == null)
|
||||
{
|
||||
LeaderboardConsentUtility.SetLeaderboardConsent(isOn);
|
||||
await RefreshJoinRankingWarningTextAsync(null);
|
||||
return;
|
||||
}
|
||||
|
||||
LeaderboardMembershipResponse resp = await nm.UpdateLeaderboardMembership(isOn);
|
||||
bool finalJoined = resp != null ? resp.is_joined : isOn;
|
||||
LeaderboardConsentUtility.SetLeaderboardConsent(finalJoined);
|
||||
|
||||
_isUpdatingJoinRankingToggle = true;
|
||||
user_accept_joinRankingList.SetIsOnWithoutNotify(finalJoined);
|
||||
_isUpdatingJoinRankingToggle = false;
|
||||
|
||||
if (resp != null && !resp.success)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(resp.next_change_at))
|
||||
{
|
||||
gNotice.warning.display(BuildChangeCooldownText(resp.next_change_at));
|
||||
}
|
||||
else if (!string.IsNullOrWhiteSpace(resp.message))
|
||||
{
|
||||
gNotice.warning.display(resp.message);
|
||||
}
|
||||
}
|
||||
|
||||
await RefreshJoinRankingWarningTextAsync(resp);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogWarning($"[gameSettings] Failed to update leaderboard membership: {ex.Message}");
|
||||
gNotice.error.display("排行榜加入状态更新失败");
|
||||
RefreshJoinRankingListStateFromLocal();
|
||||
await RefreshJoinRankingWarningTextAsync(null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,14 +207,18 @@ public class gameSettings : MonoBehaviour
|
||||
{
|
||||
if (multiNoteNoticeText != null)
|
||||
{
|
||||
multiNoteNoticeText.text = isOn ? "已启用多押指示器" : "已禁用多押指示器";
|
||||
multiNoteNoticeText.text = isOn ? "已开启多押提示音符同步显示" : "已关闭多押提示音符同步显示";
|
||||
}
|
||||
|
||||
if (multiNoteNoticeToggle == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Also update the Toggle's own label text if it exists (usually a child object)
|
||||
Text toggleLabel = multiNoteNoticeToggle.GetComponentInChildren<Text>();
|
||||
if (toggleLabel != null)
|
||||
{
|
||||
toggleLabel.text = isOn ? "启用" : "禁用";
|
||||
toggleLabel.text = isOn ? "已开启" : "已关闭";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user