using System; using System.Collections; using System.Collections.Generic; using System.Runtime.Remoting.Contexts; using UnityEngine; using Cysharp.Threading.Tasks; using System.Threading.Tasks; using UnityEngine.InputSystem; using UnityEngine.AddressableAssets; namespace BITKit { public class MouseNotOverGameViewException : System.Exception { public MouseNotOverGameViewException() { } } public class BITAppForUnity : MonoBehaviour, IDiagnostics { 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; public static void ThrowIfNotPlaying() { #if UNITY_EDITOR if (IsPlaying is false) { throw new AppIsNotPlayingException(); } #endif } public static void ThrowIfWindowNotFocus() { #if UNITY_EDITOR if (UnityEditor.EditorWindow.mouseOverWindow.ToString() is not " (UnityEditor.GameView)") { //Debug.Log(UnityEditor.EditorWindow.mouseOverWindow); 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(nameof(BITApp.AppSettings)).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 async void Exit() { #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; await BITApp.Stop(); #else await BITApp.Stop(); Application.Quit(); #endif } private void Start() { var cancellationToken = gameObject.GetCancellationTokenOnDestroy(); cancellationToken.Register(Exit); BIT4Log.Log($"已创建{nameof(BITApp)}"); } private void OnDestroy() { IsPlaying = false; } 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; } } }