111 lines
3.2 KiB
C#
111 lines
3.2 KiB
C#
using System;
|
|
using GameServer.Client;
|
|
using UnityEngine;
|
|
|
|
public sealed class StartupSettingsApplier : MonoBehaviour
|
|
{
|
|
private const string BootstrapObjectName = "[StartupSettingsApplier]";
|
|
private static StartupSettingsApplier _instance;
|
|
private bool _started;
|
|
|
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
|
|
private static void Bootstrap()
|
|
{
|
|
if (_instance != null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
GameObject go = new GameObject(BootstrapObjectName);
|
|
_instance = go.AddComponent<StartupSettingsApplier>();
|
|
DontDestroyOnLoad(go);
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
if (_started)
|
|
{
|
|
return;
|
|
}
|
|
|
|
_started = true;
|
|
ApplyStartupSettings();
|
|
StartCoroutine(SyncLeaderboardConsentRoutine());
|
|
}
|
|
|
|
private void ApplyStartupSettings()
|
|
{
|
|
ApplyAndroidLandscapeOrientation();
|
|
graphicSettings.ApplySavedDisplaySettingsAtStartup(this);
|
|
ApplySavedAudioSettings();
|
|
}
|
|
|
|
private void ApplyAndroidLandscapeOrientation()
|
|
{
|
|
#if UNITY_ANDROID && !UNITY_EDITOR
|
|
Screen.autorotateToPortrait = false;
|
|
Screen.autorotateToPortraitUpsideDown = false;
|
|
Screen.autorotateToLandscapeLeft = true;
|
|
Screen.autorotateToLandscapeRight = true;
|
|
Screen.orientation = ScreenOrientation.AutoRotation;
|
|
#endif
|
|
}
|
|
|
|
private void ApplySavedAudioSettings()
|
|
{
|
|
audioSettingsPreloader[] preloaders = FindObjectsByType<audioSettingsPreloader>(FindObjectsInactive.Include, FindObjectsSortMode.None);
|
|
for (int i = 0; i < preloaders.Length; i++)
|
|
{
|
|
audioSettingsPreloader preloader = preloaders[i];
|
|
if (preloader == null)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
try
|
|
{
|
|
preloader.ApplyAudioSettings();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Debug.LogWarning($"[StartupSettingsApplier] Failed to apply audio settings via scene preloader: {ex.Message}");
|
|
}
|
|
}
|
|
}
|
|
|
|
private System.Collections.IEnumerator SyncLeaderboardConsentRoutine()
|
|
{
|
|
float timeoutAt = Time.realtimeSinceStartup + 8f;
|
|
while (NetworkManager.Instance == null && Time.realtimeSinceStartup < timeoutAt)
|
|
{
|
|
yield return null;
|
|
}
|
|
|
|
NetworkManager networkManager = NetworkManager.Instance;
|
|
if (networkManager == null)
|
|
{
|
|
yield break;
|
|
}
|
|
|
|
bool isJoined = LeaderboardConsentUtility.HasLeaderboardConsent();
|
|
var task = networkManager.UpdateLeaderboardMembership(isJoined);
|
|
while (!task.IsCompleted)
|
|
{
|
|
yield return null;
|
|
}
|
|
|
|
if (task.IsFaulted)
|
|
{
|
|
Exception ex = task.Exception;
|
|
Debug.LogWarning($"[StartupSettingsApplier] Failed to sync leaderboard consent on startup: {ex?.GetBaseException().Message}");
|
|
yield break;
|
|
}
|
|
|
|
LeaderboardMembershipResponse response = task.Result;
|
|
if (response != null)
|
|
{
|
|
LeaderboardConsentUtility.SetLeaderboardConsent(response.is_joined);
|
|
}
|
|
}
|
|
}
|