using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.Remoting.Contexts; using UnityEngine; using Cysharp.Threading.Tasks; using System.Threading.Tasks; using UnityEngine.InputSystem; using UnityEngine.AddressableAssets; using Debug = UnityEngine.Debug; namespace BITKit { public class MouseNotOverGameViewException : System.Exception { public MouseNotOverGameViewException() { } } public class BITAppForUnity : MonoBehaviour, IDiagnostics { [Serializable] public class OpenUrl:IAction { [SerializeField] private string url; public void Execute() { Application.OpenURL(url); } } [RuntimeInitializeOnLoadMethod] public static void Initialize() { stopWatcher = new Stopwatch(); stopWatcher.Start(); } public struct Path { public const string Entity = nameof(Entity); public const string Services = nameof(Services); public const string Prefabs = nameof(Prefabs); } private static bool IsPlaying { get; set; } public static bool IsPointerOverUI { get; set; } public static ValidHandle AllowCursor = new(); public static ValidHandle AllowTouchSupport = new(); public static GameObject GameObject; private static Stopwatch stopWatcher; public static void ThrowIfNotPlaying() { #if UNITY_EDITOR if (IsPlaying is false) { throw new AppIsNotPlayingException(); } #endif } public static void ThrowIfWindowNotFocus() { #if UNITY_EDITOR var window = UnityEditor.EditorWindow.focusedWindow; var windowName = window is not null ? window.ToString() : string.Empty; switch (windowName) { case " (UnityEditor.GameView)": return; default: throw new MouseNotOverGameViewException(); } #endif } [RuntimeInitializeOnLoadMethod] private static void Reload() { IsPlaying = true; BIT4Log.OnLog += Debug.Log; BIT4Log.OnWarning += Debug.LogWarning; BIT4Log.OnException += Debug.LogException; var settings = Addressables.LoadAssetAsync("Assets/BITKit/Unity/Configs/AppSettings.asset").WaitForCompletion() as BITSettingsSO; //启动BITApp BITApp.Start(Application.productName, settings!.appSettings); AllowCursor = new(); AllowTouchSupport = new(); GameObject = new(nameof(BITApp)); GameObject.AddComponent(); DontDestroyOnLoad(GameObject); AllowCursor.AddListener(ToggleCursor); AllowTouchSupport.AddListener(ToggleTouchSupport); } static void ToggleCursor(bool active) { Cursor.lockState = active ? CursorLockMode.None : CursorLockMode.Locked; Cursor.visible = active; } static void ToggleTouchSupport(bool active) { if (active) { UnityEngine.InputSystem.EnhancedTouch.EnhancedTouchSupport.Enable(); } else { UnityEngine.InputSystem.EnhancedTouch.EnhancedTouchSupport.Disable(); } } [BITCommand] public static void Exit() { BITApp.Stop(); #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; #else Application.Quit(); #endif } private void Start() { BIT4Log.Log($"已创建{nameof(BITApp)}"); stopWatcher.Stop(); BIT4Log.Log($"从初始化到创建{nameof(BITApp)}耗时:{stopWatcher.ElapsedMilliseconds}ms"); } private void OnDestroy() { IsPlaying = false; Exit(); } private void Update() { BITApp.Time.DeltaTime = Time.deltaTime; BITApp.Time.TimeAsDouble = Time.timeAsDouble; } public string GetName() { return nameof(BITApp); } public object GetDiagnostics() { return BITApp.State; } } }