mirror of
https://github.com/GrahamKracker/UnityExplorer.git
synced 2025-07-04 04:22:53 +08:00
Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
6920ca1129 | |||
748e0cabcb | |||
b4b5f1ec93 | |||
5afaf85859 | |||
b65e417ecb |
19
README.md
19
README.md
@ -12,6 +12,10 @@
|
|||||||
<img src="https://img.shields.io/github/downloads/sinai-dev/Explorer/total.svg" />
|
<img src="https://img.shields.io/github/downloads/sinai-dev/Explorer/total.svg" />
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://raw.githubusercontent.com/sinai-dev/Explorer/master/overview.png">
|
||||||
|
</p>
|
||||||
|
|
||||||
- [Current status](#current-status)
|
- [Current status](#current-status)
|
||||||
- [How to install](#how-to-install)
|
- [How to install](#how-to-install)
|
||||||
- [How to use](#how-to-use)
|
- [How to use](#how-to-use)
|
||||||
@ -58,24 +62,23 @@ Requires [BepInEx](https://github.com/BepInEx/BepInEx) to be installed for your
|
|||||||
|
|
||||||
### Mod Config
|
### Mod Config
|
||||||
|
|
||||||
There is a simple Mod Config for the Explorer, which is generated the first time you run it.
|
There is a simple Mod Config for the Explorer. You can access the settings via the "Options" page of the main menu.
|
||||||
|
|
||||||
This config is generated to `[Game_Directory]\Mods\Explorer\config.xml`. Edit the config while the game is closed if you wish to change it.
|
`Main Menu Toggle` (KeyCode)
|
||||||
|
|
||||||
`Main_Menu_Toggle` (KeyCode)
|
|
||||||
* Sets the keybinding for the Main Menu toggle (show/hide all Explorer windows)
|
* Sets the keybinding for the Main Menu toggle (show/hide all Explorer windows)
|
||||||
* See [this article](https://docs.unity3d.com/ScriptReference/KeyCode.html) for a full list of all accepted KeyCodes.
|
* See [this article](https://docs.unity3d.com/ScriptReference/KeyCode.html) for a full list of all accepted KeyCodes.
|
||||||
* Default: `F7`
|
* Default: `F7`
|
||||||
|
|
||||||
`Default_Window_Size` (Vector2)
|
`Default Window Size` (Vector2)
|
||||||
* Sets the default width and height for all Explorer windows when created.
|
* Sets the default width and height for all Explorer windows when created.
|
||||||
* `x` is width, `y` is height.
|
* `x` is width, `y` is height.
|
||||||
* Default: `<x>550</x> <y>700</y>`
|
* Default: `<x>550</x> <y>700</y>`
|
||||||
|
|
||||||
## Features
|
`Default Items per Page` (Int)
|
||||||
[](https://raw.githubusercontent.com/sinai-dev/Explorer/master/overview.png)
|
* Sets the default items per page when viewing lists or search results.
|
||||||
|
* Default: `20`
|
||||||
|
|
||||||
<i>An overview of the different Explorer menus.</i>
|
## Features
|
||||||
|
|
||||||
### Scene Explorer
|
### Scene Explorer
|
||||||
|
|
||||||
|
@ -269,6 +269,7 @@ namespace Explorer
|
|||||||
GUI.skin.label.alignment = TextAnchor.MiddleCenter;
|
GUI.skin.label.alignment = TextAnchor.MiddleCenter;
|
||||||
GUILayout.Label($"[{i}]", new GUILayoutOption[] { GUILayout.Width(30) });
|
GUILayout.Label($"[{i}]", new GUILayoutOption[] { GUILayout.Width(30) });
|
||||||
|
|
||||||
|
GUI.skin.label.alignment = TextAnchor.MiddleLeft;
|
||||||
GUILayout.Label("Key:", new GUILayoutOption[] { GUILayout.Width(40) });
|
GUILayout.Label("Key:", new GUILayoutOption[] { GUILayout.Width(40) });
|
||||||
key.DrawValue(window, (window.width / 2) - 80f);
|
key.DrawValue(window, (window.width / 2) - 80f);
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ namespace Explorer
|
|||||||
|
|
||||||
public KeyCode Main_Menu_Toggle = KeyCode.F7;
|
public KeyCode Main_Menu_Toggle = KeyCode.F7;
|
||||||
public Vector2 Default_Window_Size = new Vector2(550, 700);
|
public Vector2 Default_Window_Size = new Vector2(550, 700);
|
||||||
|
public int Default_Page_Limit = 20;
|
||||||
|
|
||||||
public static void OnLoad()
|
public static void OnLoad()
|
||||||
{
|
{
|
||||||
@ -30,9 +31,9 @@ namespace Explorer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// returns true if settings successfully loaded
|
// returns true if settings successfully loaded
|
||||||
public static bool LoadSettings(bool checkExist = true)
|
public static bool LoadSettings()
|
||||||
{
|
{
|
||||||
if (checkExist && !File.Exists(SETTINGS_PATH))
|
if (!File.Exists(SETTINGS_PATH))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
try
|
try
|
||||||
@ -50,9 +51,9 @@ namespace Explorer
|
|||||||
return Instance != null;
|
return Instance != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SaveSettings(bool checkExist = true)
|
public static void SaveSettings()
|
||||||
{
|
{
|
||||||
if (checkExist && File.Exists(SETTINGS_PATH))
|
if (File.Exists(SETTINGS_PATH))
|
||||||
File.Delete(SETTINGS_PATH);
|
File.Delete(SETTINGS_PATH);
|
||||||
|
|
||||||
using (var file = File.Create(SETTINGS_PATH))
|
using (var file = File.Create(SETTINGS_PATH))
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
<BIECppGameFolder>D:\Steam\steamapps\common\Outward - Il2Cpp</BIECppGameFolder>
|
<BIECppGameFolder>D:\Steam\steamapps\common\Outward - Il2Cpp</BIECppGameFolder>
|
||||||
<!-- Set this to the BepInEx Mono Game folder, without the ending '\' character. -->
|
<!-- Set this to the BepInEx Mono Game folder, without the ending '\' character. -->
|
||||||
<BIEMonoGameFolder>D:\Steam\steamapps\common\Outward</BIEMonoGameFolder>
|
<BIEMonoGameFolder>D:\Steam\steamapps\common\Outward</BIEMonoGameFolder>
|
||||||
|
<!-- <BIEMonoGameFolder>D:\source\Unity Projects\! My Unity Games\NewInputSystemTest\_BUILD</BIEMonoGameFolder> -->
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_ML_Cpp|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_ML_Cpp|AnyCPU' ">
|
||||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||||
@ -242,6 +243,7 @@
|
|||||||
<Compile Include="Extensions\ReflectionExtensions.cs" />
|
<Compile Include="Extensions\ReflectionExtensions.cs" />
|
||||||
<Compile Include="Helpers\InputHelper.cs" />
|
<Compile Include="Helpers\InputHelper.cs" />
|
||||||
<Compile Include="Menu\CursorControl.cs" />
|
<Compile Include="Menu\CursorControl.cs" />
|
||||||
|
<Compile Include="Menu\MainMenu\Pages\OptionsPage.cs" />
|
||||||
<Compile Include="Tests\TestClass.cs" />
|
<Compile Include="Tests\TestClass.cs" />
|
||||||
<Compile Include="UnstripFixes\GUIUnstrip.cs" />
|
<Compile Include="UnstripFixes\GUIUnstrip.cs" />
|
||||||
<Compile Include="UnstripFixes\Internal_LayoutUtility.cs" />
|
<Compile Include="UnstripFixes\Internal_LayoutUtility.cs" />
|
||||||
|
@ -66,7 +66,7 @@ namespace Explorer
|
|||||||
|
|
||||||
new ExplorerCore();
|
new ExplorerCore();
|
||||||
|
|
||||||
HarmonyInstance.PatchAll();
|
//HarmonyInstance.PatchAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoadMCS()
|
void LoadMCS()
|
||||||
|
@ -4,23 +4,23 @@ namespace Explorer
|
|||||||
{
|
{
|
||||||
public class ExplorerCore
|
public class ExplorerCore
|
||||||
{
|
{
|
||||||
public const string NAME = "Explorer (" + PLATFORM + ", " + MODLOADER + ")";
|
public const string NAME = "Explorer (" + PLATFORM + ", " + MODLOADER + ")";
|
||||||
public const string VERSION = "1.8.1";
|
public const string VERSION = "1.8.21";
|
||||||
public const string AUTHOR = "Sinai";
|
public const string AUTHOR = "Sinai";
|
||||||
public const string GUID = "com.sinai.explorer";
|
public const string GUID = "com.sinai.explorer";
|
||||||
|
|
||||||
public const string MODLOADER =
|
|
||||||
#if ML
|
|
||||||
"MelonLoader";
|
|
||||||
#else
|
|
||||||
"BepInEx";
|
|
||||||
#endif
|
|
||||||
public const string PLATFORM =
|
public const string PLATFORM =
|
||||||
#if CPP
|
#if CPP
|
||||||
"Il2Cpp";
|
"Il2Cpp";
|
||||||
#else
|
#else
|
||||||
"Mono";
|
"Mono";
|
||||||
#endif
|
#endif
|
||||||
|
public const string MODLOADER =
|
||||||
|
#if ML
|
||||||
|
"MelonLoader";
|
||||||
|
#else
|
||||||
|
"BepInEx";
|
||||||
|
#endif
|
||||||
|
|
||||||
public static ExplorerCore Instance { get; private set; }
|
public static ExplorerCore Instance { get; private set; }
|
||||||
|
|
||||||
@ -30,11 +30,10 @@ namespace Explorer
|
|||||||
|
|
||||||
ModConfig.OnLoad();
|
ModConfig.OnLoad();
|
||||||
|
|
||||||
InputHelper.Init();
|
|
||||||
|
|
||||||
new MainMenu();
|
new MainMenu();
|
||||||
new WindowManager();
|
new WindowManager();
|
||||||
|
|
||||||
|
InputHelper.Init();
|
||||||
CursorControl.Init();
|
CursorControl.Init();
|
||||||
|
|
||||||
Log($"{NAME} {VERSION} initialized.");
|
Log($"{NAME} {VERSION} initialized.");
|
||||||
|
@ -5,18 +5,41 @@ using UnityEngine;
|
|||||||
namespace Explorer
|
namespace Explorer
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Version-agnostic UnityEngine Input module using Reflection.
|
/// Version-agnostic Input module using Reflection.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class InputHelper
|
public static class InputHelper
|
||||||
{
|
{
|
||||||
// If Input module failed to load at all
|
// If Input module failed to load at all
|
||||||
public static bool NO_INPUT;
|
public static bool NO_INPUT;
|
||||||
|
|
||||||
// Base UnityEngine.Input class
|
// If using new InputSystem module
|
||||||
private static Type Input => _input ?? (_input = ReflectionHelpers.GetTypeByName("UnityEngine.Input"));
|
public static bool USING_NEW_INPUT;
|
||||||
|
|
||||||
|
// Cached Types
|
||||||
|
private static Type TInput => _input ?? (_input = ReflectionHelpers.GetTypeByName("UnityEngine.Input"));
|
||||||
private static Type _input;
|
private static Type _input;
|
||||||
|
|
||||||
// Cached member infos
|
private static Type TKeyboard => _keyboardSys ?? (_keyboardSys = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Keyboard"));
|
||||||
|
private static Type _keyboardSys;
|
||||||
|
|
||||||
|
private static Type TMouse => _mouseSys ?? (_mouseSys = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Mouse"));
|
||||||
|
private static Type _mouseSys;
|
||||||
|
|
||||||
|
private static Type TKey => _key ?? (_key = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Key"));
|
||||||
|
private static Type _key;
|
||||||
|
|
||||||
|
// Cached member infos (new system)
|
||||||
|
private static PropertyInfo _keyboardCurrent;
|
||||||
|
private static PropertyInfo _kbItemProp;
|
||||||
|
private static PropertyInfo _isPressed;
|
||||||
|
private static PropertyInfo _wasPressedThisFrame;
|
||||||
|
private static PropertyInfo _mouseCurrent;
|
||||||
|
private static PropertyInfo _leftButton;
|
||||||
|
private static PropertyInfo _rightButton;
|
||||||
|
private static PropertyInfo _position;
|
||||||
|
private static MethodInfo _readValueMethod;
|
||||||
|
|
||||||
|
// Cached member infos (legacy)
|
||||||
private static PropertyInfo _mousePosition;
|
private static PropertyInfo _mousePosition;
|
||||||
private static MethodInfo _getKey;
|
private static MethodInfo _getKey;
|
||||||
private static MethodInfo _getKeyDown;
|
private static MethodInfo _getKeyDown;
|
||||||
@ -25,49 +48,153 @@ namespace Explorer
|
|||||||
|
|
||||||
public static void Init()
|
public static void Init()
|
||||||
{
|
{
|
||||||
if (Input == null && !TryManuallyLoadInput())
|
if (TKeyboard != null || TryManuallyLoadNewInput())
|
||||||
{
|
{
|
||||||
NO_INPUT = true;
|
InitNewInput();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cache reflection now that we know Input is loaded
|
if (TInput != null || TryManuallyLoadLegacyInput())
|
||||||
|
{
|
||||||
|
InitLegacyInput();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_mousePosition = Input.GetProperty("mousePosition");
|
ExplorerCore.LogWarning("Could not find any Input module!");
|
||||||
|
NO_INPUT = true;
|
||||||
_getKey = Input.GetMethod("GetKey", new Type[] { typeof(KeyCode) });
|
|
||||||
_getKeyDown = Input.GetMethod("GetKeyDown", new Type[] { typeof(KeyCode) });
|
|
||||||
_getMouseButton = Input.GetMethod("GetMouseButton", new Type[] { typeof(int) });
|
|
||||||
_getMouseButtonDown = Input.GetMethod("GetMouseButtonDown", new Type[] { typeof(int) });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma warning disable IDE1006 // Camel-case property (Unity style)
|
private static void InitNewInput()
|
||||||
public static Vector3 mousePosition
|
{
|
||||||
|
ExplorerCore.Log("Initializing new InputSystem support...");
|
||||||
|
|
||||||
|
USING_NEW_INPUT = true;
|
||||||
|
|
||||||
|
_keyboardCurrent = TKeyboard.GetProperty("current");
|
||||||
|
_kbItemProp = TKeyboard.GetProperty("Item", new Type[] { TKey });
|
||||||
|
|
||||||
|
var btnControl = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Controls.ButtonControl");
|
||||||
|
_isPressed = btnControl.GetProperty("isPressed");
|
||||||
|
_wasPressedThisFrame = btnControl.GetProperty("wasPressedThisFrame");
|
||||||
|
|
||||||
|
_mouseCurrent = TMouse.GetProperty("current");
|
||||||
|
_leftButton = TMouse.GetProperty("leftButton");
|
||||||
|
_rightButton = TMouse.GetProperty("rightButton");
|
||||||
|
|
||||||
|
_position = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Pointer")
|
||||||
|
.GetProperty("position");
|
||||||
|
|
||||||
|
_readValueMethod = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.InputControl`1")
|
||||||
|
.MakeGenericType(typeof(Vector2))
|
||||||
|
.GetMethod("ReadValue");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void InitLegacyInput()
|
||||||
|
{
|
||||||
|
ExplorerCore.Log("Initializing Legacy Input support...");
|
||||||
|
|
||||||
|
_mousePosition = TInput.GetProperty("mousePosition");
|
||||||
|
_getKey = TInput.GetMethod("GetKey", new Type[] { typeof(KeyCode) });
|
||||||
|
_getKeyDown = TInput.GetMethod("GetKeyDown", new Type[] { typeof(KeyCode) });
|
||||||
|
_getMouseButton = TInput.GetMethod("GetMouseButton", new Type[] { typeof(int) });
|
||||||
|
_getMouseButtonDown = TInput.GetMethod("GetMouseButtonDown", new Type[] { typeof(int) });
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool TryManuallyLoadNewInput()
|
||||||
|
{
|
||||||
|
if (ReflectionHelpers.LoadModule("Unity.InputSystem") && TKeyboard != null)
|
||||||
|
{
|
||||||
|
ExplorerCore.Log("Loaded new InputSystem module!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool TryManuallyLoadLegacyInput()
|
||||||
|
{
|
||||||
|
if ((ReflectionHelpers.LoadModule("UnityEngine.InputLegacyModule") || ReflectionHelpers.LoadModule("UnityEngine.CoreModule"))
|
||||||
|
&& TInput != null)
|
||||||
|
{
|
||||||
|
ExplorerCore.Log("Loaded legacy InputModule!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Vector3 MousePosition
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (NO_INPUT) return Vector3.zero;
|
if (NO_INPUT) return Vector3.zero;
|
||||||
|
|
||||||
|
if (USING_NEW_INPUT)
|
||||||
|
{
|
||||||
|
var mouse = _mouseCurrent.GetValue(null, null);
|
||||||
|
var pos = _position.GetValue(mouse, null);
|
||||||
|
|
||||||
|
return (Vector2)_readValueMethod.Invoke(pos, new object[0]);
|
||||||
|
}
|
||||||
|
|
||||||
return (Vector3)_mousePosition.GetValue(null, null);
|
return (Vector3)_mousePosition.GetValue(null, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#pragma warning restore IDE1006
|
|
||||||
|
|
||||||
public static bool GetKeyDown(KeyCode key)
|
public static bool GetKeyDown(KeyCode key)
|
||||||
{
|
{
|
||||||
if (NO_INPUT) return false;
|
if (NO_INPUT) return false;
|
||||||
|
|
||||||
|
if (USING_NEW_INPUT)
|
||||||
|
{
|
||||||
|
var parsed = Enum.Parse(TKey, key.ToString());
|
||||||
|
var currentKB = _keyboardCurrent.GetValue(null, null);
|
||||||
|
var actualKey = _kbItemProp.GetValue(currentKB, new object[] { parsed });
|
||||||
|
|
||||||
|
return (bool)_wasPressedThisFrame.GetValue(actualKey, null);
|
||||||
|
}
|
||||||
|
|
||||||
return (bool)_getKeyDown.Invoke(null, new object[] { key });
|
return (bool)_getKeyDown.Invoke(null, new object[] { key });
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool GetKey(KeyCode key)
|
public static bool GetKey(KeyCode key)
|
||||||
{
|
{
|
||||||
if (NO_INPUT) return false;
|
if (NO_INPUT) return false;
|
||||||
|
|
||||||
|
if (USING_NEW_INPUT)
|
||||||
|
{
|
||||||
|
var parsed = Enum.Parse(TKey, key.ToString());
|
||||||
|
var currentKB = _keyboardCurrent.GetValue(null, null);
|
||||||
|
var actualKey = _kbItemProp.GetValue(currentKB, new object[] { parsed });
|
||||||
|
|
||||||
|
return (bool)_isPressed.GetValue(actualKey, null);
|
||||||
|
}
|
||||||
|
|
||||||
return (bool)_getKey.Invoke(null, new object[] { key });
|
return (bool)_getKey.Invoke(null, new object[] { key });
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <param name="btn">1 = left, 2 = middle, 3 = right, etc</param>
|
/// <param name="btn">0/1 = left, 2 = middle, 3 = right, etc</param>
|
||||||
public static bool GetMouseButtonDown(int btn)
|
public static bool GetMouseButtonDown(int btn)
|
||||||
{
|
{
|
||||||
if (NO_INPUT) return false;
|
if (NO_INPUT) return false;
|
||||||
|
|
||||||
|
if (USING_NEW_INPUT)
|
||||||
|
{
|
||||||
|
var mouse = _mouseCurrent.GetValue(null, null);
|
||||||
|
|
||||||
|
PropertyInfo btnProp;
|
||||||
|
if (btn < 2) btnProp = _leftButton;
|
||||||
|
else btnProp = _rightButton;
|
||||||
|
|
||||||
|
var actualBtn = btnProp.GetValue(mouse, null);
|
||||||
|
|
||||||
|
return (bool)_wasPressedThisFrame.GetValue(actualBtn, null);
|
||||||
|
}
|
||||||
|
|
||||||
return (bool)_getMouseButtonDown.Invoke(null, new object[] { btn });
|
return (bool)_getMouseButtonDown.Invoke(null, new object[] { btn });
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,24 +202,21 @@ namespace Explorer
|
|||||||
public static bool GetMouseButton(int btn)
|
public static bool GetMouseButton(int btn)
|
||||||
{
|
{
|
||||||
if (NO_INPUT) return false;
|
if (NO_INPUT) return false;
|
||||||
|
|
||||||
|
if (USING_NEW_INPUT)
|
||||||
|
{
|
||||||
|
var mouse = _mouseCurrent.GetValue(null, null);
|
||||||
|
|
||||||
|
PropertyInfo btnProp;
|
||||||
|
if (btn < 2) btnProp = _leftButton;
|
||||||
|
else btnProp = _rightButton;
|
||||||
|
|
||||||
|
var actualBtn = btnProp.GetValue(mouse, null);
|
||||||
|
|
||||||
|
return (bool)_isPressed.GetValue(actualBtn, null);
|
||||||
|
}
|
||||||
|
|
||||||
return (bool)_getMouseButton.Invoke(null, new object[] { btn });
|
return (bool)_getMouseButton.Invoke(null, new object[] { btn });
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool TryManuallyLoadInput()
|
|
||||||
{
|
|
||||||
ExplorerCore.Log("UnityEngine.Input is null, trying to load manually....");
|
|
||||||
|
|
||||||
if ((ReflectionHelpers.LoadModule("UnityEngine.InputLegacyModule") || ReflectionHelpers.LoadModule("UnityEngine.CoreModule"))
|
|
||||||
&& Input != null)
|
|
||||||
{
|
|
||||||
ExplorerCore.Log("Ok!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ExplorerCore.Log("Could not load Input module!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ namespace Explorer
|
|||||||
CalculateMaxOffset();
|
CalculateMaxOffset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private int m_itemsPerPage = 20;
|
private int m_itemsPerPage = ModConfig.Instance.Default_Page_Limit;
|
||||||
|
|
||||||
public int ItemCount
|
public int ItemCount
|
||||||
{
|
{
|
||||||
|
@ -33,7 +33,7 @@ namespace Explorer
|
|||||||
if (!UnityHelpers.MainCamera)
|
if (!UnityHelpers.MainCamera)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var ray = UnityHelpers.MainCamera.ScreenPointToRay(InputHelper.mousePosition);
|
var ray = UnityHelpers.MainCamera.ScreenPointToRay(InputHelper.MousePosition);
|
||||||
|
|
||||||
if (Physics.Raycast(ray, out RaycastHit hit, 1000f))
|
if (Physics.Raycast(ray, out RaycastHit hit, 1000f))
|
||||||
{
|
{
|
||||||
@ -61,7 +61,7 @@ namespace Explorer
|
|||||||
{
|
{
|
||||||
if (m_objUnderMouseName != "")
|
if (m_objUnderMouseName != "")
|
||||||
{
|
{
|
||||||
var pos = InputHelper.mousePosition;
|
var pos = InputHelper.MousePosition;
|
||||||
var rect = new Rect(
|
var rect = new Rect(
|
||||||
pos.x - (Screen.width / 2), // x
|
pos.x - (Screen.width / 2), // x
|
||||||
Screen.height - pos.y - 50, // y
|
Screen.height - pos.y - 50, // y
|
||||||
|
@ -17,16 +17,20 @@ namespace Explorer
|
|||||||
Pages.Add(new ScenePage());
|
Pages.Add(new ScenePage());
|
||||||
Pages.Add(new SearchPage());
|
Pages.Add(new SearchPage());
|
||||||
Pages.Add(new ConsolePage());
|
Pages.Add(new ConsolePage());
|
||||||
|
Pages.Add(new OptionsPage());
|
||||||
|
|
||||||
for (int i = 0; i < Pages.Count; i++)
|
for (int i = 0; i < Pages.Count; i++)
|
||||||
{
|
{
|
||||||
var page = Pages[i];
|
var page = Pages[i];
|
||||||
page.Init();
|
page.Init();
|
||||||
|
|
||||||
|
// If page failed to init, it will remove itself from the list. Lower the iterate counter.
|
||||||
|
if (!Pages.Contains(page)) i--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public const int MainWindowID = 5000;
|
public const int MainWindowID = 5000;
|
||||||
public static Rect MainRect = new Rect(5,5, ModConfig.Instance.Default_Window_Size.x,ModConfig.Instance.Default_Window_Size.y);
|
public static Rect MainRect = new Rect(5, 5, ModConfig.Instance.Default_Window_Size.x, ModConfig.Instance.Default_Window_Size.y);
|
||||||
|
|
||||||
public static readonly List<WindowPage> Pages = new List<WindowPage>();
|
public static readonly List<WindowPage> Pages = new List<WindowPage>();
|
||||||
private static int m_currentPage = 0;
|
private static int m_currentPage = 0;
|
||||||
|
99
src/Menu/MainMenu/Pages/OptionsPage.cs
Normal file
99
src/Menu/MainMenu/Pages/OptionsPage.cs
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Explorer.Tests;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace Explorer
|
||||||
|
{
|
||||||
|
public class OptionsPage : WindowPage
|
||||||
|
{
|
||||||
|
public override string Name => "Options";
|
||||||
|
|
||||||
|
public string toggleKeyInputString = "";
|
||||||
|
public Vector2 defaultSizeInputVector;
|
||||||
|
public int defaultPageLimit;
|
||||||
|
|
||||||
|
private CacheObjectBase toggleKeyInput;
|
||||||
|
private CacheObjectBase defaultSizeInput;
|
||||||
|
private CacheObjectBase defaultPageLimitInput;
|
||||||
|
|
||||||
|
public override void Init()
|
||||||
|
{
|
||||||
|
toggleKeyInputString = ModConfig.Instance.Main_Menu_Toggle.ToString();
|
||||||
|
toggleKeyInput = CacheFactory.GetTypeAndCacheObject(typeof(OptionsPage).GetField("toggleKeyInputString"), this);
|
||||||
|
|
||||||
|
defaultSizeInputVector = ModConfig.Instance.Default_Window_Size;
|
||||||
|
defaultSizeInput = CacheFactory.GetTypeAndCacheObject(typeof(OptionsPage).GetField("defaultSizeInputVector"), this);
|
||||||
|
|
||||||
|
defaultPageLimit = ModConfig.Instance.Default_Page_Limit;
|
||||||
|
defaultPageLimitInput = CacheFactory.GetTypeAndCacheObject(typeof(OptionsPage).GetField("defaultPageLimit"), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Update() { }
|
||||||
|
|
||||||
|
public override void DrawWindow()
|
||||||
|
{
|
||||||
|
GUI.skin.label.alignment = TextAnchor.MiddleCenter;
|
||||||
|
GUILayout.Label("<color=orange><size=16><b>Settings</b></size></color>", new GUILayoutOption[0]);
|
||||||
|
GUI.skin.label.alignment = TextAnchor.MiddleLeft;
|
||||||
|
|
||||||
|
GUILayout.BeginVertical(GUIContent.none, GUI.skin.box, new GUILayoutOption[0]);
|
||||||
|
|
||||||
|
GUILayout.BeginHorizontal(new GUILayoutOption[0]);
|
||||||
|
GUILayout.Label($"Menu Toggle Key:", new GUILayoutOption[] { GUILayout.Width(215f) });
|
||||||
|
toggleKeyInput.DrawValue(MainMenu.MainRect, MainMenu.MainRect.width - 215f);
|
||||||
|
GUILayout.EndHorizontal();
|
||||||
|
|
||||||
|
GUILayout.BeginHorizontal(new GUILayoutOption[0]);
|
||||||
|
GUILayout.Label($"Default Window Size:", new GUILayoutOption[] { GUILayout.Width(215f) });
|
||||||
|
defaultSizeInput.DrawValue(MainMenu.MainRect, MainMenu.MainRect.width - 215f);
|
||||||
|
GUILayout.EndHorizontal();
|
||||||
|
|
||||||
|
GUILayout.BeginHorizontal(new GUILayoutOption[0]);
|
||||||
|
GUILayout.Label($"Default Items per Page:", new GUILayoutOption[] { GUILayout.Width(215f) });
|
||||||
|
defaultPageLimitInput.DrawValue(MainMenu.MainRect, MainMenu.MainRect.width - 215f);
|
||||||
|
GUILayout.EndHorizontal();
|
||||||
|
|
||||||
|
if (GUILayout.Button("<color=lime><b>Apply and Save</b></color>", new GUILayoutOption[0]))
|
||||||
|
{
|
||||||
|
ApplyAndSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
GUILayout.EndVertical();
|
||||||
|
|
||||||
|
//GUIUnstrip.Space(10f);
|
||||||
|
|
||||||
|
//GUI.skin.label.alignment = TextAnchor.MiddleCenter;
|
||||||
|
//GUILayout.Label("<color=orange><size=16><b>Other</b></size></color>", new GUILayoutOption[0]);
|
||||||
|
//GUI.skin.label.alignment = TextAnchor.MiddleLeft;
|
||||||
|
|
||||||
|
//GUILayout.BeginVertical(GUIContent.none, GUI.skin.box, new GUILayoutOption[0]);
|
||||||
|
|
||||||
|
//if (GUILayout.Button("Inspect Test Class", new GUILayoutOption[0]))
|
||||||
|
//{
|
||||||
|
// WindowManager.InspectObject(TestClass.Instance, out bool _);
|
||||||
|
//}
|
||||||
|
|
||||||
|
//GUILayout.EndVertical();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ApplyAndSave()
|
||||||
|
{
|
||||||
|
if (Enum.Parse(typeof(KeyCode), toggleKeyInputString) is KeyCode key)
|
||||||
|
{
|
||||||
|
ModConfig.Instance.Main_Menu_Toggle = key;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ExplorerCore.LogWarning($"Could not parse '{toggleKeyInputString}' to KeyCode!");
|
||||||
|
}
|
||||||
|
|
||||||
|
ModConfig.Instance.Default_Window_Size = defaultSizeInputVector;
|
||||||
|
ModConfig.Instance.Default_Page_Limit = defaultPageLimit;
|
||||||
|
|
||||||
|
ModConfig.SaveSettings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -10,7 +10,7 @@ namespace Explorer
|
|||||||
{
|
{
|
||||||
public static ScenePage Instance;
|
public static ScenePage Instance;
|
||||||
|
|
||||||
public override string Name { get => "Scene Explorer"; }
|
public override string Name { get => "Scenes"; }
|
||||||
|
|
||||||
public PageHelper Pages = new PageHelper();
|
public PageHelper Pages = new PageHelper();
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ namespace Explorer
|
|||||||
//var r = GUILayoutUtility.GetLastRect();
|
//var r = GUILayoutUtility.GetLastRect();
|
||||||
var r = Internal_LayoutUtility.GetLastRect();
|
var r = Internal_LayoutUtility.GetLastRect();
|
||||||
|
|
||||||
var mousePos = InputHelper.mousePosition;
|
var mousePos = InputHelper.MousePosition;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -125,7 +125,7 @@ namespace Explorer
|
|||||||
//var r = GUILayoutUtility.GetLastRect();
|
//var r = GUILayoutUtility.GetLastRect();
|
||||||
var r = GUILayoutUtility.GetLastRect();
|
var r = GUILayoutUtility.GetLastRect();
|
||||||
|
|
||||||
var mousePos = InputHelper.mousePosition;
|
var mousePos = InputHelper.MousePosition;
|
||||||
|
|
||||||
var mouse = GUIUnstrip.ScreenToGUIPoint(new Vector2(mousePos.x, Screen.height - mousePos.y));
|
var mouse = GUIUnstrip.ScreenToGUIPoint(new Vector2(mousePos.x, Screen.height - mousePos.y));
|
||||||
if (r.Contains(mouse) && InputHelper.GetMouseButtonDown(0))
|
if (r.Contains(mouse) && InputHelper.GetMouseButtonDown(0))
|
||||||
@ -150,6 +150,7 @@ namespace Explorer
|
|||||||
GUILayout.EndHorizontal();
|
GUILayout.EndHorizontal();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
GUI.skin.label.alignment = TextAnchor.MiddleLeft;
|
||||||
|
|
||||||
return _rect;
|
return _rect;
|
||||||
}
|
}
|
||||||
|
@ -189,7 +189,7 @@ namespace Explorer
|
|||||||
|
|
||||||
private static bool RectContainsMouse(Rect rect)
|
private static bool RectContainsMouse(Rect rect)
|
||||||
{
|
{
|
||||||
var mousePos = InputHelper.mousePosition;
|
var mousePos = InputHelper.MousePosition;
|
||||||
return rect.Contains(new Vector2(mousePos.x, Screen.height - mousePos.y));
|
return rect.Contains(new Vector2(mousePos.x, Screen.height - mousePos.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ namespace Explorer
|
|||||||
#if CPP
|
#if CPP
|
||||||
return Internal.TextField(text, options);
|
return Internal.TextField(text, options);
|
||||||
#else
|
#else
|
||||||
return GUIUnstrip.TextField(text, options);
|
return GUILayout.TextField(text, options);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,63 +75,50 @@ namespace Explorer
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CPP
|
|
||||||
public static bool RepeatButton(string text, params GUILayoutOption[] options)
|
public static bool RepeatButton(string text, params GUILayoutOption[] options)
|
||||||
{
|
{
|
||||||
return Internal.DoRepeatButton(GUIContent.Temp(text), GUI.skin.button, options);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
public static bool RepeatButton(string text, params GUILayoutOption[] args)
|
|
||||||
{
|
|
||||||
return GUILayout.RepeatButton(text, args);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CPP
|
#if CPP
|
||||||
|
return Internal.DoRepeatButton(GUIContent.Temp(text), GUI.skin.button, options);
|
||||||
|
#else
|
||||||
|
return GUILayout.RepeatButton(text, options);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
public static void BeginArea(Rect screenRect, GUIStyle style)
|
public static void BeginArea(Rect screenRect, GUIStyle style)
|
||||||
{
|
{
|
||||||
Internal.BeginArea(screenRect, GUIContent.none, style);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
public static void BeginArea(Rect rect, GUIStyle skin)
|
|
||||||
{
|
|
||||||
GUILayout.BeginArea(rect, skin);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CPP
|
#if CPP
|
||||||
|
Internal.BeginArea(screenRect, GUIContent.none, style);
|
||||||
|
#else
|
||||||
|
GUILayout.BeginArea(screenRect, style);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static public void EndArea()
|
static public void EndArea()
|
||||||
{
|
{
|
||||||
Internal.EndArea();
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
public static void EndArea()
|
|
||||||
{
|
|
||||||
GUILayout.EndArea();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if CPP
|
#if CPP
|
||||||
|
Internal.EndArea();
|
||||||
|
#else
|
||||||
|
GUILayout.EndArea();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static Vector2 BeginScrollView(Vector2 scroll, params GUILayoutOption[] options)
|
public static Vector2 BeginScrollView(Vector2 scroll, params GUILayoutOption[] options)
|
||||||
{
|
{
|
||||||
|
#if CPP
|
||||||
return Internal.BeginScrollView(scroll, options);
|
return Internal.BeginScrollView(scroll, options);
|
||||||
|
#else
|
||||||
|
return GUILayout.BeginScrollView(scroll, options);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EndScrollView(bool handleScrollWheel = true)
|
public static void EndScrollView(bool handleScrollWheel = true)
|
||||||
{
|
{
|
||||||
|
#if CPP
|
||||||
Internal.EndScrollView(handleScrollWheel);
|
Internal.EndScrollView(handleScrollWheel);
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
public static Vector2 BeginScrollView(Vector2 scroll, params GUILayoutOption[] options)
|
|
||||||
{
|
|
||||||
return GUILayout.BeginScrollView(scroll, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void EndScrollView()
|
|
||||||
{
|
|
||||||
GUILayout.EndScrollView();
|
GUILayout.EndScrollView();
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -109,6 +109,8 @@ namespace Explorer.UnstripInternals
|
|||||||
|
|
||||||
public static string TextField(string text, GUILayoutOption[] options)
|
public static string TextField(string text, GUILayoutOption[] options)
|
||||||
{
|
{
|
||||||
|
text = text ?? "";
|
||||||
|
|
||||||
int controlID = GUIUtility.GetControlID(FocusType.Keyboard);
|
int controlID = GUIUtility.GetControlID(FocusType.Keyboard);
|
||||||
GUIContent guicontent = GUIContent.Temp(text);
|
GUIContent guicontent = GUIContent.Temp(text);
|
||||||
bool flag = GUIUtility.keyboardControl != controlID;
|
bool flag = GUIUtility.keyboardControl != controlID;
|
||||||
@ -267,7 +269,7 @@ namespace Explorer.UnstripInternals
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Scrolling
|
#region Scrolling
|
||||||
|
|
||||||
private static Il2CppSystem.Object GetStateObject(Il2CppSystem.Type type, int controlID)
|
private static Il2CppSystem.Object GetStateObject(Il2CppSystem.Type type, int controlID)
|
||||||
{
|
{
|
||||||
@ -653,7 +655,9 @@ namespace Explorer.UnstripInternals
|
|||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class UnstripExtensions
|
#region Extensions
|
||||||
|
|
||||||
|
public static class Extensions
|
||||||
{
|
{
|
||||||
public static Rect Unstripped_GetLast(this GUILayoutGroup group)
|
public static Rect Unstripped_GetLast(this GUILayoutGroup group)
|
||||||
{
|
{
|
||||||
@ -670,5 +674,7 @@ namespace Explorer.UnstripInternals
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user