using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace SanAndreasUnity.Behaviours {
public class SceneChangedMessage {
public Scene s1;
public Scene s2;
}
public class GameManager : MonoBehaviour {
public static GameManager Instance { get ; private set ; }
public static bool CursorLocked { get ; private set ; }
public Texture2D logoTexture = null;
public GameObject barPrefab;
[SerializeField] [Range(10, 100)] private int m_defaultMaxFps = 60;
[SerializeField] [Range(10, 100)] private int m_defaultMaxFpsOnMobile = 25;
[SerializeField] [Range(5, 100)] int m_defaultPhysicsUpdateRate = 30;
[SerializeField] [Range(5, 100)] int m_defaultPhysicsUpdateRateOnMobile = 20;
public static int DefaultLayerIndex => 0;
public Vector2 cursorSensitivity = new Vector2(2f, 2f);
/// Are we in a startup scene ?
public static bool IsInStartupScene { get { return UnityEngine.SceneManagement.SceneManager.GetActiveScene ().buildIndex == 0; } }
static GameManager()
{
// set culture to invariant to avoid localization problems
// need to do it in static constructor, before any other thread is created
// note: this will also run in edit-mode
System.Globalization.CultureInfo.CurrentCulture =
System.Globalization.CultureInfo.CurrentUICulture =
System.Globalization.CultureInfo.DefaultThreadCurrentCulture =
System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = System.Globalization.CultureInfo.InvariantCulture;
}
private void Awake() {
if (null == Instance)
Instance = this;
// set default max fps
if (Application.isMobilePlatform)
SetMaxFps(m_defaultMaxFpsOnMobile);
else
SetMaxFps(m_defaultMaxFps);
// set default physics update rate
if (Application.isMobilePlatform)
Time.fixedDeltaTime = 1.0f / m_defaultPhysicsUpdateRateOnMobile;
else
Time.fixedDeltaTime = 1.0f / m_defaultPhysicsUpdateRate;
}
void OnEnable ()
{
SceneManager.activeSceneChanged += this.OnSceneChangedInternal;
}
void OnDisable ()
{
SceneManager.activeSceneChanged -= this.OnSceneChangedInternal;
}
void OnSceneChangedInternal (Scene s1, Scene s2)
{
Utilities.F.SendMessageToObjectsOfType("OnSceneChanged", new SceneChangedMessage() {s1 = s1, s2 = s2});
}
void Start () {
}
void Update () {
// Fix cursor state if it has been 'broken', happens eg. with zoom gestures in the editor in macOS
if (CursorLocked && ((Cursor.lockState != CursorLockMode.Locked) || (Cursor.visible)))
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
}
public static bool CanPlayerReadInput() {
return Loader.HasLoaded && !UI.PauseMenu.IsOpened;
}
public static void ChangeCursorState(bool locked, bool updateVisibility = true)
{
CursorLocked = locked;
Cursor.lockState = locked ? CursorLockMode.Locked : CursorLockMode.None;
if (updateVisibility)
Cursor.visible = !locked;
}
public static void ExitApplication() {
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit ();
#endif
}
public static void SetMaxFps (int maxFps)
{
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = maxFps;
}
public static int GetMaxFps ()
{
if (!IsFpsLimited ())
return 0;
return Application.targetFrameRate;
}
public static bool IsFpsLimited ()
{
return QualitySettings.vSyncCount == 0;
}
}
}