using System; using System.Collections; using System.Collections.Generic; using Uniject; namespace UnityEngine.Purchasing.Extension { [HideInInspector] [AddComponentMenu("")] internal class UnityUtil : MonoBehaviour, IUtil { private static readonly List s_Callbacks = new List(); private static volatile bool s_CallbacksPending; private static readonly List s_PcControlledPlatforms = new List { RuntimePlatform.LinuxPlayer, RuntimePlatform.OSXEditor, RuntimePlatform.OSXPlayer, RuntimePlatform.WindowsEditor, RuntimePlatform.WindowsPlayer, }; public T[] GetAnyComponentsOfType() where T : class { var objects = (GameObject[])FindObjectsOfType(typeof(GameObject)); var result = new List(); foreach (var o in objects) { foreach (var mono in o.GetComponents()) { if (mono is T) { result.Add(mono as T); } } } return result.ToArray(); } public DateTime currentTime => DateTime.Now; public string persistentDataPath => Application.persistentDataPath; /// /// WARNING: Reading from this may require special application privileges. /// public string deviceUniqueIdentifier => SystemInfo.deviceUniqueIdentifier; public string unityVersion => Application.unityVersion; public string cloudProjectId => Application.cloudProjectId; public string userId => PlayerPrefs.GetString("unity.cloud_userid", String.Empty); public string gameVersion => Application.version; public UInt64 sessionId => UInt64.Parse(PlayerPrefs.GetString("unity.player_sessionid", "0")); public RuntimePlatform platform => Application.platform; public bool isEditor => Application.isEditor; public string deviceModel => SystemInfo.deviceModel; public string deviceName => SystemInfo.deviceName; public DeviceType deviceType => SystemInfo.deviceType; public string operatingSystem => SystemInfo.operatingSystem; public int screenWidth => Screen.width; public int screenHeight => Screen.height; public float screenDpi => Screen.dpi; public string screenOrientation => Screen.orientation.ToString(); object IUtil.InitiateCoroutine(IEnumerator start) { return StartCoroutine(start); } void IUtil.InitiateCoroutine(IEnumerator start, int delay) { DelayedCoroutine(start, delay); } public void RunOnMainThread(Action runnable) { lock (s_Callbacks) { s_Callbacks.Add(runnable); s_CallbacksPending = true; } } public object GetWaitForSeconds(int seconds) { return new WaitForSeconds(seconds); } private void Start() { DontDestroyOnLoad(gameObject); } public static T FindInstanceOfType() where T : MonoBehaviour { return (T)FindObjectOfType(typeof(T)); } public static T LoadResourceInstanceOfType() where T : MonoBehaviour { return ((GameObject)Instantiate(Resources.Load(typeof(T).ToString()))).GetComponent(); } public static bool PcPlatform() { return s_PcControlledPlatforms.Contains(Application.platform); } private IEnumerator DelayedCoroutine(IEnumerator coroutine, int delay) { yield return new WaitForSeconds(delay); StartCoroutine(coroutine); } private void Update() { if (!s_CallbacksPending) { return; } // We copy our actions to another array to avoid // locking the queue whilst we process them. Action[] copy; lock (s_Callbacks) { if (s_Callbacks.Count == 0) { return; } copy = new Action[s_Callbacks.Count]; s_Callbacks.CopyTo(copy); s_Callbacks.Clear(); s_CallbacksPending = false; } foreach (var action in copy) { action(); } } private readonly List> pauseListeners = new List>(); public void AddPauseListener(Action runnable) { pauseListeners.Add(runnable); } public void OnApplicationPause(bool paused) { foreach (var listener in pauseListeners) { listener(paused); } } public bool IsClassOrSubclass(Type potentialBase, Type potentialDescendant) { return potentialDescendant.IsSubclassOf(potentialBase) || potentialDescendant == potentialBase; } } }