UnityExplorer/src/UI/UIManager.cs

172 lines
5.0 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using UnityExplorer.Core.Config;
using UnityExplorer.Core.Input;
using UnityExplorer.Core.Runtime;
using UnityExplorer.UI.Main;
using UnityExplorer.UI.Main.Home;
using UnityExplorer.UI.Utility;
namespace UnityExplorer.UI
{
public static class UIManager
{
public static GameObject CanvasRoot { get; private set; }
public static EventSystem EventSys { get; private set; }
internal static Font ConsoleFont { get; private set; }
internal static Shader BackupShader { get; private set; }
2021-03-11 17:57:58 +11:00
public static bool ShowMenu
{
get => s_showMenu;
set
2021-03-11 17:57:58 +11:00
{
if (s_showMenu == value || !CanvasRoot)
return;
s_showMenu = value;
CanvasRoot.SetActive(value);
CursorUnlocker.UpdateCursorControl();
2021-03-11 17:57:58 +11:00
}
}
public static bool s_showMenu = true;
2021-03-11 17:57:58 +11:00
internal static void Init()
{
CreateRootCanvas();
LoadBundle();
UIFactory.Init();
MainMenu.Create();
InspectUnderMouse.ConstructUI();
PanelDragger.CreateCursorUI();
// Force refresh of anchors etc
Canvas.ForceUpdateCanvases();
if (!ConfigManager.Hide_On_Startup.Value)
ShowMenu = true;
ExplorerCore.Log("UI initialized.");
}
internal static void Update()
2021-03-11 17:57:58 +11:00
{
if (!CanvasRoot)
2021-03-11 17:57:58 +11:00
return;
if (InspectUnderMouse.Inspecting)
2021-03-11 17:57:58 +11:00
{
InspectUnderMouse.UpdateInspect();
return;
2021-03-11 17:57:58 +11:00
}
if (InputManager.GetKeyDown(ConfigManager.Main_Menu_Toggle.Value))
2021-03-11 17:57:58 +11:00
ShowMenu = !ShowMenu;
if (!ShowMenu)
2021-03-11 17:57:58 +11:00
return;
MainMenu.Instance.Update();
if (EventSystem.current != EventSys)
CursorUnlocker.SetEventSystem();
PanelDragger.Instance.Update();
SliderScrollbar.UpdateInstances();
InputFieldScroller.UpdateInstances();
}
private static void CreateRootCanvas()
{
CanvasRoot = new GameObject("ExplorerCanvas");
UnityEngine.Object.DontDestroyOnLoad(CanvasRoot);
CanvasRoot.hideFlags |= HideFlags.HideAndDontSave;
CanvasRoot.layer = 5;
CanvasRoot.transform.position = new Vector3(0f, 0f, 1f);
EventSys = CanvasRoot.AddComponent<EventSystem>();
InputManager.AddUIModule();
Canvas canvas = CanvasRoot.AddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceCamera;
canvas.referencePixelsPerUnit = 100;
canvas.sortingOrder = 999;
CanvasScaler scaler = CanvasRoot.AddComponent<CanvasScaler>();
scaler.referenceResolution = new Vector2(1920, 1080);
scaler.screenMatchMode = CanvasScaler.ScreenMatchMode.Expand;
CanvasRoot.AddComponent<GraphicRaycaster>();
}
2021-01-02 19:38:01 +01:00
private static void LoadBundle()
{
AssetBundle bundle = null;
try
{
bundle = LoadExplorerUi("modern");
if (bundle == null)
bundle = LoadExplorerUi("legacy");
2021-01-02 19:38:01 +01:00
}
catch
{
// ignored
2021-01-02 19:38:01 +01:00
}
2021-01-02 19:38:01 +01:00
if (bundle == null)
{
ExplorerCore.LogWarning("Could not load the ExplorerUI Bundle!");
ConsoleFont = Resources.GetBuiltinResource<Font>("Arial.ttf");
2021-01-02 19:38:01 +01:00
return;
}
2021-01-02 19:38:01 +01:00
BackupShader = bundle.LoadAsset<Shader>("DefaultUI");
2021-01-02 19:38:01 +01:00
// Fix for games which don't ship with 'UI/Default' shader.
if (Graphic.defaultGraphicMaterial.shader?.name != "UI/Default")
{
2021-01-02 19:38:01 +01:00
ExplorerCore.Log("This game does not ship with the 'UI/Default' shader, using manual Default Shader...");
Graphic.defaultGraphicMaterial.shader = BackupShader;
}
2021-01-02 19:38:01 +01:00
ConsoleFont = bundle.LoadAsset<Font>("CONSOLA");
ExplorerCore.Log("Loaded UI AssetBundle");
}
private static AssetBundle LoadExplorerUi(string id)
{
var data = ReadFully(typeof(ExplorerCore)
.Assembly
.GetManifestResourceStream($"UnityExplorer.Resources.explorerui.{id}.bundle"));
return AssetBundle.LoadFromMemory(data);
}
private static byte[] ReadFully(Stream input)
{
using (var ms = new MemoryStream())
{
byte[] buffer = new byte[81920];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) != 0)
ms.Write(buffer, 0, read);
return ms.ToArray();
}
}
}
}