150 lines
4.4 KiB
C#
150 lines
4.4 KiB
C#
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<ScriptableObject>("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<BITAppForUnity>();
|
|
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<BITApp>($"已创建{nameof(BITApp)}");
|
|
stopWatcher.Stop();
|
|
BIT4Log.Log<BITAppForUnity>($"从初始化到创建{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;
|
|
}
|
|
}
|
|
} |