mirror of
https://github.com/GrahamKracker/UnityExplorer.git
synced 2025-07-13 23:36:35 +08:00
Compare commits
36 Commits
Author | SHA1 | Date | |
---|---|---|---|
6c25662fe9 | |||
4bcf82ca10 | |||
ce38e8ac50 | |||
12cd718f12 | |||
995e2a3e93 | |||
2c95fec646 | |||
69912d7ea4 | |||
9c5596ace4 | |||
d4dac58fc8 | |||
77b97cbe17 | |||
c6f0f34ac0 | |||
d1f4f74d32 | |||
f13068bf01 | |||
dfc288a101 | |||
544009dc21 | |||
fdfaaadd89 | |||
58d60a10d4 | |||
0432c6d56c | |||
8c34aa2be5 | |||
4a1c54fac1 | |||
190467fa5c | |||
44f54d9190 | |||
3b4ea31b50 | |||
ad7b05f721 | |||
852ca8e9eb | |||
7386eca0c2 | |||
97325a5f3a | |||
82e52de557 | |||
28181e2266 | |||
6dfa4806ce | |||
27f6a6ca52 | |||
cd7b260ea7 | |||
ba986274be | |||
d181c0bee9 | |||
a9faec8cf9 | |||
a6bf91b7af |
51
README.md
51
README.md
@ -17,7 +17,6 @@
|
|||||||
- [Features](#features)
|
- [Features](#features)
|
||||||
- [How to install](#how-to-install)
|
- [How to install](#how-to-install)
|
||||||
- [Mod Config](#mod-config)
|
- [Mod Config](#mod-config)
|
||||||
- [Mouse Control](#mouse-control)
|
|
||||||
- [Building](#building)
|
- [Building](#building)
|
||||||
- [Credits](#credits)
|
- [Credits](#credits)
|
||||||
|
|
||||||
@ -25,11 +24,10 @@
|
|||||||
|
|
||||||
| Mod Loader | IL2CPP | Mono |
|
| Mod Loader | IL2CPP | Mono |
|
||||||
| ----------- | ------ | ---- |
|
| ----------- | ------ | ---- |
|
||||||
| [MelonLoader](https://github.com/HerpDerpinstine/MelonLoader) | ✔️ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.MelonLoader.Il2Cpp.zip) | ✔️ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.MelonLoader.Mono.zip) |
|
| [BepInEx](https://github.com/BepInEx/BepInEx) 6.X | ✔️ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.BepInEx.Il2Cpp.zip) | ❔ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.BepInEx6.Mono.zip) |
|
||||||
| [BepInEx](https://github.com/BepInEx/BepInEx) | ✔️ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.BepInEx.Il2Cpp.zip) | ✔️ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.BepInEx.Mono.zip) |
|
| [BepInEx](https://github.com/BepInEx/BepInEx) 5.X | ❌ | ✔️ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.BepInEx5.Mono.zip) |
|
||||||
|
| [MelonLoader](https://github.com/HerpDerpinstine/MelonLoader) 0.3 | ✔️ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.MelonLoader.Il2Cpp.zip) | ✔️ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.MelonLoader.Mono.zip) |
|
||||||
<b>IL2CPP Issues:</b>
|
| Standalone | ✔️ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.Standalone.Il2Cpp.zip) | ✔️ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.Standalone.Mono.zip) |
|
||||||
* Some methods may still fail with a `MissingMethodException`, please let me know if you experience this (with full debug log please).
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
@ -50,21 +48,31 @@
|
|||||||
|
|
||||||
### BepInEx
|
### BepInEx
|
||||||
|
|
||||||
|
Note: For IL2CPP you should use [BepInEx 6 (Bleeding Edge)](https://builds.bepis.io/projects/bepinex_be), for Mono you should use [BepInEx 5](https://github.com/BepInEx/BepInEx/releases) (until Mono support stabilizes in BepInEx 6).
|
||||||
|
|
||||||
0. Install [BepInEx](https://github.com/BepInEx/BepInEx) for your game.
|
0. Install [BepInEx](https://github.com/BepInEx/BepInEx) for your game.
|
||||||
1. Download the UnityExplorer release for BepInEx IL2CPP or Mono above.
|
1. Download the UnityExplorer release for BepInEx IL2CPP or Mono above.
|
||||||
2. Take the `UnityExplorer.dll` file and put it in `[GameFolder]\BepInEx\plugins\`
|
2. Take the `UnityExplorer.BIE.___.dll` file and put it in `[GameFolder]\BepInEx\plugins\`
|
||||||
3. Take the `UnityExplorer\` folder (with `explorerui.bundle`) and put it in `[GameFolder]\Mods\`, so it looks like `[GameFolder]\Mods\UnityExplorer\explorerui.bundle`.
|
3. In IL2CPP, it is highly recommended to get the base Unity libs for the game's Unity version and put them in the `BepInEx\unity-libs\` folder.
|
||||||
4. In IL2CPP, it is highly recommended to get the base Unity libs for the game's Unity version and put them in the `BepInEx\unhollowed\base\` folder.
|
|
||||||
|
|
||||||
### MelonLoader
|
### MelonLoader
|
||||||
|
|
||||||
|
Note: You must use version 0.3 of MelonLoader or greater. Version 0.3 is currently in pre-release, so you must opt-in from your MelonLoader installer (enable alpha releases).
|
||||||
|
|
||||||
0. Install [MelonLoader](https://github.com/HerpDerpinstine/MelonLoader) for your game.
|
0. Install [MelonLoader](https://github.com/HerpDerpinstine/MelonLoader) for your game.
|
||||||
1. Download the UnityExplorer release for MelonLoader IL2CPP or Mono above.
|
1. Download the UnityExplorer release for MelonLoader IL2CPP or Mono above.
|
||||||
2. Take the contents of the release and put it in the `[GameFolder]\Mods\` folder. It should look like `[GameFolder]\Mods\UnityExplorer.dll` and `[GameFolder]\Mods\UnityExplorer\explorerui.bundle`.
|
2. Take the contents of the release and put it in the `[GameFolder]\Mods\` folder. It should look like `[GameFolder]\Mods\UnityExplorer.ML.___.dll`
|
||||||
|
|
||||||
## Mod Config
|
### Standalone
|
||||||
|
|
||||||
You can access the settings via the "Options" page of the main menu, or directly from the config at `Mods\UnityExplorer\config.ini` (generated after first launch).
|
0. Load the DLL from your mod or inject it.
|
||||||
|
1. Create an instance of Unity Explorer with `new ExplorerCore();`
|
||||||
|
2. You will need to call `ExplorerCore.Update()` (static method) from your Update method.
|
||||||
|
3. Subscribe to the `ExplorerCore.OnLog__` methods for logging.
|
||||||
|
|
||||||
|
## Settings
|
||||||
|
|
||||||
|
You can change the settings via the "Options" page of the main menu, or directly from the config file (generated after first launch). The config file will be found either inside a "UnityExplorer" folder in the same directory as where you put the DLL file, or for BepInEx it will be at `BepInEx\config\UnityExplorer\`.
|
||||||
|
|
||||||
`Main Menu Toggle` (KeyCode)
|
`Main Menu Toggle` (KeyCode)
|
||||||
* Default: `F7`
|
* Default: `F7`
|
||||||
@ -88,17 +96,24 @@ You can access the settings via the "Options" page of the main menu, or directly
|
|||||||
* Default: `false`
|
* Default: `false`
|
||||||
* Listens for Unity `Debug.Log` messages and prints them to UnityExplorer's log.
|
* Listens for Unity `Debug.Log` messages and prints them to UnityExplorer's log.
|
||||||
|
|
||||||
|
`Hide on Startup` (bool)
|
||||||
|
* Default: `false`
|
||||||
|
* If true, UnityExplorer will be hidden when you start the game, you must open it via the keybind.
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
If you'd like to build this yourself, you will need to have installed BepInEx and/or MelonLoader for at least one Unity game. If you want to build all 4 versions, you will need at least one IL2CPP and one Mono game, with BepInEx and MelonLoader installed for both.
|
If you'd like to build this yourself, all you need to do is download this repository and build from Visual Studio. If you want to build for BepInEx or MelonLoader IL2CPP then you will need to install the mod loader for a game and set the directory in the `csproj` file.
|
||||||
|
|
||||||
|
For IL2CPP:
|
||||||
1. Install BepInEx or MelonLoader for your game.
|
1. Install BepInEx or MelonLoader for your game.
|
||||||
2. Open the `src\UnityExplorer.csproj` file in a text editor.
|
2. Open the `src\UnityExplorer.csproj` file in a text editor.
|
||||||
3. For IL2CPP builds, make sure you set `BIECppGameFolder` (for BepInEx) and/or `MLCppGameFolder` (for MelonLoader) so the project can locate the necessary references.
|
3. Set `BIECppGameFolder` (for BepInEx) and/or `MLCppGameFolder` (for MelonLoader) so the project can locate the necessary references.
|
||||||
4. Open the `src\UnityExplorer.sln` project.
|
|
||||||
5. Select `Solution 'UnityExplorer' (1 of 1 project)` in the Solution Explorer panel, and set the <b>Active config</b> property to the version you want to build, then build it.
|
For all builds:
|
||||||
5. The DLLs are built to the `Release\` folder in the root of the repository.
|
1. Open the `src\UnityExplorer.sln` project.
|
||||||
6. If ILRepack fails or is missing, use the NuGet package manager to re-install `ILRepack.Lib.MSBuild.Task`, then re-build.
|
2. Select `Solution 'UnityExplorer' (1 of 1 project)` in the Solution Explorer panel, and set the <b>Active config</b> property to the version you want to build, then build it.
|
||||||
|
3. The DLLs are built to the `Release\` folder in the root of the repository.
|
||||||
|
4. If ILRepack fails or is missing, use the NuGet package manager to re-install `ILRepack.Lib.MSBuild.Task`, then re-build.
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
|
BIN
lib/0Harmony.dll
BIN
lib/0Harmony.dll
Binary file not shown.
BIN
lib/BepInEx.Unity.dll
Normal file
BIN
lib/BepInEx.Unity.dll
Normal file
Binary file not shown.
BIN
lib/BepInEx.dll
BIN
lib/BepInEx.dll
Binary file not shown.
Binary file not shown.
BIN
lib/MelonLoader.dll
Normal file
BIN
lib/MelonLoader.dll
Normal file
Binary file not shown.
Binary file not shown.
@ -32,7 +32,7 @@ namespace UnityExplorer.CSConsole
|
|||||||
private Text inputHighlightText;
|
private Text inputHighlightText;
|
||||||
|
|
||||||
private readonly CSharpLexer highlightLexer;
|
private readonly CSharpLexer highlightLexer;
|
||||||
private readonly StringBuilder sbHighlight;
|
//private readonly StringBuilder sbHighlight;
|
||||||
|
|
||||||
internal int m_lastCaretPos;
|
internal int m_lastCaretPos;
|
||||||
internal int m_fixCaretPos;
|
internal int m_fixCaretPos;
|
||||||
@ -68,7 +68,6 @@ The following helper methods are available:
|
|||||||
|
|
||||||
public CodeEditor()
|
public CodeEditor()
|
||||||
{
|
{
|
||||||
sbHighlight = new StringBuilder();
|
|
||||||
highlightLexer = new CSharpLexer();
|
highlightLexer = new CSharpLexer();
|
||||||
|
|
||||||
ConstructUI();
|
ConstructUI();
|
||||||
@ -76,8 +75,24 @@ The following helper methods are available:
|
|||||||
InputField.onValueChanged.AddListener((string s) => { OnInputChanged(s); });
|
InputField.onValueChanged.AddListener((string s) => { OnInputChanged(s); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static bool IsUserCopyPasting()
|
||||||
|
{
|
||||||
|
return (InputManager.GetKey(KeyCode.LeftControl) || InputManager.GetKey(KeyCode.RightControl))
|
||||||
|
&& InputManager.GetKeyDown(KeyCode.V);
|
||||||
|
}
|
||||||
|
|
||||||
public void Update()
|
public void Update()
|
||||||
{
|
{
|
||||||
|
if (s_copyPasteBuffer != null)
|
||||||
|
{
|
||||||
|
if (!IsUserCopyPasting())
|
||||||
|
{
|
||||||
|
OnInputChanged(s_copyPasteBuffer);
|
||||||
|
|
||||||
|
s_copyPasteBuffer = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (EnableCtrlRShortcut)
|
if (EnableCtrlRShortcut)
|
||||||
{
|
{
|
||||||
if ((InputManager.GetKey(KeyCode.LeftControl) || InputManager.GetKey(KeyCode.RightControl))
|
if ((InputManager.GetKey(KeyCode.LeftControl) || InputManager.GetKey(KeyCode.RightControl))
|
||||||
@ -149,11 +164,18 @@ The following helper methods are available:
|
|||||||
AutoCompleter.ClearAutocompletes();
|
AutoCompleter.ClearAutocompletes();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnInputChanged(string newInput, bool forceUpdate = false)
|
internal static string s_copyPasteBuffer;
|
||||||
{
|
|
||||||
string newText = newInput;
|
|
||||||
|
|
||||||
UpdateIndent(newInput);
|
public void OnInputChanged(string newText, bool forceUpdate = false)
|
||||||
|
{
|
||||||
|
if (IsUserCopyPasting())
|
||||||
|
{
|
||||||
|
//Console.WriteLine("Copy+Paste detected!");
|
||||||
|
s_copyPasteBuffer = newText;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateIndent(newText);
|
||||||
|
|
||||||
if (!forceUpdate && string.IsNullOrEmpty(newText))
|
if (!forceUpdate && string.IsNullOrEmpty(newText))
|
||||||
inputHighlightText.text = string.Empty;
|
inputHighlightText.text = string.Empty;
|
||||||
@ -203,35 +225,29 @@ The following helper methods are available:
|
|||||||
{
|
{
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
|
||||||
sbHighlight.Length = 0;
|
//Console.WriteLine("Highlighting input text:\r\n" + inputText);
|
||||||
|
|
||||||
|
string ret = "";
|
||||||
|
|
||||||
foreach (LexerMatchInfo match in highlightLexer.GetMatches(inputText))
|
foreach (LexerMatchInfo match in highlightLexer.GetMatches(inputText))
|
||||||
{
|
{
|
||||||
for (int i = offset; i < match.startIndex; i++)
|
for (int i = offset; i < match.startIndex; i++)
|
||||||
{
|
ret += inputText[i];
|
||||||
sbHighlight.Append(inputText[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
sbHighlight.Append($"{match.htmlColor}");
|
ret += $"{match.htmlColor}";
|
||||||
|
|
||||||
for (int i = match.startIndex; i < match.endIndex; i++)
|
for (int i = match.startIndex; i < match.endIndex; i++)
|
||||||
{
|
ret += inputText[i];
|
||||||
sbHighlight.Append(inputText[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
sbHighlight.Append(CLOSE_COLOR_TAG);
|
ret += CLOSE_COLOR_TAG;
|
||||||
|
|
||||||
offset = match.endIndex;
|
offset = match.endIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = offset; i < inputText.Length; i++)
|
for (int i = offset; i < inputText.Length; i++)
|
||||||
{
|
ret += inputText[i];
|
||||||
sbHighlight.Append(inputText[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
inputText = sbHighlight.ToString();
|
return ret;
|
||||||
|
|
||||||
return inputText;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AutoIndentCaret()
|
private void AutoIndentCaret()
|
||||||
|
@ -11,7 +11,7 @@ namespace UnityExplorer.Config
|
|||||||
public static ModConfig Instance;
|
public static ModConfig Instance;
|
||||||
|
|
||||||
internal static readonly IniDataParser _parser = new IniDataParser();
|
internal static readonly IniDataParser _parser = new IniDataParser();
|
||||||
internal const string INI_PATH = ExplorerCore.EXPLORER_FOLDER + @"\config.ini";
|
internal static readonly string INI_PATH = Path.Combine(ExplorerCore.EXPLORER_FOLDER, "config.ini");
|
||||||
|
|
||||||
static ModConfig()
|
static ModConfig()
|
||||||
{
|
{
|
||||||
@ -22,9 +22,10 @@ namespace UnityExplorer.Config
|
|||||||
public KeyCode Main_Menu_Toggle = KeyCode.F7;
|
public KeyCode Main_Menu_Toggle = KeyCode.F7;
|
||||||
public bool Force_Unlock_Mouse = true;
|
public bool Force_Unlock_Mouse = true;
|
||||||
public int Default_Page_Limit = 25;
|
public int Default_Page_Limit = 25;
|
||||||
public string Default_Output_Path = ExplorerCore.EXPLORER_FOLDER;
|
public string Default_Output_Path = ExplorerCore.EXPLORER_FOLDER + @"\Output";
|
||||||
public bool Log_Unity_Debug = false;
|
public bool Log_Unity_Debug = false;
|
||||||
public bool Save_Logs_To_Disk = true;
|
public bool Hide_On_Startup = false;
|
||||||
|
//public bool Save_Logs_To_Disk = true;
|
||||||
|
|
||||||
public static event Action OnConfigChanged;
|
public static event Action OnConfigChanged;
|
||||||
|
|
||||||
@ -56,24 +57,27 @@ namespace UnityExplorer.Config
|
|||||||
{
|
{
|
||||||
switch (config.KeyName)
|
switch (config.KeyName)
|
||||||
{
|
{
|
||||||
case "Main_Menu_Toggle":
|
case nameof(Main_Menu_Toggle):
|
||||||
Instance.Main_Menu_Toggle = (KeyCode)Enum.Parse(typeof(KeyCode), config.Value);
|
Instance.Main_Menu_Toggle = (KeyCode)Enum.Parse(typeof(KeyCode), config.Value);
|
||||||
break;
|
break;
|
||||||
case "Force_Unlock_Mouse":
|
case nameof(Force_Unlock_Mouse):
|
||||||
Instance.Force_Unlock_Mouse = bool.Parse(config.Value);
|
Instance.Force_Unlock_Mouse = bool.Parse(config.Value);
|
||||||
break;
|
break;
|
||||||
case "Default_Page_Limit":
|
case nameof(Default_Page_Limit):
|
||||||
Instance.Default_Page_Limit = int.Parse(config.Value);
|
Instance.Default_Page_Limit = int.Parse(config.Value);
|
||||||
break;
|
break;
|
||||||
case "Log_Unity_Debug":
|
case nameof(Log_Unity_Debug):
|
||||||
Instance.Log_Unity_Debug = bool.Parse(config.Value);
|
Instance.Log_Unity_Debug = bool.Parse(config.Value);
|
||||||
break;
|
break;
|
||||||
case "Save_Logs_To_Disk":
|
case nameof(Default_Output_Path):
|
||||||
Instance.Save_Logs_To_Disk = bool.Parse(config.Value);
|
|
||||||
break;
|
|
||||||
case "Default_Output_Path":
|
|
||||||
Instance.Default_Output_Path = config.Value;
|
Instance.Default_Output_Path = config.Value;
|
||||||
break;
|
break;
|
||||||
|
case nameof(Hide_On_Startup):
|
||||||
|
Instance.Hide_On_Startup = bool.Parse(config.Value);
|
||||||
|
break;
|
||||||
|
//case nameof(Save_Logs_To_Disk):
|
||||||
|
// Instance.Save_Logs_To_Disk = bool.Parse(config.Value);
|
||||||
|
// break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,12 +91,13 @@ namespace UnityExplorer.Config
|
|||||||
data.Sections.AddSection("Config");
|
data.Sections.AddSection("Config");
|
||||||
|
|
||||||
var sec = data.Sections["Config"];
|
var sec = data.Sections["Config"];
|
||||||
sec.AddKey("Main_Menu_Toggle", Instance.Main_Menu_Toggle.ToString());
|
sec.AddKey(nameof(Main_Menu_Toggle), Instance.Main_Menu_Toggle.ToString());
|
||||||
sec.AddKey("Force_Unlock_Mouse", Instance.Force_Unlock_Mouse.ToString());
|
sec.AddKey(nameof(Force_Unlock_Mouse), Instance.Force_Unlock_Mouse.ToString());
|
||||||
sec.AddKey("Default_Page_Limit", Instance.Default_Page_Limit.ToString());
|
sec.AddKey(nameof(Default_Page_Limit), Instance.Default_Page_Limit.ToString());
|
||||||
sec.AddKey("Log_Unity_Debug", Instance.Log_Unity_Debug.ToString());
|
sec.AddKey(nameof(Log_Unity_Debug), Instance.Log_Unity_Debug.ToString());
|
||||||
sec.AddKey("Save_Logs_To_Disk", Instance.Save_Logs_To_Disk.ToString());
|
sec.AddKey(nameof(Default_Output_Path), Instance.Default_Output_Path);
|
||||||
sec.AddKey("Default_Output_Path", Instance.Default_Output_Path);
|
sec.AddKey(nameof(Hide_On_Startup), Instance.Hide_On_Startup.ToString());
|
||||||
|
//sec.AddKey("Save_Logs_To_Disk", Instance.Save_Logs_To_Disk.ToString());
|
||||||
|
|
||||||
File.WriteAllText(INI_PATH, data.ToString());
|
File.WriteAllText(INI_PATH, data.ToString());
|
||||||
}
|
}
|
||||||
|
35
src/ExplorerBepIn5Plugin.cs
Normal file
35
src/ExplorerBepIn5Plugin.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#if BIE5
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
|
using BepInEx;
|
||||||
|
using BepInEx.Logging;
|
||||||
|
using HarmonyLib;
|
||||||
|
|
||||||
|
namespace UnityExplorer
|
||||||
|
{
|
||||||
|
[BepInPlugin(ExplorerCore.GUID, "UnityExplorer", ExplorerCore.VERSION)]
|
||||||
|
public class ExplorerBepInPlugin : BaseUnityPlugin
|
||||||
|
{
|
||||||
|
public static ExplorerBepInPlugin Instance;
|
||||||
|
|
||||||
|
public static ManualLogSource Logging => Instance?.Logger;
|
||||||
|
|
||||||
|
public static readonly Harmony HarmonyInstance = new Harmony(ExplorerCore.GUID);
|
||||||
|
|
||||||
|
internal void Awake()
|
||||||
|
{
|
||||||
|
Instance = this;
|
||||||
|
|
||||||
|
new ExplorerCore();
|
||||||
|
|
||||||
|
// HarmonyInstance.PatchAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void Update()
|
||||||
|
{
|
||||||
|
ExplorerCore.Update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
@ -1,4 +1,4 @@
|
|||||||
#if BIE
|
#if BIE6
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
@ -1,25 +1,45 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
using UnityExplorer.Config;
|
using UnityExplorer.Config;
|
||||||
|
using UnityExplorer.Helpers;
|
||||||
using UnityExplorer.Input;
|
using UnityExplorer.Input;
|
||||||
using UnityExplorer.Inspectors;
|
using UnityExplorer.Inspectors;
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UnityExplorer.UI.Modules;
|
using UnityExplorer.UI.Modules;
|
||||||
#if CPP
|
|
||||||
using UnityExplorer.Helpers;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace UnityExplorer
|
namespace UnityExplorer
|
||||||
{
|
{
|
||||||
public class ExplorerCore
|
public class ExplorerCore
|
||||||
{
|
{
|
||||||
public const string NAME = "UnityExplorer";
|
public const string NAME = "UnityExplorer";
|
||||||
public const string VERSION = "3.0.5";
|
public const string VERSION = "3.2.0";
|
||||||
public const string AUTHOR = "Sinai";
|
public const string AUTHOR = "Sinai";
|
||||||
public const string GUID = "com.sinai.unityexplorer";
|
public const string GUID = "com.sinai.unityexplorer";
|
||||||
public const string EXPLORER_FOLDER = @"Mods\UnityExplorer";
|
|
||||||
|
#if ML
|
||||||
|
public static string EXPLORER_FOLDER = Path.Combine("Mods", NAME);
|
||||||
|
#elif BIE
|
||||||
|
public static string EXPLORER_FOLDER = Path.Combine(BepInEx.Paths.ConfigPath, NAME);
|
||||||
|
#elif STANDALONE
|
||||||
|
public static string EXPLORER_FOLDER
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (s_explorerFolder == null)
|
||||||
|
{
|
||||||
|
s_explorerFolder = (new Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath;
|
||||||
|
s_explorerFolder = Uri.UnescapeDataString(s_explorerFolder);
|
||||||
|
s_explorerFolder = Path.GetDirectoryName(s_explorerFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
return s_explorerFolder;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private static string s_explorerFolder;
|
||||||
|
#endif
|
||||||
|
|
||||||
public static ExplorerCore Instance { get; private set; }
|
public static ExplorerCore Instance { get; private set; }
|
||||||
|
|
||||||
@ -90,6 +110,11 @@ namespace UnityExplorer
|
|||||||
{
|
{
|
||||||
UIManager.Init();
|
UIManager.Init();
|
||||||
Log("Initialized UnityExplorer UI.");
|
Log("Initialized UnityExplorer UI.");
|
||||||
|
|
||||||
|
if (ModConfig.Instance.Hide_On_Startup)
|
||||||
|
ShowMenu = false;
|
||||||
|
|
||||||
|
// InspectorManager.Instance.Inspect(Tests.TestClass.Instance);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@ -160,6 +185,12 @@ namespace UnityExplorer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if STANDALONE
|
||||||
|
public static Action<string> OnLogMessage;
|
||||||
|
public static Action<string> OnLogWarning;
|
||||||
|
public static Action<string> OnLogError;
|
||||||
|
#endif
|
||||||
|
|
||||||
public static void Log(object message, bool unity = false)
|
public static void Log(object message, bool unity = false)
|
||||||
{
|
{
|
||||||
DebugConsole.Log(message?.ToString());
|
DebugConsole.Log(message?.ToString());
|
||||||
@ -168,9 +199,11 @@ namespace UnityExplorer
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
#if ML
|
#if ML
|
||||||
MelonLoader.MelonLogger.Log(message?.ToString());
|
MelonLoader.MelonLogger.Msg(message?.ToString());
|
||||||
#else
|
#elif BIE
|
||||||
ExplorerBepInPlugin.Logging?.LogMessage(message?.ToString());
|
ExplorerBepInPlugin.Logging?.LogMessage(message?.ToString());
|
||||||
|
#elif STANDALONE
|
||||||
|
OnLogMessage?.Invoke(message?.ToString());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,9 +215,11 @@ namespace UnityExplorer
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
#if ML
|
#if ML
|
||||||
MelonLoader.MelonLogger.LogWarning(message?.ToString());
|
MelonLoader.MelonLogger.Msg(message?.ToString());
|
||||||
#else
|
#elif BIE
|
||||||
ExplorerBepInPlugin.Logging?.LogWarning(message?.ToString());
|
ExplorerBepInPlugin.Logging?.LogWarning(message?.ToString());
|
||||||
|
#elif STANDALONE
|
||||||
|
OnLogWarning?.Invoke(message?.ToString());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,9 +231,11 @@ namespace UnityExplorer
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
#if ML
|
#if ML
|
||||||
MelonLoader.MelonLogger.LogError(message?.ToString());
|
MelonLoader.MelonLogger.Msg(message?.ToString());
|
||||||
#else
|
#elif BIE
|
||||||
ExplorerBepInPlugin.Logging?.LogError(message?.ToString());
|
ExplorerBepInPlugin.Logging?.LogError(message?.ToString());
|
||||||
|
#elif STANDALONE
|
||||||
|
OnLogError?.Invoke(message?.ToString());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ namespace UnityExplorer
|
|||||||
ExplorerCore.Update();
|
ExplorerCore.Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnLevelWasLoaded(int level)
|
public override void OnSceneWasLoaded(int buildIndex, string sceneName)
|
||||||
{
|
{
|
||||||
ExplorerCore.Instance.OnSceneLoaded();
|
ExplorerCore.Instance.OnSceneLoaded();
|
||||||
}
|
}
|
||||||
|
11
src/ExplorerStandalone.cs
Normal file
11
src/ExplorerStandalone.cs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#if STANDALONE
|
||||||
|
using HarmonyLib;
|
||||||
|
|
||||||
|
namespace UnityExplorer
|
||||||
|
{
|
||||||
|
public class ExplorerStandalone
|
||||||
|
{
|
||||||
|
public static readonly Harmony HarmonyInstance = new Harmony(ExplorerCore.GUID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
@ -52,7 +52,7 @@ namespace UnityExplorer.Helpers
|
|||||||
return list.ToArray();
|
return list.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Type GetActualType(object obj)
|
public static Type GetActualType(this object obj)
|
||||||
{
|
{
|
||||||
if (obj == null)
|
if (obj == null)
|
||||||
return null;
|
return null;
|
||||||
@ -93,20 +93,55 @@ namespace UnityExplorer.Helpers
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if CPP
|
#if CPP
|
||||||
private static readonly Dictionary<CppType, Type> Il2CppToMonoType = new Dictionary<CppType, Type>();
|
private static readonly Dictionary<string, Type> Il2CppToMonoType = new Dictionary<string, Type>();
|
||||||
|
|
||||||
public static Type GetMonoType(CppType cppType)
|
public static Type GetMonoType(CppType cppType)
|
||||||
{
|
{
|
||||||
if (Il2CppToMonoType.ContainsKey(cppType))
|
if (Il2CppToMonoType.ContainsKey(cppType.AssemblyQualifiedName))
|
||||||
return Il2CppToMonoType[cppType];
|
return Il2CppToMonoType[cppType.AssemblyQualifiedName];
|
||||||
|
|
||||||
var getType = Type.GetType(cppType.AssemblyQualifiedName);
|
var getType = Type.GetType(cppType.AssemblyQualifiedName);
|
||||||
Il2CppToMonoType.Add(cppType, getType);
|
|
||||||
return getType;
|
if (getType != null)
|
||||||
|
{
|
||||||
|
Il2CppToMonoType.Add(cppType.AssemblyQualifiedName, getType);
|
||||||
|
return getType;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string baseName = cppType.FullName;
|
||||||
|
string baseAssembly = cppType.Assembly.GetName().name;
|
||||||
|
|
||||||
|
Type unhollowedType = AppDomain.CurrentDomain
|
||||||
|
.GetAssemblies()
|
||||||
|
.FirstOrDefault(a => a.GetName().Name == baseAssembly)?
|
||||||
|
.TryGetTypes()
|
||||||
|
.FirstOrDefault(t =>
|
||||||
|
t.CustomAttributes.Any(ca
|
||||||
|
=> ca.AttributeType.Name == "ObfuscatedNameAttribute"
|
||||||
|
&& (string)ca.ConstructorArguments[0].Value == baseName));
|
||||||
|
|
||||||
|
Il2CppToMonoType.Add(cppType.AssemblyQualifiedName, unhollowedType);
|
||||||
|
|
||||||
|
return unhollowedType;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static readonly Dictionary<Type, IntPtr> CppClassPointers = new Dictionary<Type, IntPtr>();
|
private static readonly Dictionary<Type, IntPtr> CppClassPointers = new Dictionary<Type, IntPtr>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempt to cast the object to its underlying type.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="obj">The object you want to cast.</param>
|
||||||
|
/// <returns>The object, as the underlying type if successful or the input value if not.</returns>
|
||||||
|
public static object Il2CppCast(this object obj) => Il2CppCast(obj, GetActualType(obj));
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempt to cast the object to the provided type.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="obj">The object you want to cast.</param>
|
||||||
|
/// <param name="castTo">The Type you want to cast to.</param>
|
||||||
|
/// <returns>The object, as the type (or a normal C# object) if successful or the input value if not.</returns>
|
||||||
public static object Il2CppCast(this object obj, Type castTo)
|
public static object Il2CppCast(this object obj, Type castTo)
|
||||||
{
|
{
|
||||||
if (!(obj is Il2CppSystem.Object ilObj))
|
if (!(obj is Il2CppSystem.Object ilObj))
|
||||||
@ -126,6 +161,39 @@ namespace UnityExplorer.Helpers
|
|||||||
return Activator.CreateInstance(castTo, ilObj.Pointer);
|
return Activator.CreateInstance(castTo, ilObj.Pointer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static readonly Dictionary<Type, MethodInfo> s_unboxMethods = new Dictionary<Type, MethodInfo>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempt to unbox the object to the underlying struct type.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="obj">The object which is a struct underneath.</param>
|
||||||
|
/// <returns>The struct if successful, otherwise null.</returns>
|
||||||
|
public static object Unbox(this object obj) => Unbox(obj, GetActualType(obj));
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempt to unbox the object to the struct type.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="obj">The object which is a struct underneath.</param>
|
||||||
|
/// <param name="type">The type of the struct you want to unbox to.</param>
|
||||||
|
/// <returns>The struct if successful, otherwise null.</returns>
|
||||||
|
public static object Unbox(this object obj, Type type)
|
||||||
|
{
|
||||||
|
if (!type.IsValueType)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (!(obj is Il2CppSystem.Object))
|
||||||
|
return obj;
|
||||||
|
|
||||||
|
if (!s_unboxMethods.ContainsKey(type))
|
||||||
|
{
|
||||||
|
s_unboxMethods.Add(type, typeof(Il2CppObjectBase)
|
||||||
|
.GetMethod("Unbox")
|
||||||
|
.MakeGenericMethod(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
return s_unboxMethods[type].Invoke(obj, new object[0]);
|
||||||
|
}
|
||||||
|
|
||||||
public static bool Il2CppTypeNotNull(Type type) => Il2CppTypeNotNull(type, out _);
|
public static bool Il2CppTypeNotNull(Type type) => Il2CppTypeNotNull(type, out _);
|
||||||
|
|
||||||
public static bool Il2CppTypeNotNull(Type type, out IntPtr il2cppPtr)
|
public static bool Il2CppTypeNotNull(Type type, out IntPtr il2cppPtr)
|
||||||
@ -215,50 +283,56 @@ namespace UnityExplorer.Helpers
|
|||||||
public static bool LoadModule(string module) => true;
|
public static bool LoadModule(string module) => true;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CPP
|
||||||
|
internal static IntPtr s_cppEnumerableClassPtr;
|
||||||
|
#endif
|
||||||
|
|
||||||
public static bool IsEnumerable(Type t)
|
public static bool IsEnumerable(Type t)
|
||||||
{
|
{
|
||||||
if (typeof(IEnumerable).IsAssignableFrom(t))
|
if (typeof(IEnumerable).IsAssignableFrom(t))
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
|
#if CPP
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (s_cppEnumerableClassPtr == IntPtr.Zero)
|
||||||
|
Il2CppTypeNotNull(typeof(Il2CppSystem.Collections.IEnumerable), out s_cppEnumerableClassPtr);
|
||||||
|
|
||||||
|
if (s_cppEnumerableClassPtr != IntPtr.Zero
|
||||||
|
&& Il2CppTypeNotNull(t, out IntPtr classPtr)
|
||||||
|
&& il2cpp_class_is_assignable_from(s_cppEnumerableClassPtr, classPtr))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
catch { }
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#if CPP
|
#if CPP
|
||||||
if (t.IsGenericType && t.GetGenericTypeDefinition() is Type g)
|
internal static IntPtr s_cppDictionaryClassPtr;
|
||||||
{
|
|
||||||
return typeof(Il2CppSystem.Collections.Generic.List<>).IsAssignableFrom(g)
|
|
||||||
|| typeof(Il2CppSystem.Collections.Generic.IList<>).IsAssignableFrom(g)
|
|
||||||
|| typeof(Il2CppSystem.Collections.Generic.HashSet<>).IsAssignableFrom(g);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return typeof(Il2CppSystem.Collections.IList).IsAssignableFrom(t);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
public static bool IsDictionary(Type t)
|
public static bool IsDictionary(Type t)
|
||||||
{
|
{
|
||||||
if (typeof(IDictionary).IsAssignableFrom(t))
|
if (typeof(IDictionary).IsAssignableFrom(t))
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
#if CPP
|
#if CPP
|
||||||
if (t.IsGenericType && t.GetGenericTypeDefinition() is Type g)
|
try
|
||||||
{
|
{
|
||||||
return typeof(Il2CppSystem.Collections.Generic.Dictionary<,>).IsAssignableFrom(g)
|
if (s_cppDictionaryClassPtr == IntPtr.Zero)
|
||||||
|| typeof(Il2CppSystem.Collections.Generic.IDictionary<,>).IsAssignableFrom(g);
|
if (!Il2CppTypeNotNull(typeof(Il2CppSystem.Collections.IDictionary), out s_cppDictionaryClassPtr))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (Il2CppTypeNotNull(t, out IntPtr classPtr))
|
||||||
|
{
|
||||||
|
if (il2cpp_class_is_assignable_from(s_cppDictionaryClassPtr, classPtr))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
catch { }
|
||||||
{
|
|
||||||
return typeof(Il2CppSystem.Collections.IDictionary).IsAssignableFrom(t)
|
|
||||||
|| typeof(Il2CppSystem.Collections.Hashtable).IsAssignableFrom(t);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
#endif
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string ExceptionToString(Exception e, bool innerMost = false)
|
public static string ExceptionToString(Exception e, bool innerMost = false)
|
||||||
|
@ -15,6 +15,16 @@ namespace UnityExplorer.Helpers
|
|||||||
private static MethodInfo EncodeToPNGMethod => m_encodeToPNGMethod ?? GetEncodeToPNGMethod();
|
private static MethodInfo EncodeToPNGMethod => m_encodeToPNGMethod ?? GetEncodeToPNGMethod();
|
||||||
private static MethodInfo m_encodeToPNGMethod;
|
private static MethodInfo m_encodeToPNGMethod;
|
||||||
|
|
||||||
|
public static byte[] EncodeToPNGSafe(this Texture2D tex)
|
||||||
|
{
|
||||||
|
var method = EncodeToPNGMethod;
|
||||||
|
|
||||||
|
if (method.IsStatic)
|
||||||
|
return (byte[])method.Invoke(null, new object[] { tex });
|
||||||
|
else
|
||||||
|
return (byte[])method.Invoke(tex, new object[0]);
|
||||||
|
}
|
||||||
|
|
||||||
private static MethodInfo GetEncodeToPNGMethod()
|
private static MethodInfo GetEncodeToPNGMethod()
|
||||||
{
|
{
|
||||||
if (ReflectionHelpers.GetTypeByName("UnityEngine.ImageConversion") is Type imageConversion)
|
if (ReflectionHelpers.GetTypeByName("UnityEngine.ImageConversion") is Type imageConversion)
|
||||||
@ -60,7 +70,12 @@ namespace UnityExplorer.Helpers
|
|||||||
|
|
||||||
pixels = orig.GetPixels((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height);
|
pixels = orig.GetPixels((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height);
|
||||||
|
|
||||||
|
// use full constructor for better compatibility
|
||||||
|
#if CPP
|
||||||
|
var _newTex = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGBA32, Texture.GenerateAllMips, false, IntPtr.Zero);
|
||||||
|
#else
|
||||||
var _newTex = new Texture2D((int)rect.width, (int)rect.height);
|
var _newTex = new Texture2D((int)rect.width, (int)rect.height);
|
||||||
|
#endif
|
||||||
_newTex.SetPixels(pixels);
|
_newTex.SetPixels(pixels);
|
||||||
|
|
||||||
return _newTex;
|
return _newTex;
|
||||||
|
@ -80,7 +80,11 @@ namespace UnityExplorer.Inspectors.GameObjects
|
|||||||
text.text = UISyntaxHighlight.ParseFullSyntax(ReflectionHelpers.GetActualType(comp), true);
|
text.text = UISyntaxHighlight.ParseFullSyntax(ReflectionHelpers.GetActualType(comp), true);
|
||||||
|
|
||||||
var toggle = s_compToggles[i];
|
var toggle = s_compToggles[i];
|
||||||
|
#if CPP
|
||||||
|
if (comp.TryCast<Behaviour>() is Behaviour behaviour)
|
||||||
|
#else
|
||||||
if (comp is Behaviour behaviour)
|
if (comp is Behaviour behaviour)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
if (!toggle.gameObject.activeSelf)
|
if (!toggle.gameObject.activeSelf)
|
||||||
toggle.gameObject.SetActive(true);
|
toggle.gameObject.SetActive(true);
|
||||||
@ -107,8 +111,11 @@ namespace UnityExplorer.Inspectors.GameObjects
|
|||||||
internal static void OnCompToggleClicked(int index, bool value)
|
internal static void OnCompToggleClicked(int index, bool value)
|
||||||
{
|
{
|
||||||
var comp = s_compShortlist[index];
|
var comp = s_compShortlist[index];
|
||||||
|
#if CPP
|
||||||
|
comp.TryCast<Behaviour>().enabled = value;
|
||||||
|
#else
|
||||||
(comp as Behaviour).enabled = value;
|
(comp as Behaviour).enabled = value;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void OnCompListObjectClicked(int index)
|
internal static void OnCompListObjectClicked(int index)
|
||||||
@ -130,7 +137,7 @@ namespace UnityExplorer.Inspectors.GameObjects
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#region UI CONSTRUCTION
|
#region UI CONSTRUCTION
|
||||||
|
|
||||||
internal void ConstructCompList(GameObject parent)
|
internal void ConstructCompList(GameObject parent)
|
||||||
{
|
{
|
||||||
@ -168,34 +175,34 @@ namespace UnityExplorer.Inspectors.GameObjects
|
|||||||
{
|
{
|
||||||
int thisIndex = s_compListTexts.Count;
|
int thisIndex = s_compListTexts.Count;
|
||||||
|
|
||||||
GameObject btnGroupObj = UIFactory.CreateHorizontalGroup(s_compListContent, new Color(0.07f, 0.07f, 0.07f));
|
GameObject groupObj = UIFactory.CreateHorizontalGroup(s_compListContent, new Color(0.07f, 0.07f, 0.07f));
|
||||||
HorizontalLayoutGroup btnGroup = btnGroupObj.GetComponent<HorizontalLayoutGroup>();
|
HorizontalLayoutGroup group = groupObj.GetComponent<HorizontalLayoutGroup>();
|
||||||
btnGroup.childForceExpandWidth = true;
|
group.childForceExpandWidth = true;
|
||||||
btnGroup.childControlWidth = true;
|
group.childControlWidth = true;
|
||||||
btnGroup.childForceExpandHeight = false;
|
group.childForceExpandHeight = false;
|
||||||
btnGroup.childControlHeight = true;
|
group.childControlHeight = true;
|
||||||
btnGroup.childAlignment = TextAnchor.MiddleLeft;
|
group.childAlignment = TextAnchor.MiddleLeft;
|
||||||
LayoutElement btnLayout = btnGroupObj.AddComponent<LayoutElement>();
|
LayoutElement groupLayout = groupObj.AddComponent<LayoutElement>();
|
||||||
btnLayout.minWidth = 25;
|
groupLayout.minWidth = 25;
|
||||||
btnLayout.flexibleWidth = 999;
|
groupLayout.flexibleWidth = 999;
|
||||||
btnLayout.minHeight = 25;
|
groupLayout.minHeight = 25;
|
||||||
btnLayout.flexibleHeight = 0;
|
groupLayout.flexibleHeight = 0;
|
||||||
btnGroupObj.AddComponent<Mask>();
|
groupObj.AddComponent<Mask>();
|
||||||
|
|
||||||
// Behaviour enabled toggle
|
// Behaviour enabled toggle
|
||||||
|
|
||||||
var toggleObj = UIFactory.CreateToggle(btnGroupObj, out Toggle toggle, out Text toggleText, new Color(0.3f, 0.3f, 0.3f));
|
var toggleObj = UIFactory.CreateToggle(groupObj, out Toggle toggle, out Text toggleText, new Color(0.3f, 0.3f, 0.3f));
|
||||||
var toggleLayout = toggleObj.AddComponent<LayoutElement>();
|
var toggleLayout = toggleObj.AddComponent<LayoutElement>();
|
||||||
toggleLayout.minHeight = 25;
|
toggleLayout.minHeight = 25;
|
||||||
toggleLayout.minWidth = 25;
|
toggleLayout.minWidth = 25;
|
||||||
toggleText.text = "";
|
toggleText.text = "";
|
||||||
toggle.isOn = false;
|
toggle.isOn = true;
|
||||||
s_compToggles.Add(toggle);
|
s_compToggles.Add(toggle);
|
||||||
toggle.onValueChanged.AddListener((bool val) => { OnCompToggleClicked(thisIndex, val); });
|
toggle.onValueChanged.AddListener((bool val) => { OnCompToggleClicked(thisIndex, val); });
|
||||||
|
|
||||||
// Main component button
|
// Main component button
|
||||||
|
|
||||||
GameObject mainButtonObj = UIFactory.CreateButton(btnGroupObj);
|
GameObject mainButtonObj = UIFactory.CreateButton(groupObj);
|
||||||
LayoutElement mainBtnLayout = mainButtonObj.AddComponent<LayoutElement>();
|
LayoutElement mainBtnLayout = mainButtonObj.AddComponent<LayoutElement>();
|
||||||
mainBtnLayout.minHeight = 25;
|
mainBtnLayout.minHeight = 25;
|
||||||
mainBtnLayout.flexibleHeight = 0;
|
mainBtnLayout.flexibleHeight = 0;
|
||||||
@ -224,6 +231,6 @@ namespace UnityExplorer.Inspectors.GameObjects
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Inspect(object obj)
|
public void Inspect(object obj, CacheObjectBase parentMember = null)
|
||||||
{
|
{
|
||||||
#if CPP
|
#if CPP
|
||||||
obj = obj.Il2CppCast(ReflectionHelpers.GetActualType(obj));
|
obj = obj.Il2CppCast(ReflectionHelpers.GetActualType(obj));
|
||||||
@ -76,6 +76,9 @@ namespace UnityExplorer.Inspectors
|
|||||||
else
|
else
|
||||||
inspector = new InstanceInspector(obj);
|
inspector = new InstanceInspector(obj);
|
||||||
|
|
||||||
|
if (inspector is ReflectionInspector ri)
|
||||||
|
ri.ParentMember = parentMember;
|
||||||
|
|
||||||
m_currentInspectors.Add(inspector);
|
m_currentInspectors.Add(inspector);
|
||||||
SetInspectorTab(inspector);
|
SetInspectorTab(inspector);
|
||||||
}
|
}
|
||||||
|
@ -109,21 +109,12 @@ namespace UnityExplorer.Inspectors
|
|||||||
internal static void RaycastWorld(Vector2 mousePos)
|
internal static void RaycastWorld(Vector2 mousePos)
|
||||||
{
|
{
|
||||||
var ray = UnityHelpers.MainCamera.ScreenPointToRay(mousePos);
|
var ray = UnityHelpers.MainCamera.ScreenPointToRay(mousePos);
|
||||||
var casts = Physics.RaycastAll(ray, 1000f);
|
Physics.Raycast(ray, out RaycastHit hit, 1000f);
|
||||||
|
|
||||||
if (casts.Length > 0)
|
if (hit.transform)
|
||||||
{
|
{
|
||||||
foreach (var cast in casts)
|
var obj = hit.transform.gameObject;
|
||||||
{
|
OnHitGameObject(obj);
|
||||||
if (cast.transform)
|
|
||||||
{
|
|
||||||
var obj = cast.transform.gameObject;
|
|
||||||
|
|
||||||
OnHitGameObject(obj);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -33,6 +33,9 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
{
|
{
|
||||||
var fi = MemInfo as FieldInfo;
|
var fi = MemInfo as FieldInfo;
|
||||||
fi.SetValue(fi.IsStatic ? null : DeclaringInstance, IValue.Value);
|
fi.SetValue(fi.IsStatic ? null : DeclaringInstance, IValue.Value);
|
||||||
|
|
||||||
|
if (this.ParentInspector?.ParentMember != null)
|
||||||
|
this.ParentInspector.ParentMember.SetValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
|
|
||||||
public override Type FallbackType { get; }
|
public override Type FallbackType { get; }
|
||||||
|
|
||||||
|
public ReflectionInspector ParentInspector { get; set; }
|
||||||
public MemberInfo MemInfo { get; set; }
|
public MemberInfo MemInfo { get; set; }
|
||||||
public Type DeclaringType { get; set; }
|
public Type DeclaringType { get; set; }
|
||||||
public object DeclaringInstance { get; set; }
|
public object DeclaringInstance { get; set; }
|
||||||
|
@ -71,6 +71,9 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
while (e.InnerException != null)
|
||||||
|
e = e.InnerException;
|
||||||
|
|
||||||
ExplorerCore.LogWarning($"Exception evaluating: {e.GetType()}, {e.Message}");
|
ExplorerCore.LogWarning($"Exception evaluating: {e.GetType()}, {e.Message}");
|
||||||
ReflectionException = ReflectionHelpers.ExceptionToString(e);
|
ReflectionException = ReflectionHelpers.ExceptionToString(e);
|
||||||
}
|
}
|
||||||
|
@ -63,6 +63,9 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
var target = pi.GetAccessors()[0].IsStatic ? null : DeclaringInstance;
|
var target = pi.GetAccessors()[0].IsStatic ? null : DeclaringInstance;
|
||||||
|
|
||||||
pi.SetValue(target, IValue.Value, ParseArguments());
|
pi.SetValue(target, IValue.Value, ParseArguments());
|
||||||
|
|
||||||
|
if (this.ParentInspector?.ParentMember != null)
|
||||||
|
this.ParentInspector.ParentMember.SetValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,8 @@ using UnityEngine;
|
|||||||
using UnityExplorer.Helpers;
|
using UnityExplorer.Helpers;
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
|
using UnityExplorer.Unstrip;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
namespace UnityExplorer.Inspectors.Reflection
|
namespace UnityExplorer.Inspectors.Reflection
|
||||||
{
|
{
|
||||||
@ -70,8 +72,8 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
|
|
||||||
// WIP
|
// WIP
|
||||||
|
|
||||||
//if (m_targetType == typeof(Texture2D))
|
if (m_targetType == typeof(Texture2D))
|
||||||
// ConstructTextureHelper();
|
ConstructTextureHelper();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void ConstructCompHelper(GameObject rowObj)
|
internal void ConstructCompHelper(GameObject rowObj)
|
||||||
@ -136,94 +138,176 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
//btn.onClick.AddListener(() => { InspectorManager.Instance.Inspect(comp.gameObject); });
|
//btn.onClick.AddListener(() => { InspectorManager.Instance.Inspect(comp.gameObject); });
|
||||||
}
|
}
|
||||||
|
|
||||||
//internal bool showingTextureHelper;
|
internal bool showingTextureHelper;
|
||||||
//internal bool constructedTextureViewer;
|
internal bool constructedTextureViewer;
|
||||||
|
|
||||||
//internal void ConstructTextureHelper()
|
internal GameObject m_textureViewerObj;
|
||||||
//{
|
|
||||||
// var rowObj = UIFactory.CreateHorizontalGroup(Content, new Color(0.1f, 0.1f, 0.1f));
|
|
||||||
// var rowLayout = rowObj.AddComponent<LayoutElement>();
|
|
||||||
// rowLayout.minHeight = 25;
|
|
||||||
// rowLayout.flexibleHeight = 0;
|
|
||||||
// var rowGroup = rowObj.GetComponent<HorizontalLayoutGroup>();
|
|
||||||
// rowGroup.childForceExpandHeight = true;
|
|
||||||
// rowGroup.childForceExpandWidth = false;
|
|
||||||
// rowGroup.padding.top = 3;
|
|
||||||
// rowGroup.padding.left = 3;
|
|
||||||
// rowGroup.padding.bottom = 3;
|
|
||||||
// rowGroup.padding.right = 3;
|
|
||||||
// rowGroup.spacing = 5;
|
|
||||||
|
|
||||||
// var showBtnObj = UIFactory.CreateButton(rowObj, new Color(0.2f, 0.2f, 0.2f));
|
internal void ConstructTextureHelper()
|
||||||
// var showBtnLayout = showBtnObj.AddComponent<LayoutElement>();
|
{
|
||||||
// showBtnLayout.minWidth = 50;
|
var rowObj = UIFactory.CreateHorizontalGroup(Content, new Color(0.1f, 0.1f, 0.1f));
|
||||||
// showBtnLayout.flexibleWidth = 0;
|
var rowLayout = rowObj.AddComponent<LayoutElement>();
|
||||||
// var showText = showBtnObj.GetComponentInChildren<Text>();
|
rowLayout.minHeight = 25;
|
||||||
// showText.text = "Show";
|
rowLayout.flexibleHeight = 0;
|
||||||
// var showBtn = showBtnObj.GetComponent<Button>();
|
var rowGroup = rowObj.GetComponent<HorizontalLayoutGroup>();
|
||||||
|
rowGroup.childForceExpandHeight = true;
|
||||||
|
rowGroup.childForceExpandWidth = false;
|
||||||
|
rowGroup.padding.top = 3;
|
||||||
|
rowGroup.padding.left = 3;
|
||||||
|
rowGroup.padding.bottom = 3;
|
||||||
|
rowGroup.padding.right = 3;
|
||||||
|
rowGroup.spacing = 5;
|
||||||
|
|
||||||
// var labelObj = UIFactory.CreateLabel(rowObj, TextAnchor.MiddleLeft);
|
var showBtnObj = UIFactory.CreateButton(rowObj, new Color(0.2f, 0.6f, 0.2f));
|
||||||
// var labelText = labelObj.GetComponent<Text>();
|
var showBtnLayout = showBtnObj.AddComponent<LayoutElement>();
|
||||||
// labelText.text = "Texture Viewer";
|
showBtnLayout.minWidth = 50;
|
||||||
|
showBtnLayout.flexibleWidth = 0;
|
||||||
|
var showText = showBtnObj.GetComponentInChildren<Text>();
|
||||||
|
showText.text = "Show";
|
||||||
|
var showBtn = showBtnObj.GetComponent<Button>();
|
||||||
|
|
||||||
// var textureViewerObj = UIFactory.CreateScrollView(Content, out GameObject scrollContent, out _, new Color(0.1f, 0.1f, 0.1f));
|
var labelObj = UIFactory.CreateLabel(rowObj, TextAnchor.MiddleLeft);
|
||||||
// var viewerGroup = scrollContent.GetComponent<VerticalLayoutGroup>();
|
var labelText = labelObj.GetComponent<Text>();
|
||||||
// viewerGroup.childForceExpandHeight = false;
|
labelText.text = "Texture Viewer";
|
||||||
// viewerGroup.childForceExpandWidth = false;
|
|
||||||
// viewerGroup.childControlHeight = true;
|
|
||||||
// viewerGroup.childControlWidth = true;
|
|
||||||
// var mainLayout = textureViewerObj.GetComponent<LayoutElement>();
|
|
||||||
// mainLayout.flexibleHeight = -1;
|
|
||||||
// mainLayout.flexibleWidth = 2000;
|
|
||||||
// mainLayout.minHeight = 25;
|
|
||||||
|
|
||||||
// textureViewerObj.SetActive(false);
|
var textureViewerObj = UIFactory.CreateScrollView(Content, out GameObject scrollContent, out _, new Color(0.1f, 0.1f, 0.1f));
|
||||||
|
var viewerGroup = scrollContent.GetComponent<VerticalLayoutGroup>();
|
||||||
|
viewerGroup.childForceExpandHeight = false;
|
||||||
|
viewerGroup.childForceExpandWidth = false;
|
||||||
|
viewerGroup.childControlHeight = true;
|
||||||
|
viewerGroup.childControlWidth = true;
|
||||||
|
var mainLayout = textureViewerObj.GetComponent<LayoutElement>();
|
||||||
|
mainLayout.flexibleHeight = 9999;
|
||||||
|
mainLayout.flexibleWidth = 9999;
|
||||||
|
mainLayout.minHeight = 100;
|
||||||
|
|
||||||
// showBtn.onClick.AddListener(() =>
|
textureViewerObj.SetActive(false);
|
||||||
// {
|
|
||||||
// showingTextureHelper = !showingTextureHelper;
|
|
||||||
|
|
||||||
// if (showingTextureHelper)
|
m_textureViewerObj = textureViewerObj;
|
||||||
// {
|
|
||||||
// if (!constructedTextureViewer)
|
|
||||||
// ConstructTextureViewerArea(scrollContent);
|
|
||||||
|
|
||||||
// showText.text = "Hide";
|
showBtn.onClick.AddListener(() =>
|
||||||
// textureViewerObj.SetActive(true);
|
{
|
||||||
// }
|
showingTextureHelper = !showingTextureHelper;
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// showText.text = "Show";
|
|
||||||
// textureViewerObj.SetActive(false);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
//}
|
|
||||||
|
|
||||||
//internal void ConstructTextureViewerArea(GameObject parent)
|
if (showingTextureHelper)
|
||||||
//{
|
{
|
||||||
// constructedTextureViewer = true;
|
if (!constructedTextureViewer)
|
||||||
|
ConstructTextureViewerArea(scrollContent);
|
||||||
|
|
||||||
// var tex = Target as Texture2D;
|
showText.text = "Hide";
|
||||||
|
ToggleTextureViewer(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
showText.text = "Show";
|
||||||
|
ToggleTextureViewer(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// if (!tex)
|
internal void ConstructTextureViewerArea(GameObject parent)
|
||||||
// {
|
{
|
||||||
// ExplorerCore.LogWarning("Could not cast the target instance to Texture2D!");
|
constructedTextureViewer = true;
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// var imageObj = UIFactory.CreateUIObject("TextureViewerImage", parent, new Vector2(1, 1));
|
var tex = Target as Texture2D;
|
||||||
// var image = imageObj.AddComponent<Image>();
|
#if CPP
|
||||||
// var sprite = UIManager.CreateSprite(tex);
|
if (!tex)
|
||||||
// image.sprite = sprite;
|
tex = (Target as Il2CppSystem.Object).TryCast<Texture2D>();
|
||||||
|
#endif
|
||||||
|
|
||||||
// var fitter = imageObj.AddComponent<ContentSizeFitter>();
|
if (!tex)
|
||||||
// fitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
{
|
||||||
// //fitter.horizontalFit = ContentSizeFitter.FitMode.PreferredSize;
|
ExplorerCore.LogWarning("Could not cast the target instance to Texture2D! Maybe its null or destroyed?");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// var imageLayout = imageObj.AddComponent<LayoutElement>();
|
// Save helper
|
||||||
// imageLayout.preferredHeight = sprite.rect.height;
|
|
||||||
// imageLayout.preferredWidth = sprite.rect.width;
|
var saveRowObj = UIFactory.CreateHorizontalGroup(parent, new Color(0.1f, 0.1f, 0.1f));
|
||||||
//}
|
var saveRow = saveRowObj.GetComponent<HorizontalLayoutGroup>();
|
||||||
|
saveRow.childForceExpandHeight = true;
|
||||||
|
saveRow.childForceExpandWidth = true;
|
||||||
|
saveRow.padding = new RectOffset() { left = 2, bottom = 2, right = 2, top = 2 };
|
||||||
|
saveRow.spacing = 2;
|
||||||
|
|
||||||
|
var btnObj = UIFactory.CreateButton(saveRowObj, new Color(0.2f, 0.2f, 0.2f));
|
||||||
|
var btnLayout = btnObj.AddComponent<LayoutElement>();
|
||||||
|
btnLayout.minHeight = 25;
|
||||||
|
btnLayout.minWidth = 100;
|
||||||
|
btnLayout.flexibleWidth = 0;
|
||||||
|
var saveBtn = btnObj.GetComponent<Button>();
|
||||||
|
|
||||||
|
var saveBtnText = btnObj.GetComponentInChildren<Text>();
|
||||||
|
saveBtnText.text = "Save .PNG";
|
||||||
|
|
||||||
|
var inputObj = UIFactory.CreateInputField(saveRowObj);
|
||||||
|
var inputLayout = inputObj.AddComponent<LayoutElement>();
|
||||||
|
inputLayout.minHeight = 25;
|
||||||
|
inputLayout.minWidth = 100;
|
||||||
|
inputLayout.flexibleWidth = 9999;
|
||||||
|
var inputField = inputObj.GetComponent<InputField>();
|
||||||
|
|
||||||
|
var name = tex.name;
|
||||||
|
if (string.IsNullOrEmpty(name))
|
||||||
|
name = "untitled";
|
||||||
|
|
||||||
|
var savePath = $@"{Config.ModConfig.Instance.Default_Output_Path}\{name}.png";
|
||||||
|
inputField.text = savePath;
|
||||||
|
|
||||||
|
saveBtn.onClick.AddListener(() =>
|
||||||
|
{
|
||||||
|
if (tex && !string.IsNullOrEmpty(inputField.text))
|
||||||
|
{
|
||||||
|
var path = inputField.text;
|
||||||
|
if (!path.EndsWith(".png", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
ExplorerCore.LogWarning("Desired save path must end with '.png'!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var dir = Path.GetDirectoryName(path);
|
||||||
|
if (!Directory.Exists(dir))
|
||||||
|
Directory.CreateDirectory(dir);
|
||||||
|
|
||||||
|
if (File.Exists(path))
|
||||||
|
File.Delete(path);
|
||||||
|
|
||||||
|
if (!tex.IsReadable())
|
||||||
|
tex = Texture2DHelpers.ForceReadTexture(tex);
|
||||||
|
#if CPP
|
||||||
|
byte[] data = tex.EncodeToPNG();
|
||||||
|
#else
|
||||||
|
byte[] data = tex.EncodeToPNGSafe();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
File.WriteAllBytes(path, data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Actual texture viewer
|
||||||
|
|
||||||
|
var imageObj = UIFactory.CreateUIObject("TextureViewerImage", parent);
|
||||||
|
var image = imageObj.AddComponent<Image>();
|
||||||
|
var sprite = ImageConversionUnstrip.CreateSprite(tex);
|
||||||
|
image.sprite = sprite;
|
||||||
|
|
||||||
|
var fitter = imageObj.AddComponent<ContentSizeFitter>();
|
||||||
|
fitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
//fitter.horizontalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
|
||||||
|
var imageLayout = imageObj.AddComponent<LayoutElement>();
|
||||||
|
imageLayout.preferredHeight = sprite.rect.height;
|
||||||
|
imageLayout.preferredWidth = sprite.rect.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void ToggleTextureViewer(bool enabled)
|
||||||
|
{
|
||||||
|
m_textureViewerObj.SetActive(enabled);
|
||||||
|
|
||||||
|
m_filterAreaObj.SetActive(!enabled);
|
||||||
|
m_memberListObj.SetActive(!enabled);
|
||||||
|
m_updateRowObj.SetActive(!enabled);
|
||||||
|
}
|
||||||
|
|
||||||
public void ConstructInstanceFilters(GameObject parent)
|
public void ConstructInstanceFilters(GameObject parent)
|
||||||
{
|
{
|
||||||
|
@ -10,6 +10,9 @@ using UnityExplorer.Helpers;
|
|||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UnityExplorer.UI.Shared;
|
using UnityExplorer.UI.Shared;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
#if CPP
|
||||||
|
using CppDictionary = Il2CppSystem.Collections.IDictionary;
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace UnityExplorer.Inspectors.Reflection
|
namespace UnityExplorer.Inspectors.Reflection
|
||||||
{
|
{
|
||||||
@ -44,7 +47,11 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal IDictionary RefIDictionary;
|
internal IDictionary RefIDictionary;
|
||||||
|
#if CPP
|
||||||
|
internal CppDictionary RefCppDictionary;
|
||||||
|
#else
|
||||||
|
internal IDictionary RefCppDictionary = null;
|
||||||
|
#endif
|
||||||
internal Type m_typeOfKeys;
|
internal Type m_typeOfKeys;
|
||||||
internal Type m_typeofValues;
|
internal Type m_typeofValues;
|
||||||
|
|
||||||
@ -65,6 +72,11 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
{
|
{
|
||||||
RefIDictionary = Value as IDictionary;
|
RefIDictionary = Value as IDictionary;
|
||||||
|
|
||||||
|
#if CPP
|
||||||
|
try { RefCppDictionary = (Value as Il2CppSystem.Object).TryCast<CppDictionary>(); }
|
||||||
|
catch { }
|
||||||
|
#endif
|
||||||
|
|
||||||
if (m_subContentParent.activeSelf)
|
if (m_subContentParent.activeSelf)
|
||||||
{
|
{
|
||||||
GetCacheEntries();
|
GetCacheEntries();
|
||||||
@ -129,13 +141,6 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
{
|
{
|
||||||
var value = RefIDictionary[key];
|
var value = RefIDictionary[key];
|
||||||
|
|
||||||
//if (index >= m_rowHolders.Count)
|
|
||||||
//{
|
|
||||||
// AddRowHolder();
|
|
||||||
//}
|
|
||||||
|
|
||||||
//var holder = m_rowHolders[index];
|
|
||||||
|
|
||||||
var cacheKey = new CachePaired(index, this, this.RefIDictionary, PairTypes.Key, m_listContent);
|
var cacheKey = new CachePaired(index, this, this.RefIDictionary, PairTypes.Key, m_listContent);
|
||||||
cacheKey.CreateIValue(key, this.m_typeOfKeys);
|
cacheKey.CreateIValue(key, this.m_typeOfKeys);
|
||||||
cacheKey.Disable();
|
cacheKey.Disable();
|
||||||
@ -206,9 +211,10 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
RefreshDisplay();
|
RefreshDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
#region CPP fixes
|
#region CPP fixes
|
||||||
#if CPP
|
#if CPP
|
||||||
// temp fix for Il2Cpp IDictionary until interfaces are fixed
|
// temp fix for Il2Cpp IDictionary until interfaces are fixed
|
||||||
|
|
||||||
private IDictionary EnumerateWithReflection()
|
private IDictionary EnumerateWithReflection()
|
||||||
{
|
{
|
||||||
var valueType = Value?.GetType() ?? FallbackType;
|
var valueType = Value?.GetType() ?? FallbackType;
|
||||||
@ -222,8 +228,8 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
var valueList = new List<object>();
|
var valueList = new List<object>();
|
||||||
|
|
||||||
// store entries with reflection
|
// store entries with reflection
|
||||||
EnumerateWithReflection(keys, keyList);
|
EnumerateCollection(keys, keyList);
|
||||||
EnumerateWithReflection(values, valueList);
|
EnumerateCollection(values, valueList);
|
||||||
|
|
||||||
// make actual mono dictionary
|
// make actual mono dictionary
|
||||||
var dict = (IDictionary)Activator.CreateInstance(typeof(Dictionary<,>)
|
var dict = (IDictionary)Activator.CreateInstance(typeof(Dictionary<,>)
|
||||||
@ -236,7 +242,7 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
return dict;
|
return dict;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EnumerateWithReflection(object collection, List<object> list)
|
private void EnumerateCollection(object collection, List<object> list)
|
||||||
{
|
{
|
||||||
// invoke GetEnumerator
|
// invoke GetEnumerator
|
||||||
var enumerator = collection.GetType().GetMethod("GetEnumerator").Invoke(collection, null);
|
var enumerator = collection.GetType().GetMethod("GetEnumerator").Invoke(collection, null);
|
||||||
@ -253,9 +259,9 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region UI CONSTRUCTION
|
#region UI CONSTRUCTION
|
||||||
|
|
||||||
internal GameObject m_listContent;
|
internal GameObject m_listContent;
|
||||||
internal LayoutElement m_listLayout;
|
internal LayoutElement m_listLayout;
|
||||||
@ -309,6 +315,6 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
// m_rowHolders.Add(obj);
|
// m_rowHolders.Add(obj);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,13 +47,34 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
|
|
||||||
var list = new List<KeyValuePair<int, string>>();
|
var list = new List<KeyValuePair<int, string>>();
|
||||||
var set = new HashSet<string>();
|
var set = new HashSet<string>();
|
||||||
|
|
||||||
foreach (var value in values)
|
foreach (var value in values)
|
||||||
{
|
{
|
||||||
var name = value.ToString();
|
var name = value.ToString();
|
||||||
|
|
||||||
if (set.Contains(name))
|
if (set.Contains(name))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
set.Add(name);
|
set.Add(name);
|
||||||
list.Add(new KeyValuePair<int, string>((int)value, name));
|
|
||||||
|
var backingType = Enum.GetUnderlyingType(type);
|
||||||
|
int intValue;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// this approach is necessary, a simple '(int)value' is not sufficient.
|
||||||
|
|
||||||
|
var unbox = Convert.ChangeType(value, backingType);
|
||||||
|
|
||||||
|
intValue = (int)Convert.ChangeType(unbox, typeof(int));
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ExplorerCore.LogWarning("[InteractiveEnum] Could not Unbox underlying type " + backingType.Name + " from " + type.FullName);
|
||||||
|
ExplorerCore.Log(ex.ToString());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
list.Add(new KeyValuePair<int, string>(intValue, name));
|
||||||
}
|
}
|
||||||
|
|
||||||
s_enumNamesCache.Add(type, list.ToArray());
|
s_enumNamesCache.Add(type, list.ToArray());
|
||||||
|
@ -37,6 +37,11 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
|
|
||||||
internal IEnumerable RefIEnumerable;
|
internal IEnumerable RefIEnumerable;
|
||||||
internal IList RefIList;
|
internal IList RefIList;
|
||||||
|
#if CPP
|
||||||
|
internal Il2CppSystem.Collections.ICollection CppICollection;
|
||||||
|
#else
|
||||||
|
internal ICollection CppICollection = null;
|
||||||
|
#endif
|
||||||
|
|
||||||
internal readonly Type m_baseEntryType;
|
internal readonly Type m_baseEntryType;
|
||||||
|
|
||||||
@ -49,6 +54,14 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
RefIEnumerable = Value as IEnumerable;
|
RefIEnumerable = Value as IEnumerable;
|
||||||
RefIList = Value as IList;
|
RefIList = Value as IList;
|
||||||
|
|
||||||
|
#if CPP
|
||||||
|
if (Value != null && RefIList == null)
|
||||||
|
{
|
||||||
|
try { CppICollection = (Value as Il2CppSystem.Object).TryCast<Il2CppSystem.Collections.ICollection>(); }
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (m_subContentParent.activeSelf)
|
if (m_subContentParent.activeSelf)
|
||||||
{
|
{
|
||||||
GetCacheEntries();
|
GetCacheEntries();
|
||||||
@ -77,8 +90,8 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
if (Value != null)
|
if (Value != null)
|
||||||
{
|
{
|
||||||
string count = "?";
|
string count = "?";
|
||||||
if (m_recacheWanted && RefIList != null)
|
if (m_recacheWanted && (RefIList != null || CppICollection != null))
|
||||||
count = RefIList.Count.ToString();
|
count = RefIList?.Count.ToString() ?? CppICollection.Count.ToString();
|
||||||
else if (!m_recacheWanted)
|
else if (!m_recacheWanted)
|
||||||
count = m_entries.Count.ToString();
|
count = m_entries.Count.ToString();
|
||||||
|
|
||||||
@ -169,89 +182,62 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
RefreshDisplay();
|
RefreshDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
#region CPP Helpers
|
#region CPP Helpers
|
||||||
|
|
||||||
#if CPP
|
#if CPP
|
||||||
// some temp fixes for Il2Cpp IEnumerables until interfaces are fixed
|
// some temp fixes for Il2Cpp IEnumerables until interfaces are fixed
|
||||||
|
|
||||||
|
internal static readonly Dictionary<Type, MethodInfo> s_getEnumeratorMethods = new Dictionary<Type, MethodInfo>();
|
||||||
|
|
||||||
|
internal static readonly Dictionary<Type, EnumeratorInfo> s_enumeratorInfos = new Dictionary<Type, EnumeratorInfo>();
|
||||||
|
|
||||||
|
internal class EnumeratorInfo
|
||||||
|
{
|
||||||
|
internal MethodInfo moveNext;
|
||||||
|
internal PropertyInfo current;
|
||||||
|
}
|
||||||
|
|
||||||
private IEnumerable EnumerateWithReflection()
|
private IEnumerable EnumerateWithReflection()
|
||||||
{
|
{
|
||||||
if (Value.IsNullOrDestroyed())
|
if (Value == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var genericDef = Value.GetType().GetGenericTypeDefinition();
|
// new test
|
||||||
|
var CppEnumerable = (Value as Il2CppSystem.Object)?.TryCast<Il2CppSystem.Collections.IEnumerable>();
|
||||||
if (genericDef == typeof(Il2CppSystem.Collections.Generic.List<>))
|
if (CppEnumerable != null)
|
||||||
return CppListToMono(genericDef);
|
|
||||||
else if (genericDef == typeof(Il2CppSystem.Collections.Generic.HashSet<>))
|
|
||||||
return CppHashSetToMono();
|
|
||||||
else
|
|
||||||
return CppIListToMono();
|
|
||||||
}
|
|
||||||
|
|
||||||
// List<T>.ToArray()
|
|
||||||
private IEnumerable CppListToMono(Type genericTypeDef)
|
|
||||||
{
|
|
||||||
if (genericTypeDef == null) return null;
|
|
||||||
|
|
||||||
return genericTypeDef
|
|
||||||
.MakeGenericType(new Type[] { this.m_baseEntryType })
|
|
||||||
.GetMethod("ToArray")
|
|
||||||
.Invoke(Value, new object[0]) as IEnumerable;
|
|
||||||
}
|
|
||||||
|
|
||||||
// HashSet.GetEnumerator
|
|
||||||
private IEnumerable CppHashSetToMono()
|
|
||||||
{
|
|
||||||
var set = new HashSet<object>();
|
|
||||||
|
|
||||||
// invoke GetEnumerator
|
|
||||||
var enumerator = Value.GetType().GetMethod("GetEnumerator").Invoke(Value, null);
|
|
||||||
// get the type of it
|
|
||||||
var enumeratorType = enumerator.GetType();
|
|
||||||
// reflect MoveNext and Current
|
|
||||||
var moveNext = enumeratorType.GetMethod("MoveNext");
|
|
||||||
var current = enumeratorType.GetProperty("Current");
|
|
||||||
// iterate
|
|
||||||
while ((bool)moveNext.Invoke(enumerator, null))
|
|
||||||
set.Add(current.GetValue(enumerator));
|
|
||||||
|
|
||||||
return set;
|
|
||||||
}
|
|
||||||
|
|
||||||
// IList.Item
|
|
||||||
private IList CppIListToMono()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
var genericType = typeof(List<>).MakeGenericType(new Type[] { this.m_baseEntryType });
|
var type = Value.GetType();
|
||||||
var list = (IList)Activator.CreateInstance(genericType);
|
if (!s_getEnumeratorMethods.ContainsKey(type))
|
||||||
|
s_getEnumeratorMethods.Add(type, type.GetMethod("GetEnumerator"));
|
||||||
|
|
||||||
|
var enumerator = s_getEnumeratorMethods[type].Invoke(Value, null);
|
||||||
|
var enumeratorType = enumerator.GetType();
|
||||||
|
|
||||||
for (int i = 0; ; i++)
|
if (!s_enumeratorInfos.ContainsKey(enumeratorType))
|
||||||
{
|
{
|
||||||
try
|
s_enumeratorInfos.Add(enumeratorType, new EnumeratorInfo
|
||||||
{
|
{
|
||||||
var itm = Value?.GetType()
|
current = enumeratorType.GetProperty("Current"),
|
||||||
.GetProperty("Item")
|
moveNext = enumeratorType.GetMethod("MoveNext"),
|
||||||
.GetValue(Value, new object[] { i });
|
});
|
||||||
list.Add(itm);
|
|
||||||
}
|
|
||||||
catch { break; }
|
|
||||||
}
|
}
|
||||||
|
var info = s_enumeratorInfos[enumeratorType];
|
||||||
|
|
||||||
|
// iterate
|
||||||
|
var list = new List<object>();
|
||||||
|
while ((bool)info.moveNext.Invoke(enumerator, null))
|
||||||
|
list.Add(info.current.GetValue(enumerator));
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
|
||||||
{
|
return null;
|
||||||
ExplorerCore.Log("Exception converting Il2Cpp IList to Mono IList: " + e.GetType() + ", " + e.Message);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region UI CONSTRUCTION
|
#region UI CONSTRUCTION
|
||||||
|
|
||||||
internal GameObject m_listContent;
|
internal GameObject m_listContent;
|
||||||
internal LayoutElement m_listLayout;
|
internal LayoutElement m_listLayout;
|
||||||
@ -296,6 +282,6 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
contentFitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
contentFitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -176,6 +176,10 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
ConstructSubcontent();
|
ConstructSubcontent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal MethodInfo m_toStringMethod;
|
||||||
|
internal MethodInfo m_toStringFormatMethod;
|
||||||
|
internal bool m_gotToStringMethods;
|
||||||
|
|
||||||
public string GetDefaultLabel(bool updateType = true)
|
public string GetDefaultLabel(bool updateType = true)
|
||||||
{
|
{
|
||||||
var valueType = Value?.GetType() ?? this.FallbackType;
|
var valueType = Value?.GetType() ?? this.FallbackType;
|
||||||
@ -205,8 +209,29 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var toString = (string)valueType.GetMethod("ToString", new Type[0])?.Invoke(Value, null)
|
if (!m_gotToStringMethods)
|
||||||
?? Value.ToString();
|
{
|
||||||
|
m_gotToStringMethods = true;
|
||||||
|
|
||||||
|
m_toStringMethod = valueType.GetMethod("ToString", new Type[0]);
|
||||||
|
m_toStringFormatMethod = valueType.GetMethod("ToString", new Type[] { typeof(string) });
|
||||||
|
|
||||||
|
// test format method actually works
|
||||||
|
try
|
||||||
|
{
|
||||||
|
m_toStringFormatMethod.Invoke(Value, new object[] { "F3" });
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
m_toStringFormatMethod = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string toString;
|
||||||
|
if (m_toStringFormatMethod != null)
|
||||||
|
toString = (string)m_toStringFormatMethod.Invoke(Value, new object[] { "F3" });
|
||||||
|
else
|
||||||
|
toString = (string)m_toStringMethod.Invoke(Value, new object[0]);
|
||||||
|
|
||||||
var fullnametemp = valueType.ToString();
|
var fullnametemp = valueType.ToString();
|
||||||
if (fullnametemp.StartsWith("Il2CppSystem"))
|
if (fullnametemp.StartsWith("Il2CppSystem"))
|
||||||
@ -303,7 +328,7 @@ namespace UnityExplorer.Inspectors.Reflection
|
|||||||
void OnInspectClicked()
|
void OnInspectClicked()
|
||||||
{
|
{
|
||||||
if (!Value.IsNullOrDestroyed(false))
|
if (!Value.IsNullOrDestroyed(false))
|
||||||
InspectorManager.Instance.Inspect(this.Value);
|
InspectorManager.Instance.Inspect(this.Value, this.Owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_inspectButton.SetActive(false);
|
m_inspectButton.SetActive(false);
|
||||||
|
@ -43,6 +43,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
"Collider2D.Cast",
|
"Collider2D.Cast",
|
||||||
"Collider2D.Raycast",
|
"Collider2D.Raycast",
|
||||||
"Texture2D.SetPixelDataImpl",
|
"Texture2D.SetPixelDataImpl",
|
||||||
|
"Camera.CalculateProjectionMatrixFromPhysicalProperties",
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
private static readonly HashSet<string> bl_memberNameStartsWith = new HashSet<string>
|
private static readonly HashSet<string> bl_memberNameStartsWith = new HashSet<string>
|
||||||
@ -58,6 +59,8 @@ namespace UnityExplorer.Inspectors
|
|||||||
|
|
||||||
public override string TabLabel => m_targetTypeShortName;
|
public override string TabLabel => m_targetTypeShortName;
|
||||||
|
|
||||||
|
internal CacheObjectBase ParentMember { get; set; }
|
||||||
|
|
||||||
internal readonly Type m_targetType;
|
internal readonly Type m_targetType;
|
||||||
internal readonly string m_targetTypeShortName;
|
internal readonly string m_targetTypeShortName;
|
||||||
|
|
||||||
@ -170,11 +173,11 @@ namespace UnityExplorer.Inspectors
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
var sig = GetSig(member);
|
||||||
|
|
||||||
//ExplorerCore.Log($"Trying to cache member {sig}...");
|
//ExplorerCore.Log($"Trying to cache member {sig}...");
|
||||||
//ExplorerCore.Log(member.DeclaringType.FullName + "." + member.Name);
|
//ExplorerCore.Log(member.DeclaringType.FullName + "." + member.Name);
|
||||||
|
|
||||||
var sig = GetSig(member);
|
|
||||||
|
|
||||||
var mi = member as MethodInfo;
|
var mi = member as MethodInfo;
|
||||||
var pi = member as PropertyInfo;
|
var pi = member as PropertyInfo;
|
||||||
var fi = member as FieldInfo;
|
var fi = member as FieldInfo;
|
||||||
@ -202,6 +205,8 @@ namespace UnityExplorer.Inspectors
|
|||||||
list.Add(new CacheProperty(pi, target, m_scrollContent));
|
list.Add(new CacheProperty(pi, target, m_scrollContent));
|
||||||
else
|
else
|
||||||
list.Add(new CacheField(fi, target, m_scrollContent));
|
list.Add(new CacheField(fi, target, m_scrollContent));
|
||||||
|
|
||||||
|
list.Last().ParentInspector = this;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@ -363,6 +368,10 @@ namespace UnityExplorer.Inspectors
|
|||||||
|
|
||||||
#region UI CONSTRUCTION
|
#region UI CONSTRUCTION
|
||||||
|
|
||||||
|
internal GameObject m_filterAreaObj;
|
||||||
|
internal GameObject m_updateRowObj;
|
||||||
|
internal GameObject m_memberListObj;
|
||||||
|
|
||||||
internal void ConstructUI()
|
internal void ConstructUI()
|
||||||
{
|
{
|
||||||
var parent = InspectorManager.Instance.m_inspectorContent;
|
var parent = InspectorManager.Instance.m_inspectorContent;
|
||||||
@ -423,7 +432,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
|
|
||||||
ConstructFilterArea();
|
ConstructFilterArea();
|
||||||
|
|
||||||
ConstructOptionsArea();
|
ConstructUpdateRow();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void ConstructFilterArea()
|
internal void ConstructFilterArea()
|
||||||
@ -444,6 +453,8 @@ namespace UnityExplorer.Inspectors
|
|||||||
filterGroup.padding.top = 4;
|
filterGroup.padding.top = 4;
|
||||||
filterGroup.padding.bottom = 4;
|
filterGroup.padding.bottom = 4;
|
||||||
|
|
||||||
|
m_filterAreaObj = filterAreaObj;
|
||||||
|
|
||||||
// name filter
|
// name filter
|
||||||
|
|
||||||
var nameFilterRowObj = UIFactory.CreateHorizontalGroup(filterAreaObj, new Color(1, 1, 1, 0));
|
var nameFilterRowObj = UIFactory.CreateHorizontalGroup(filterAreaObj, new Color(1, 1, 1, 0));
|
||||||
@ -540,7 +551,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
btn.colors = colors;
|
btn.colors = colors;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void ConstructOptionsArea()
|
internal void ConstructUpdateRow()
|
||||||
{
|
{
|
||||||
var optionsRowObj = UIFactory.CreateHorizontalGroup(Content, new Color(1, 1, 1, 0));
|
var optionsRowObj = UIFactory.CreateHorizontalGroup(Content, new Color(1, 1, 1, 0));
|
||||||
var optionsLayout = optionsRowObj.AddComponent<LayoutElement>();
|
var optionsLayout = optionsRowObj.AddComponent<LayoutElement>();
|
||||||
@ -551,6 +562,8 @@ namespace UnityExplorer.Inspectors
|
|||||||
optionsGroup.childAlignment = TextAnchor.MiddleLeft;
|
optionsGroup.childAlignment = TextAnchor.MiddleLeft;
|
||||||
optionsGroup.spacing = 10;
|
optionsGroup.spacing = 10;
|
||||||
|
|
||||||
|
m_updateRowObj = optionsRowObj;
|
||||||
|
|
||||||
// update button
|
// update button
|
||||||
|
|
||||||
var updateButtonObj = UIFactory.CreateButton(optionsRowObj, new Color(0.2f, 0.2f, 0.2f));
|
var updateButtonObj = UIFactory.CreateButton(optionsRowObj, new Color(0.2f, 0.2f, 0.2f));
|
||||||
@ -578,11 +591,12 @@ namespace UnityExplorer.Inspectors
|
|||||||
autoUpdateToggle.isOn = false;
|
autoUpdateToggle.isOn = false;
|
||||||
autoUpdateToggle.onValueChanged.AddListener((bool val) => { m_autoUpdate = val; });
|
autoUpdateToggle.onValueChanged.AddListener((bool val) => { m_autoUpdate = val; });
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void ConstructMemberList()
|
internal void ConstructMemberList()
|
||||||
{
|
{
|
||||||
var scrollobj = UIFactory.CreateScrollView(Content, out m_scrollContent, out m_sliderScroller, new Color(0.05f, 0.05f, 0.05f));
|
var scrollobj = UIFactory.CreateScrollView(Content, out m_scrollContent, out m_sliderScroller, new Color(0.05f, 0.05f, 0.05f));
|
||||||
|
|
||||||
|
m_memberListObj = scrollobj;
|
||||||
m_scrollContentRect = m_scrollContent.GetComponent<RectTransform>();
|
m_scrollContentRect = m_scrollContent.GetComponent<RectTransform>();
|
||||||
|
|
||||||
var scrollGroup = m_scrollContent.GetComponent<VerticalLayoutGroup>();
|
var scrollGroup = m_scrollContent.GetComponent<VerticalLayoutGroup>();
|
||||||
|
@ -55,16 +55,15 @@ namespace UnityExplorer.Inspectors
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (!m_dontDestroyObject)
|
if (!s_dontDestroyObject)
|
||||||
{
|
{
|
||||||
m_dontDestroyObject = new GameObject("DontDestroyMe");
|
s_dontDestroyObject = new GameObject("DontDestroyMe");
|
||||||
GameObject.DontDestroyOnLoad(m_dontDestroyObject);
|
GameObject.DontDestroyOnLoad(s_dontDestroyObject);
|
||||||
}
|
}
|
||||||
return m_dontDestroyObject;
|
return s_dontDestroyObject;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
internal static GameObject s_dontDestroyObject;
|
||||||
internal static GameObject m_dontDestroyObject;
|
|
||||||
|
|
||||||
public void Init()
|
public void Init()
|
||||||
{
|
{
|
||||||
@ -97,22 +96,6 @@ namespace UnityExplorer.Inspectors
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//#if CPP
|
|
||||||
// public int GetSceneHandle(string sceneName)
|
|
||||||
// {
|
|
||||||
// if (sceneName == "DontDestroyOnLoad")
|
|
||||||
// return DontDestroyScene;
|
|
||||||
|
|
||||||
// for (int i = 0; i < SceneManager.sceneCount; i++)
|
|
||||||
// {
|
|
||||||
// var scene = SceneManager.GetSceneAt(i);
|
|
||||||
// if (scene.name == sceneName)
|
|
||||||
// return scene.handle;
|
|
||||||
// }
|
|
||||||
// return -1;
|
|
||||||
// }
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
internal void OnSceneChange()
|
internal void OnSceneChange()
|
||||||
{
|
{
|
||||||
m_sceneDropdown.OnCancel(null);
|
m_sceneDropdown.OnCancel(null);
|
||||||
@ -121,8 +104,13 @@ namespace UnityExplorer.Inspectors
|
|||||||
|
|
||||||
private void RefreshSceneSelector()
|
private void RefreshSceneSelector()
|
||||||
{
|
{
|
||||||
var names = new List<string>();
|
var newNames = new List<string>();
|
||||||
var scenes = new List<Scene>();
|
var newScenes = new List<Scene>();
|
||||||
|
|
||||||
|
if (m_currentScenes == null)
|
||||||
|
m_currentScenes = new Scene[0];
|
||||||
|
|
||||||
|
bool anyChange = SceneManager.sceneCount != m_currentScenes.Length - 1;
|
||||||
|
|
||||||
for (int i = 0; i < SceneManager.sceneCount; i++)
|
for (int i = 0; i < SceneManager.sceneCount; i++)
|
||||||
{
|
{
|
||||||
@ -131,33 +119,32 @@ namespace UnityExplorer.Inspectors
|
|||||||
if (scene == default)
|
if (scene == default)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
scenes.Add(scene);
|
if (!anyChange && !m_currentScenes.Any(it => it.GetHandle() == scene.GetHandle()))
|
||||||
names.Add(scene.name);
|
anyChange = true;
|
||||||
|
|
||||||
|
newScenes.Add(scene);
|
||||||
|
newNames.Add(scene.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
names.Add("DontDestroyOnLoad");
|
newNames.Add("DontDestroyOnLoad");
|
||||||
scenes.Add(DontDestroyScene);
|
newScenes.Add(DontDestroyScene);
|
||||||
|
|
||||||
m_sceneDropdown.options.Clear();
|
m_sceneDropdown.options.Clear();
|
||||||
|
|
||||||
foreach (string scene in names)
|
foreach (string scene in newNames)
|
||||||
{
|
{
|
||||||
m_sceneDropdown.options.Add(new Dropdown.OptionData { text = scene });
|
m_sceneDropdown.options.Add(new Dropdown.OptionData { text = scene });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!names.Contains(m_sceneDropdownText.text))
|
if (anyChange)
|
||||||
{
|
{
|
||||||
m_sceneDropdownText.text = names[0];
|
m_sceneDropdownText.text = newNames[0];
|
||||||
SetTargetScene(scenes[0]);
|
SetTargetScene(newScenes[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_currentScenes = scenes.ToArray();
|
m_currentScenes = newScenes.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
//#if CPP
|
|
||||||
// public void SetTargetScene(string name) => SetTargetScene(scene.handle);
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
public void SetTargetScene(Scene scene)
|
public void SetTargetScene(Scene scene)
|
||||||
{
|
{
|
||||||
if (scene == default)
|
if (scene == default)
|
||||||
@ -167,7 +154,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
#if CPP
|
#if CPP
|
||||||
GameObject[] rootObjs = SceneUnstrip.GetRootGameObjects(scene.handle);
|
GameObject[] rootObjs = SceneUnstrip.GetRootGameObjects(scene.handle);
|
||||||
#else
|
#else
|
||||||
GameObject[] rootObjs = SceneUnstrip.GetRootGameObjects(scene);
|
GameObject[] rootObjs = scene.GetRootGameObjects();
|
||||||
#endif
|
#endif
|
||||||
SetSceneObjectList(rootObjs);
|
SetSceneObjectList(rootObjs);
|
||||||
|
|
||||||
|
BIN
src/Resources/explorerui.modern.bundle
Normal file
BIN
src/Resources/explorerui.modern.bundle
Normal file
Binary file not shown.
@ -3,11 +3,24 @@ using System.Collections.Generic;
|
|||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
using UnityExplorer.Unstrip;
|
||||||
#if CPP
|
#if CPP
|
||||||
|
using UnhollowerBaseLib;
|
||||||
|
using UnityExplorer.Helpers;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace UnityExplorer.Tests
|
namespace UnityExplorer.Tests
|
||||||
{
|
{
|
||||||
|
internal enum TestByteEnum : byte
|
||||||
|
{
|
||||||
|
One,
|
||||||
|
Two,
|
||||||
|
Three,
|
||||||
|
TwoFiftyFive = 255,
|
||||||
|
}
|
||||||
|
|
||||||
public static class StaticTestClass
|
public static class StaticTestClass
|
||||||
{
|
{
|
||||||
public static int StaticProperty => 5;
|
public static int StaticProperty => 5;
|
||||||
@ -19,11 +32,12 @@ namespace UnityExplorer.Tests
|
|||||||
"three",
|
"three",
|
||||||
};
|
};
|
||||||
public static void StaticMethod() { }
|
public static void StaticMethod() { }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TestClass
|
public class TestClass
|
||||||
{
|
{
|
||||||
|
internal static TestByteEnum testingByte = TestByteEnum.One;
|
||||||
|
|
||||||
public string AAALongString = @"1
|
public string AAALongString = @"1
|
||||||
2
|
2
|
||||||
3
|
3
|
||||||
@ -118,13 +132,15 @@ namespace UnityExplorer.Tests
|
|||||||
private static bool m_setOnlyProperty;
|
private static bool m_setOnlyProperty;
|
||||||
public static bool ReadSetOnlyProperty => m_setOnlyProperty;
|
public static bool ReadSetOnlyProperty => m_setOnlyProperty;
|
||||||
|
|
||||||
public Texture TestTexture;
|
public Texture2D TestTexture;
|
||||||
public static Sprite TestSprite;
|
public static Sprite TestSprite;
|
||||||
|
|
||||||
#if CPP
|
#if CPP
|
||||||
public static Il2CppSystem.Collections.Generic.HashSet<string> CppHashSetTest;
|
public static Il2CppSystem.Collections.Generic.HashSet<string> CppHashSetTest;
|
||||||
public static Il2CppSystem.Collections.Generic.List<string> CppStringTest;
|
public static Il2CppSystem.Collections.Generic.List<string> CppStringTest;
|
||||||
public static Il2CppSystem.Collections.IList CppIList;
|
public static Il2CppSystem.Collections.IList CppIList;
|
||||||
|
//public static Il2CppSystem.Collections.Generic.Dictionary<string, string> CppDictTest;
|
||||||
|
//public static Il2CppSystem.Collections.Generic.Dictionary<int, float> CppDictTest2;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
public TestClass()
|
public TestClass()
|
||||||
@ -140,20 +156,7 @@ namespace UnityExplorer.Tests
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if CPP
|
#if CPP
|
||||||
TestTexture = UIManager.MakeSolidTexture(Color.white, 1000, 600);
|
TextureSpriteTest();
|
||||||
TestTexture.name = "TestTexture";
|
|
||||||
|
|
||||||
var r = new Rect(0, 0, TestTexture.width, TestTexture.height);
|
|
||||||
var v2 = Vector2.zero;
|
|
||||||
var v4 = Vector4.zero;
|
|
||||||
TestSprite = Sprite.CreateSprite_Injected((Texture2D)TestTexture, ref r, ref v2, 100f, 0u, SpriteMeshType.Tight, ref v4, false);
|
|
||||||
|
|
||||||
GameObject.DontDestroyOnLoad(TestTexture);
|
|
||||||
GameObject.DontDestroyOnLoad(TestSprite);
|
|
||||||
|
|
||||||
//// test loading a tex from file
|
|
||||||
//var dataToLoad = System.IO.File.ReadAllBytes(@"Mods\UnityExplorer\Tex_Nemundis_Nebula.png");
|
|
||||||
//ExplorerCore.Log($"Tex load success: {TestTexture.LoadImage(dataToLoad, false)}");
|
|
||||||
|
|
||||||
CppHashSetTest = new Il2CppSystem.Collections.Generic.HashSet<string>();
|
CppHashSetTest = new Il2CppSystem.Collections.Generic.HashSet<string>();
|
||||||
CppHashSetTest.Add("1");
|
CppHashSetTest.Add("1");
|
||||||
@ -163,9 +166,38 @@ namespace UnityExplorer.Tests
|
|||||||
CppStringTest = new Il2CppSystem.Collections.Generic.List<string>();
|
CppStringTest = new Il2CppSystem.Collections.Generic.List<string>();
|
||||||
CppStringTest.Add("1");
|
CppStringTest.Add("1");
|
||||||
CppStringTest.Add("2");
|
CppStringTest.Add("2");
|
||||||
|
|
||||||
|
//CppDictTest = new Il2CppSystem.Collections.Generic.Dictionary<string, string>();
|
||||||
|
//CppDictTest.Add("key1", "value1");
|
||||||
|
//CppDictTest.Add("key2", "value2");
|
||||||
|
//CppDictTest.Add("key3", "value3");
|
||||||
|
|
||||||
|
//CppDictTest2 = new Il2CppSystem.Collections.Generic.Dictionary<int, float>();
|
||||||
|
//CppDictTest2.Add(0, 0.5f);
|
||||||
|
//CppDictTest2.Add(1, 0.5f);
|
||||||
|
//CppDictTest2.Add(2, 0.5f);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void TextureSpriteTest()
|
||||||
|
{
|
||||||
|
TestTexture = new Texture2D(32, 32, TextureFormat.ARGB32, false)
|
||||||
|
{
|
||||||
|
name = "TestTexture"
|
||||||
|
};
|
||||||
|
TestSprite = ImageConversionUnstrip.CreateSprite(TestTexture);
|
||||||
|
|
||||||
|
GameObject.DontDestroyOnLoad(TestTexture);
|
||||||
|
GameObject.DontDestroyOnLoad(TestSprite);
|
||||||
|
|
||||||
|
// test loading a tex from file
|
||||||
|
if (System.IO.File.Exists(@"D:\Downloads\test.png"))
|
||||||
|
{
|
||||||
|
var dataToLoad = System.IO.File.ReadAllBytes(@"D:\Downloads\test.png");
|
||||||
|
ExplorerCore.Log($"Tex load success: {TestTexture.LoadImage(dataToLoad, false)}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static string TestRefInOutGeneric<T>(ref string arg0, in int arg1, out string arg2) where T : Component
|
public static string TestRefInOutGeneric<T>(ref string arg0, in int arg1, out string arg2) where T : Component
|
||||||
{
|
{
|
||||||
arg2 = "this is arg2";
|
arg2 = "this is arg2";
|
||||||
|
@ -87,12 +87,6 @@ namespace UnityExplorer.UI
|
|||||||
new HarmonyMethod(typeof(ForceUnlockCursor).GetMethod(nameof(Prefix_set_visible))),
|
new HarmonyMethod(typeof(ForceUnlockCursor).GetMethod(nameof(Prefix_set_visible))),
|
||||||
true);
|
true);
|
||||||
|
|
||||||
#if BIE
|
|
||||||
#if CPP
|
|
||||||
// temporarily disabling this patch in BepInEx il2cpp as it's causing a crash in some games.
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
TryPatch(typeof(EventSystem),
|
TryPatch(typeof(EventSystem),
|
||||||
"current",
|
"current",
|
||||||
new HarmonyMethod(typeof(ForceUnlockCursor).GetMethod(nameof(Prefix_EventSystem_set_current))),
|
new HarmonyMethod(typeof(ForceUnlockCursor).GetMethod(nameof(Prefix_EventSystem_set_current))),
|
||||||
@ -110,9 +104,11 @@ namespace UnityExplorer.UI
|
|||||||
{
|
{
|
||||||
var harmony =
|
var harmony =
|
||||||
#if ML
|
#if ML
|
||||||
ExplorerMelonMod.Instance.harmonyInstance;
|
ExplorerMelonMod.Instance.Harmony;
|
||||||
#else
|
#elif BIE
|
||||||
ExplorerBepInPlugin.HarmonyInstance;
|
ExplorerBepInPlugin.HarmonyInstance;
|
||||||
|
#elif STANDALONE
|
||||||
|
ExplorerStandalone.HarmonyInstance;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
System.Reflection.PropertyInfo prop = type.GetProperty(property);
|
System.Reflection.PropertyInfo prop = type.GetProperty(property);
|
||||||
@ -164,11 +160,25 @@ namespace UnityExplorer.UI
|
|||||||
|
|
||||||
public static void SetEventSystem()
|
public static void SetEventSystem()
|
||||||
{
|
{
|
||||||
|
// temp disabled for new InputSystem
|
||||||
if (InputManager.CurrentType == InputType.InputSystem)
|
if (InputManager.CurrentType == InputType.InputSystem)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Disable current event system object
|
||||||
|
if (m_lastEventSystem || EventSystem.current)
|
||||||
|
{
|
||||||
|
if (!m_lastEventSystem)
|
||||||
|
m_lastEventSystem = EventSystem.current;
|
||||||
|
|
||||||
|
//ExplorerCore.Log("Disabling current event system...");
|
||||||
|
m_lastEventSystem.enabled = false;
|
||||||
|
//m_lastEventSystem.gameObject.SetActive(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set to our current system
|
||||||
m_settingEventSystem = true;
|
m_settingEventSystem = true;
|
||||||
EventSystem.current = UIManager.EventSys;
|
EventSystem.current = UIManager.EventSys;
|
||||||
|
UIManager.EventSys.enabled = true;
|
||||||
InputManager.ActivateUIModule();
|
InputManager.ActivateUIModule();
|
||||||
m_settingEventSystem = false;
|
m_settingEventSystem = false;
|
||||||
}
|
}
|
||||||
@ -180,6 +190,9 @@ namespace UnityExplorer.UI
|
|||||||
|
|
||||||
if (m_lastEventSystem)
|
if (m_lastEventSystem)
|
||||||
{
|
{
|
||||||
|
m_lastEventSystem.enabled = true;
|
||||||
|
//m_lastEventSystem.gameObject.SetActive(true);
|
||||||
|
|
||||||
m_settingEventSystem = true;
|
m_settingEventSystem = true;
|
||||||
EventSystem.current = m_lastEventSystem;
|
EventSystem.current = m_lastEventSystem;
|
||||||
m_lastInputModule?.ActivateModule();
|
m_lastInputModule?.ActivateModule();
|
||||||
|
@ -16,7 +16,7 @@ namespace UnityExplorer.UI.Modules
|
|||||||
public static DebugConsole Instance { get; private set; }
|
public static DebugConsole Instance { get; private set; }
|
||||||
|
|
||||||
public static bool LogUnity { get; set; } = ModConfig.Instance.Log_Unity_Debug;
|
public static bool LogUnity { get; set; } = ModConfig.Instance.Log_Unity_Debug;
|
||||||
public static bool SaveToDisk { get; set; } = ModConfig.Instance.Save_Logs_To_Disk;
|
//public static bool SaveToDisk { get; set; } = ModConfig.Instance.Save_Logs_To_Disk;
|
||||||
|
|
||||||
internal static StreamWriter s_streamWriter;
|
internal static StreamWriter s_streamWriter;
|
||||||
|
|
||||||
@ -49,8 +49,8 @@ namespace UnityExplorer.UI.Modules
|
|||||||
|
|
||||||
// set up IO
|
// set up IO
|
||||||
|
|
||||||
if (!SaveToDisk)
|
//if (!SaveToDisk)
|
||||||
return;
|
// return;
|
||||||
|
|
||||||
var path = ExplorerCore.EXPLORER_FOLDER + @"\Logs";
|
var path = ExplorerCore.EXPLORER_FOLDER + @"\Logs";
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
//using TMPro;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Config;
|
using UnityExplorer.Config;
|
||||||
@ -19,6 +18,7 @@ namespace UnityExplorer.UI.Modules
|
|||||||
private Toggle m_unlockMouseToggle;
|
private Toggle m_unlockMouseToggle;
|
||||||
private InputField m_pageLimitInput;
|
private InputField m_pageLimitInput;
|
||||||
private InputField m_defaultOutputInput;
|
private InputField m_defaultOutputInput;
|
||||||
|
private Toggle m_hideOnStartupToggle;
|
||||||
|
|
||||||
public override void Init()
|
public override void Init()
|
||||||
{
|
{
|
||||||
@ -27,26 +27,21 @@ namespace UnityExplorer.UI.Modules
|
|||||||
|
|
||||||
public override void Update()
|
public override void Update()
|
||||||
{
|
{
|
||||||
// not needed?
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void OnApply()
|
internal void OnApply()
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrEmpty(m_keycodeInput.text) && Enum.Parse(typeof(KeyCode), m_keycodeInput.text) is KeyCode keyCode)
|
if (!string.IsNullOrEmpty(m_keycodeInput.text) && Enum.Parse(typeof(KeyCode), m_keycodeInput.text) is KeyCode keyCode)
|
||||||
{
|
|
||||||
ModConfig.Instance.Main_Menu_Toggle = keyCode;
|
ModConfig.Instance.Main_Menu_Toggle = keyCode;
|
||||||
}
|
|
||||||
|
|
||||||
ModConfig.Instance.Force_Unlock_Mouse = m_unlockMouseToggle.isOn;
|
ModConfig.Instance.Force_Unlock_Mouse = m_unlockMouseToggle.isOn;
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(m_pageLimitInput.text) && int.TryParse(m_pageLimitInput.text, out int lim))
|
if (!string.IsNullOrEmpty(m_pageLimitInput.text) && int.TryParse(m_pageLimitInput.text, out int lim))
|
||||||
{
|
|
||||||
ModConfig.Instance.Default_Page_Limit = lim;
|
ModConfig.Instance.Default_Page_Limit = lim;
|
||||||
}
|
|
||||||
|
|
||||||
ModConfig.Instance.Default_Output_Path = m_defaultOutputInput.text;
|
ModConfig.Instance.Default_Output_Path = m_defaultOutputInput.text;
|
||||||
|
|
||||||
// todo default output path
|
ModConfig.Instance.Hide_On_Startup = m_hideOnStartupToggle.isOn;
|
||||||
|
|
||||||
ModConfig.SaveSettings();
|
ModConfig.SaveSettings();
|
||||||
ModConfig.InvokeConfigChanged();
|
ModConfig.InvokeConfigChanged();
|
||||||
@ -98,6 +93,7 @@ namespace UnityExplorer.UI.Modules
|
|||||||
ConstructMouseUnlockOpt(optionsGroupObj);
|
ConstructMouseUnlockOpt(optionsGroupObj);
|
||||||
ConstructPageLimitOpt(optionsGroupObj);
|
ConstructPageLimitOpt(optionsGroupObj);
|
||||||
ConstructOutputPathOpt(optionsGroupObj);
|
ConstructOutputPathOpt(optionsGroupObj);
|
||||||
|
ConstructHideOnStartupOpt(optionsGroupObj);
|
||||||
|
|
||||||
var applyBtnObj = UIFactory.CreateButton(Content, new Color(0.2f, 0.2f, 0.2f));
|
var applyBtnObj = UIFactory.CreateButton(Content, new Color(0.2f, 0.2f, 0.2f));
|
||||||
var applyText = applyBtnObj.GetComponentInChildren<Text>();
|
var applyText = applyBtnObj.GetComponentInChildren<Text>();
|
||||||
@ -113,10 +109,34 @@ namespace UnityExplorer.UI.Modules
|
|||||||
applyBtn.onClick.AddListener(OnApply);
|
applyBtn.onClick.AddListener(OnApply);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ConstructHideOnStartupOpt(GameObject optionsGroupObj)
|
||||||
|
{
|
||||||
|
var rowObj = UIFactory.CreateHorizontalGroup(optionsGroupObj, new Color(1, 1, 1, 0));
|
||||||
|
var rowGroup = rowObj.GetComponent<HorizontalLayoutGroup>();
|
||||||
|
rowGroup.childControlWidth = true;
|
||||||
|
rowGroup.childForceExpandWidth = false;
|
||||||
|
rowGroup.childControlHeight = true;
|
||||||
|
rowGroup.childForceExpandHeight = true;
|
||||||
|
var groupLayout = rowObj.AddComponent<LayoutElement>();
|
||||||
|
groupLayout.minHeight = 25;
|
||||||
|
groupLayout.flexibleHeight = 0;
|
||||||
|
groupLayout.minWidth = 200;
|
||||||
|
groupLayout.flexibleWidth = 1000;
|
||||||
|
|
||||||
|
var labelObj = UIFactory.CreateLabel(rowObj, TextAnchor.MiddleLeft);
|
||||||
|
var labelText = labelObj.GetComponent<Text>();
|
||||||
|
labelText.text = "Hide UI on startup:";
|
||||||
|
var labelLayout = labelObj.AddComponent<LayoutElement>();
|
||||||
|
labelLayout.minWidth = 150;
|
||||||
|
labelLayout.minHeight = 25;
|
||||||
|
|
||||||
|
UIFactory.CreateToggle(rowObj, out m_hideOnStartupToggle, out Text toggleText);
|
||||||
|
m_hideOnStartupToggle.isOn = ModConfig.Instance.Hide_On_Startup;
|
||||||
|
toggleText.text = "";
|
||||||
|
}
|
||||||
|
|
||||||
internal void ConstructKeycodeOpt(GameObject parent)
|
internal void ConstructKeycodeOpt(GameObject parent)
|
||||||
{
|
{
|
||||||
//public KeyCode Main_Menu_Toggle = KeyCode.F7;
|
|
||||||
|
|
||||||
var rowObj = UIFactory.CreateHorizontalGroup(parent, new Color(1, 1, 1, 0));
|
var rowObj = UIFactory.CreateHorizontalGroup(parent, new Color(1, 1, 1, 0));
|
||||||
var rowGroup = rowObj.GetComponent<HorizontalLayoutGroup>();
|
var rowGroup = rowObj.GetComponent<HorizontalLayoutGroup>();
|
||||||
rowGroup.childControlWidth = true;
|
rowGroup.childControlWidth = true;
|
||||||
@ -146,8 +166,6 @@ namespace UnityExplorer.UI.Modules
|
|||||||
|
|
||||||
internal void ConstructMouseUnlockOpt(GameObject parent)
|
internal void ConstructMouseUnlockOpt(GameObject parent)
|
||||||
{
|
{
|
||||||
//public bool Force_Unlock_Mouse = true;
|
|
||||||
|
|
||||||
var rowObj = UIFactory.CreateHorizontalGroup(parent, new Color(1, 1, 1, 0));
|
var rowObj = UIFactory.CreateHorizontalGroup(parent, new Color(1, 1, 1, 0));
|
||||||
var rowGroup = rowObj.GetComponent<HorizontalLayoutGroup>();
|
var rowGroup = rowObj.GetComponent<HorizontalLayoutGroup>();
|
||||||
rowGroup.childControlWidth = true;
|
rowGroup.childControlWidth = true;
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
//using TMPro;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
@ -9,6 +8,7 @@ using UnityExplorer.Helpers;
|
|||||||
using UnityExplorer.Inspectors;
|
using UnityExplorer.Inspectors;
|
||||||
using UnityExplorer.UI.Shared;
|
using UnityExplorer.UI.Shared;
|
||||||
using UnityExplorer.Unstrip;
|
using UnityExplorer.Unstrip;
|
||||||
|
using System.Reflection;
|
||||||
#if CPP
|
#if CPP
|
||||||
using UnhollowerRuntimeLib;
|
using UnhollowerRuntimeLib;
|
||||||
#endif
|
#endif
|
||||||
@ -21,7 +21,7 @@ namespace UnityExplorer.UI.Modules
|
|||||||
GameObject,
|
GameObject,
|
||||||
Component,
|
Component,
|
||||||
Custom,
|
Custom,
|
||||||
Instance,
|
Singleton,
|
||||||
StaticClass
|
StaticClass
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,11 +46,14 @@ namespace UnityExplorer.UI.Modules
|
|||||||
|
|
||||||
public static SearchPage Instance;
|
public static SearchPage Instance;
|
||||||
|
|
||||||
|
internal SearchContext m_context;
|
||||||
|
private SceneFilter m_sceneFilter;
|
||||||
|
private ChildFilter m_childFilter;
|
||||||
|
|
||||||
// ui elements
|
// ui elements
|
||||||
|
|
||||||
private Text m_resultCountText;
|
private Text m_resultCountText;
|
||||||
|
|
||||||
internal SearchContext m_context;
|
|
||||||
private InputField m_customTypeInput;
|
private InputField m_customTypeInput;
|
||||||
|
|
||||||
private InputField m_nameInput;
|
private InputField m_nameInput;
|
||||||
@ -60,9 +63,6 @@ namespace UnityExplorer.UI.Modules
|
|||||||
|
|
||||||
private Dropdown m_sceneDropdown;
|
private Dropdown m_sceneDropdown;
|
||||||
private int m_lastSceneCount = -1;
|
private int m_lastSceneCount = -1;
|
||||||
private SceneFilter m_sceneFilter;
|
|
||||||
|
|
||||||
private ChildFilter m_childFilter;
|
|
||||||
|
|
||||||
private GameObject m_extraFilterRow;
|
private GameObject m_extraFilterRow;
|
||||||
|
|
||||||
@ -132,10 +132,9 @@ namespace UnityExplorer.UI.Modules
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
var obj = m_results[itemIndex];
|
var obj = m_results[itemIndex];
|
||||||
|
var unityObj = obj as UnityEngine.Object;
|
||||||
|
|
||||||
var uObj = obj as UnityEngine.Object;
|
if (obj == null || (unityObj != null && !unityObj))
|
||||||
|
|
||||||
if (obj == null || (uObj != null && !uObj))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (i >= m_resultShortList.Count)
|
if (i >= m_resultShortList.Count)
|
||||||
@ -150,17 +149,25 @@ namespace UnityExplorer.UI.Modules
|
|||||||
|
|
||||||
var text = m_resultListTexts[i];
|
var text = m_resultListTexts[i];
|
||||||
|
|
||||||
var name = $"<color={UISyntaxHighlight.Class_Instance}>{ReflectionHelpers.GetActualType(obj).Name}</color>";
|
if (m_context != SearchContext.StaticClass)
|
||||||
|
|
||||||
if (m_context != SearchContext.Instance && m_context != SearchContext.StaticClass)
|
|
||||||
{
|
{
|
||||||
if (uObj && !string.IsNullOrEmpty(uObj.name))
|
var name = UISyntaxHighlight.ParseFullSyntax(obj.GetActualType(), true);
|
||||||
name += $": {uObj.name}";
|
|
||||||
else
|
|
||||||
name += ": <i><color=grey>untitled</color></i>";
|
|
||||||
}
|
|
||||||
|
|
||||||
text.text = name;
|
if (unityObj && m_context != SearchContext.Singleton)
|
||||||
|
{
|
||||||
|
if (unityObj && !string.IsNullOrEmpty(unityObj.name))
|
||||||
|
name += $": {unityObj.name}";
|
||||||
|
else
|
||||||
|
name += ": <i><color=grey>untitled</color></i>";
|
||||||
|
}
|
||||||
|
|
||||||
|
text.text = name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var type = obj as Type;
|
||||||
|
text.text = UISyntaxHighlight.ParseFullSyntax(type, true);
|
||||||
|
}
|
||||||
|
|
||||||
var label = text.transform.parent.parent.gameObject;
|
var label = text.transform.parent.parent.gameObject;
|
||||||
if (!label.activeSelf)
|
if (!label.activeSelf)
|
||||||
@ -222,14 +229,127 @@ namespace UnityExplorer.UI.Modules
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_sceneDropdown.transform.Find("Label").GetComponent<Text>().text = "Any";
|
m_sceneDropdown.transform.Find("Label").GetComponent<Text>().text = "Any";
|
||||||
|
m_sceneFilter = SceneFilter.Any;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ~~~~~ UI Callbacks ~~~~~
|
// ~~~~~ UI Callbacks ~~~~~
|
||||||
|
|
||||||
internal void OnUnitySearchClicked()
|
internal void OnSearchClicked()
|
||||||
{
|
{
|
||||||
m_resultListPageHandler.CurrentPage = 0;
|
m_resultListPageHandler.CurrentPage = 0;
|
||||||
|
|
||||||
|
if (m_context == SearchContext.StaticClass)
|
||||||
|
StaticClassSearch();
|
||||||
|
else if (m_context == SearchContext.Singleton)
|
||||||
|
SingletonSearch();
|
||||||
|
else
|
||||||
|
UnityObjectSearch();
|
||||||
|
|
||||||
|
RefreshResultList();
|
||||||
|
|
||||||
|
if (m_results.Length > 0)
|
||||||
|
m_resultCountText.text = $"{m_results.Length} Results";
|
||||||
|
else
|
||||||
|
m_resultCountText.text = "No results...";
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void StaticClassSearch()
|
||||||
|
{
|
||||||
|
var list = new List<Type>();
|
||||||
|
|
||||||
|
var nameFilter = "";
|
||||||
|
if (!string.IsNullOrEmpty(m_nameInput.text))
|
||||||
|
nameFilter = m_nameInput.text.ToLower();
|
||||||
|
|
||||||
|
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
|
||||||
|
{
|
||||||
|
foreach (var type in asm.TryGetTypes().Where(it => it.IsSealed && it.IsAbstract))
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(nameFilter) && !type.FullName.ToLower().Contains(nameFilter))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
list.Add(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_results = list.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
internal string[] s_instanceNames = new string[]
|
||||||
|
{
|
||||||
|
"m_instance",
|
||||||
|
"m_Instance",
|
||||||
|
"s_instance",
|
||||||
|
"s_Instance",
|
||||||
|
"_instance",
|
||||||
|
"_Instance",
|
||||||
|
"instance",
|
||||||
|
"Instance",
|
||||||
|
"<Instance>k__BackingField",
|
||||||
|
"<instance>k__BackingField",
|
||||||
|
};
|
||||||
|
|
||||||
|
private void SingletonSearch()
|
||||||
|
{
|
||||||
|
var instances = new List<object>();
|
||||||
|
|
||||||
|
var nameFilter = "";
|
||||||
|
if (!string.IsNullOrEmpty(m_nameInput.text))
|
||||||
|
nameFilter = m_nameInput.text.ToLower();
|
||||||
|
|
||||||
|
var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;
|
||||||
|
|
||||||
|
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
|
||||||
|
{
|
||||||
|
// Search all non-static, non-enum classes.
|
||||||
|
foreach (var type in asm.TryGetTypes().Where(it => !(it.IsSealed && it.IsAbstract) && !it.IsEnum))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(nameFilter) && !type.FullName.ToLower().Contains(nameFilter))
|
||||||
|
continue;
|
||||||
|
#if CPP
|
||||||
|
// Only look for Properties in IL2CPP, not for Mono.
|
||||||
|
PropertyInfo pi;
|
||||||
|
foreach (var name in s_instanceNames)
|
||||||
|
{
|
||||||
|
pi = type.GetProperty(name, flags);
|
||||||
|
if (pi != null)
|
||||||
|
{
|
||||||
|
var instance = pi.GetValue(null, null);
|
||||||
|
if (instance != null)
|
||||||
|
{
|
||||||
|
instances.Add(instance);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
// Look for a typical Instance backing field.
|
||||||
|
FieldInfo fi;
|
||||||
|
foreach (var name in s_instanceNames)
|
||||||
|
{
|
||||||
|
fi = type.GetField(name, flags);
|
||||||
|
if (fi != null)
|
||||||
|
{
|
||||||
|
var instance = fi.GetValue(null);
|
||||||
|
if (instance != null)
|
||||||
|
{
|
||||||
|
instances.Add(instance);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_results = instances.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void UnityObjectSearch()
|
||||||
|
{
|
||||||
Type searchType = null;
|
Type searchType = null;
|
||||||
switch (m_context)
|
switch (m_context)
|
||||||
{
|
{
|
||||||
@ -305,12 +425,12 @@ namespace UnityExplorer.UI.Modules
|
|||||||
: obj.TryCast<Component>().gameObject;
|
: obj.TryCast<Component>().gameObject;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!go)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// scene check
|
// scene check
|
||||||
if (m_sceneFilter != SceneFilter.Any)
|
if (m_sceneFilter != SceneFilter.Any)
|
||||||
{
|
{
|
||||||
|
if (!go)
|
||||||
|
continue;
|
||||||
|
|
||||||
switch (m_context)
|
switch (m_context)
|
||||||
{
|
{
|
||||||
case SearchContext.GameObject:
|
case SearchContext.GameObject:
|
||||||
@ -325,24 +445,23 @@ namespace UnityExplorer.UI.Modules
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// root object check (no parent)
|
if (m_childFilter != ChildFilter.Any)
|
||||||
if (m_childFilter == ChildFilter.HasParent && !go.transform.parent)
|
{
|
||||||
continue;
|
if (!go)
|
||||||
else if (m_childFilter == ChildFilter.RootObject && go.transform.parent)
|
continue;
|
||||||
continue;
|
|
||||||
|
// root object check (no parent)
|
||||||
|
if (m_childFilter == ChildFilter.HasParent && !go.transform.parent)
|
||||||
|
continue;
|
||||||
|
else if (m_childFilter == ChildFilter.RootObject && go.transform.parent)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
results.Add(obj);
|
results.Add(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_results = results.ToArray();
|
m_results = results.ToArray();
|
||||||
|
|
||||||
if (m_results.Length > 0)
|
|
||||||
m_resultCountText.text = $"{m_results.Length} Results";
|
|
||||||
else
|
|
||||||
m_resultCountText.text = "No results...";
|
|
||||||
|
|
||||||
RefreshResultList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnResultPageTurn()
|
private void OnResultPageTurn()
|
||||||
@ -490,6 +609,23 @@ namespace UnityExplorer.UI.Modules
|
|||||||
m_customTypeInput = customTypeObj.GetComponent<InputField>();
|
m_customTypeInput = customTypeObj.GetComponent<InputField>();
|
||||||
m_customTypeInput.placeholder.gameObject.GetComponent<Text>().text = "eg. UnityEngine.Texture2D, etc...";
|
m_customTypeInput.placeholder.gameObject.GetComponent<Text>().text = "eg. UnityEngine.Texture2D, etc...";
|
||||||
|
|
||||||
|
// static class and singleton buttons
|
||||||
|
|
||||||
|
var secondRow = UIFactory.CreateHorizontalGroup(optionsGroupObj, new Color(1, 1, 1, 0));
|
||||||
|
var secondGroup = secondRow.GetComponent<HorizontalLayoutGroup>();
|
||||||
|
secondGroup.childForceExpandWidth = false;
|
||||||
|
secondGroup.childForceExpandHeight = false;
|
||||||
|
secondGroup.spacing = 3;
|
||||||
|
var secondLayout = secondRow.AddComponent<LayoutElement>();
|
||||||
|
secondLayout.minHeight = 25;
|
||||||
|
var spacer = UIFactory.CreateUIObject("spacer", secondRow);
|
||||||
|
var spaceLayout = spacer.AddComponent<LayoutElement>();
|
||||||
|
spaceLayout.minWidth = 125;
|
||||||
|
spaceLayout.minHeight = 25;
|
||||||
|
|
||||||
|
AddContextButton(secondRow, "Static Class", SearchContext.StaticClass);
|
||||||
|
AddContextButton(secondRow, "Singleton", SearchContext.Singleton);
|
||||||
|
|
||||||
// search input
|
// search input
|
||||||
|
|
||||||
var nameRowObj = UIFactory.CreateHorizontalGroup(optionsGroupObj, new Color(1, 1, 1, 0));
|
var nameRowObj = UIFactory.CreateHorizontalGroup(optionsGroupObj, new Color(1, 1, 1, 0));
|
||||||
@ -601,7 +737,7 @@ namespace UnityExplorer.UI.Modules
|
|||||||
searchBtnLayout.flexibleHeight = 0;
|
searchBtnLayout.flexibleHeight = 0;
|
||||||
var searchBtn = searchBtnObj.GetComponent<Button>();
|
var searchBtn = searchBtnObj.GetComponent<Button>();
|
||||||
|
|
||||||
searchBtn.onClick.AddListener(OnUnitySearchClicked);
|
searchBtn.onClick.AddListener(OnSearchClicked);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void AddContextButton(GameObject parent, string label, SearchContext context, float width = 110)
|
internal void AddContextButton(GameObject parent, string label, SearchContext context, float width = 110)
|
||||||
|
@ -33,6 +33,8 @@ namespace UnityExplorer.UI.Shared
|
|||||||
this.sliderScroller = sliderScroller;
|
this.sliderScroller = sliderScroller;
|
||||||
this.inputField = inputField;
|
this.inputField = inputField;
|
||||||
|
|
||||||
|
sliderScroller.m_parentInputScroller = this;
|
||||||
|
|
||||||
inputField.onValueChanged.AddListener(OnTextChanged);
|
inputField.onValueChanged.AddListener(OnTextChanged);
|
||||||
|
|
||||||
inputRect = inputField.GetComponent<RectTransform>();
|
inputRect = inputField.GetComponent<RectTransform>();
|
||||||
@ -68,6 +70,17 @@ namespace UnityExplorer.UI.Shared
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal bool CheckDestroyed()
|
||||||
|
{
|
||||||
|
if (sliderScroller == null || sliderScroller.CheckDestroyed())
|
||||||
|
{
|
||||||
|
Instances.Remove(this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
internal void OnTextChanged(string text)
|
internal void OnTextChanged(string text)
|
||||||
{
|
{
|
||||||
m_lastText = text;
|
m_lastText = text;
|
||||||
|
@ -8,150 +8,154 @@ using UnityExplorer;
|
|||||||
using UnityExplorer.Helpers;
|
using UnityExplorer.Helpers;
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
|
|
||||||
// Basically just to fix an issue with Scrollbars, instead we use a Slider as the scrollbar.
|
namespace UnityExplorer.UI.Shared
|
||||||
public class SliderScrollbar
|
|
||||||
{
|
{
|
||||||
internal static readonly List<SliderScrollbar> Instances = new List<SliderScrollbar>();
|
// Basically just to fix an issue with Scrollbars, instead we use a Slider as the scrollbar.
|
||||||
|
public class SliderScrollbar
|
||||||
public bool IsActive { get; private set; }
|
|
||||||
|
|
||||||
internal readonly Scrollbar m_scrollbar;
|
|
||||||
internal readonly Slider m_slider;
|
|
||||||
internal readonly RectTransform m_scrollRect;
|
|
||||||
|
|
||||||
public SliderScrollbar(Scrollbar scrollbar, Slider slider)
|
|
||||||
{
|
{
|
||||||
Instances.Add(this);
|
internal static readonly List<SliderScrollbar> Instances = new List<SliderScrollbar>();
|
||||||
|
|
||||||
this.m_scrollbar = scrollbar;
|
public bool IsActive { get; private set; }
|
||||||
this.m_slider = slider;
|
|
||||||
this.m_scrollRect = scrollbar.transform.parent.GetComponent<RectTransform>();
|
|
||||||
|
|
||||||
this.m_scrollbar.onValueChanged.AddListener(this.OnScrollbarValueChanged);
|
internal readonly Scrollbar m_scrollbar;
|
||||||
this.m_slider.onValueChanged.AddListener(this.OnSliderValueChanged);
|
internal readonly Slider m_slider;
|
||||||
|
internal readonly RectTransform m_scrollRect;
|
||||||
|
|
||||||
this.RefreshVisibility();
|
internal InputFieldScroller m_parentInputScroller;
|
||||||
this.m_slider.Set(1f, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal bool CheckDestroyed()
|
public SliderScrollbar(Scrollbar scrollbar, Slider slider)
|
||||||
{
|
|
||||||
if (!m_slider || !m_scrollbar)
|
|
||||||
{
|
{
|
||||||
Instances.Remove(this);
|
Instances.Add(this);
|
||||||
return true;
|
|
||||||
|
this.m_scrollbar = scrollbar;
|
||||||
|
this.m_slider = slider;
|
||||||
|
this.m_scrollRect = scrollbar.transform.parent.GetComponent<RectTransform>();
|
||||||
|
|
||||||
|
this.m_scrollbar.onValueChanged.AddListener(this.OnScrollbarValueChanged);
|
||||||
|
this.m_slider.onValueChanged.AddListener(this.OnSliderValueChanged);
|
||||||
|
|
||||||
|
this.RefreshVisibility();
|
||||||
|
this.m_slider.Set(1f, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
internal bool CheckDestroyed()
|
||||||
}
|
|
||||||
|
|
||||||
internal void Update()
|
|
||||||
{
|
|
||||||
this.RefreshVisibility();
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void RefreshVisibility()
|
|
||||||
{
|
|
||||||
if (!m_slider.gameObject.activeInHierarchy)
|
|
||||||
{
|
{
|
||||||
IsActive = false;
|
if (!m_slider || !m_scrollbar)
|
||||||
return;
|
{
|
||||||
|
Instances.Remove(this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shouldShow = !Mathf.Approximately(this.m_scrollbar.size, 1);
|
internal void Update()
|
||||||
var obj = this.m_slider.handleRect.gameObject;
|
|
||||||
|
|
||||||
if (IsActive != shouldShow)
|
|
||||||
{
|
{
|
||||||
IsActive = shouldShow;
|
this.RefreshVisibility();
|
||||||
obj.SetActive(IsActive);
|
|
||||||
|
|
||||||
if (IsActive)
|
|
||||||
this.m_slider.Set(this.m_scrollbar.value, false);
|
|
||||||
else
|
|
||||||
m_slider.Set(1f, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void RefreshVisibility()
|
||||||
|
{
|
||||||
|
if (!m_slider.gameObject.activeInHierarchy)
|
||||||
|
{
|
||||||
|
IsActive = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool shouldShow = !Mathf.Approximately(this.m_scrollbar.size, 1);
|
||||||
|
var obj = this.m_slider.handleRect.gameObject;
|
||||||
|
|
||||||
|
if (IsActive != shouldShow)
|
||||||
|
{
|
||||||
|
IsActive = shouldShow;
|
||||||
|
obj.SetActive(IsActive);
|
||||||
|
|
||||||
|
if (IsActive)
|
||||||
|
this.m_slider.Set(this.m_scrollbar.value, false);
|
||||||
|
else
|
||||||
|
m_slider.Set(1f, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnScrollbarValueChanged(float _value)
|
||||||
|
{
|
||||||
|
if (this.m_slider.value != _value)
|
||||||
|
this.m_slider.Set(_value, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnSliderValueChanged(float _value)
|
||||||
|
{
|
||||||
|
this.m_scrollbar.value = _value;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region UI CONSTRUCTION
|
||||||
|
|
||||||
|
public static GameObject CreateSliderScrollbar(GameObject parent, out Slider slider)
|
||||||
|
{
|
||||||
|
GameObject sliderObj = UIFactory.CreateUIObject("Slider", parent, UIFactory.thinSize);
|
||||||
|
|
||||||
|
GameObject bgObj = UIFactory.CreateUIObject("Background", sliderObj);
|
||||||
|
GameObject fillAreaObj = UIFactory.CreateUIObject("Fill Area", sliderObj);
|
||||||
|
GameObject fillObj = UIFactory.CreateUIObject("Fill", fillAreaObj);
|
||||||
|
GameObject handleSlideAreaObj = UIFactory.CreateUIObject("Handle Slide Area", sliderObj);
|
||||||
|
GameObject handleObj = UIFactory.CreateUIObject("Handle", handleSlideAreaObj);
|
||||||
|
|
||||||
|
Image bgImage = bgObj.AddComponent<Image>();
|
||||||
|
bgImage.type = Image.Type.Sliced;
|
||||||
|
bgImage.color = new Color(0.05f, 0.05f, 0.05f, 1.0f);
|
||||||
|
|
||||||
|
RectTransform bgRect = bgObj.GetComponent<RectTransform>();
|
||||||
|
bgRect.anchorMin = Vector2.zero;
|
||||||
|
bgRect.anchorMax = Vector2.one;
|
||||||
|
bgRect.sizeDelta = Vector2.zero;
|
||||||
|
bgRect.offsetMax = new Vector2(-10f, 0f);
|
||||||
|
|
||||||
|
RectTransform fillAreaRect = fillAreaObj.GetComponent<RectTransform>();
|
||||||
|
fillAreaRect.anchorMin = new Vector2(0f, 0.25f);
|
||||||
|
fillAreaRect.anchorMax = new Vector2(1f, 0.75f);
|
||||||
|
fillAreaRect.anchoredPosition = new Vector2(-5f, 0f);
|
||||||
|
fillAreaRect.sizeDelta = new Vector2(-20f, 0f);
|
||||||
|
|
||||||
|
Image fillImage = fillObj.AddComponent<Image>();
|
||||||
|
fillImage.type = Image.Type.Sliced;
|
||||||
|
fillImage.color = Color.clear;
|
||||||
|
|
||||||
|
fillObj.GetComponent<RectTransform>().sizeDelta = new Vector2(10f, 0f);
|
||||||
|
|
||||||
|
RectTransform handleSlideRect = handleSlideAreaObj.GetComponent<RectTransform>();
|
||||||
|
handleSlideRect.anchorMin = new Vector2(0f, 0f);
|
||||||
|
handleSlideRect.anchorMax = new Vector2(1f, 1f);
|
||||||
|
handleSlideRect.offsetMin = new Vector2(15f, 30f);
|
||||||
|
handleSlideRect.offsetMax = new Vector2(-15f, 0f);
|
||||||
|
handleSlideRect.sizeDelta = new Vector2(-30f, -30f);
|
||||||
|
|
||||||
|
Image handleImage = handleObj.AddComponent<Image>();
|
||||||
|
handleImage.color = new Color(0.5f, 0.5f, 0.5f, 1.0f);
|
||||||
|
|
||||||
|
var handleRect = handleObj.GetComponent<RectTransform>();
|
||||||
|
handleRect.sizeDelta = new Vector2(15f, 30f);
|
||||||
|
handleRect.offsetMin = new Vector2(-13f, -28f);
|
||||||
|
handleRect.offsetMax = new Vector2(3f, -2f);
|
||||||
|
|
||||||
|
var sliderBarLayout = sliderObj.AddComponent<LayoutElement>();
|
||||||
|
sliderBarLayout.minWidth = 25;
|
||||||
|
sliderBarLayout.flexibleWidth = 0;
|
||||||
|
sliderBarLayout.minHeight = 30;
|
||||||
|
sliderBarLayout.flexibleHeight = 5000;
|
||||||
|
|
||||||
|
slider = sliderObj.AddComponent<Slider>();
|
||||||
|
slider.fillRect = fillObj.GetComponent<RectTransform>();
|
||||||
|
slider.handleRect = handleObj.GetComponent<RectTransform>();
|
||||||
|
slider.targetGraphic = handleImage;
|
||||||
|
slider.direction = Slider.Direction.BottomToTop;
|
||||||
|
UIFactory.SetDefaultColorTransitionValues(slider);
|
||||||
|
|
||||||
|
return sliderObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnScrollbarValueChanged(float _value)
|
|
||||||
{
|
|
||||||
if (this.m_slider.value != _value)
|
|
||||||
this.m_slider.Set(_value, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnSliderValueChanged(float _value)
|
|
||||||
{
|
|
||||||
this.m_scrollbar.value = _value;
|
|
||||||
}
|
|
||||||
|
|
||||||
#region UI CONSTRUCTION
|
|
||||||
|
|
||||||
public static GameObject CreateSliderScrollbar(GameObject parent, out Slider slider)
|
|
||||||
{
|
|
||||||
GameObject sliderObj = UIFactory.CreateUIObject("Slider", parent, UIFactory.thinSize);
|
|
||||||
|
|
||||||
GameObject bgObj = UIFactory.CreateUIObject("Background", sliderObj);
|
|
||||||
GameObject fillAreaObj = UIFactory.CreateUIObject("Fill Area", sliderObj);
|
|
||||||
GameObject fillObj = UIFactory.CreateUIObject("Fill", fillAreaObj);
|
|
||||||
GameObject handleSlideAreaObj = UIFactory.CreateUIObject("Handle Slide Area", sliderObj);
|
|
||||||
GameObject handleObj = UIFactory.CreateUIObject("Handle", handleSlideAreaObj);
|
|
||||||
|
|
||||||
Image bgImage = bgObj.AddComponent<Image>();
|
|
||||||
bgImage.type = Image.Type.Sliced;
|
|
||||||
bgImage.color = new Color(0.05f, 0.05f, 0.05f, 1.0f);
|
|
||||||
|
|
||||||
RectTransform bgRect = bgObj.GetComponent<RectTransform>();
|
|
||||||
bgRect.anchorMin = Vector2.zero;
|
|
||||||
bgRect.anchorMax = Vector2.one;
|
|
||||||
bgRect.sizeDelta = Vector2.zero;
|
|
||||||
bgRect.offsetMax = new Vector2(-10f, 0f);
|
|
||||||
|
|
||||||
RectTransform fillAreaRect = fillAreaObj.GetComponent<RectTransform>();
|
|
||||||
fillAreaRect.anchorMin = new Vector2(0f, 0.25f);
|
|
||||||
fillAreaRect.anchorMax = new Vector2(1f, 0.75f);
|
|
||||||
fillAreaRect.anchoredPosition = new Vector2(-5f, 0f);
|
|
||||||
fillAreaRect.sizeDelta = new Vector2(-20f, 0f);
|
|
||||||
|
|
||||||
Image fillImage = fillObj.AddComponent<Image>();
|
|
||||||
fillImage.type = Image.Type.Sliced;
|
|
||||||
fillImage.color = Color.clear;
|
|
||||||
|
|
||||||
fillObj.GetComponent<RectTransform>().sizeDelta = new Vector2(10f, 0f);
|
|
||||||
|
|
||||||
RectTransform handleSlideRect = handleSlideAreaObj.GetComponent<RectTransform>();
|
|
||||||
handleSlideRect.anchorMin = new Vector2(0f, 0f);
|
|
||||||
handleSlideRect.anchorMax = new Vector2(1f, 1f);
|
|
||||||
handleSlideRect.offsetMin = new Vector2(15f, 30f);
|
|
||||||
handleSlideRect.offsetMax = new Vector2(-15f, 0f);
|
|
||||||
handleSlideRect.sizeDelta = new Vector2(-30f, -30f);
|
|
||||||
|
|
||||||
Image handleImage = handleObj.AddComponent<Image>();
|
|
||||||
handleImage.color = new Color(0.5f, 0.5f, 0.5f, 1.0f);
|
|
||||||
|
|
||||||
var handleRect = handleObj.GetComponent<RectTransform>();
|
|
||||||
handleRect.sizeDelta = new Vector2(15f, 30f);
|
|
||||||
handleRect.offsetMin = new Vector2(-13f, -28f);
|
|
||||||
handleRect.offsetMax = new Vector2(3f, -2f);
|
|
||||||
|
|
||||||
var sliderBarLayout = sliderObj.AddComponent<LayoutElement>();
|
|
||||||
sliderBarLayout.minWidth = 25;
|
|
||||||
sliderBarLayout.flexibleWidth = 0;
|
|
||||||
sliderBarLayout.minHeight = 30;
|
|
||||||
sliderBarLayout.flexibleHeight = 5000;
|
|
||||||
|
|
||||||
slider = sliderObj.AddComponent<Slider>();
|
|
||||||
slider.fillRect = fillObj.GetComponent<RectTransform>();
|
|
||||||
slider.handleRect = handleObj.GetComponent<RectTransform>();
|
|
||||||
slider.targetGraphic = handleImage;
|
|
||||||
slider.direction = Slider.Direction.BottomToTop;
|
|
||||||
UIFactory.SetDefaultColorTransitionValues(slider);
|
|
||||||
|
|
||||||
return sliderObj;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
#if MONO
|
#if MONO
|
||||||
public static class SliderExtensions
|
public static class SliderExtensions
|
||||||
{
|
{
|
||||||
@ -175,4 +179,5 @@ public static class SliderExtensions
|
|||||||
SetMethod.Invoke(slider, new object[] { value, invokeCallback });
|
SetMethod.Invoke(slider, new object[] { value, invokeCallback });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
}
|
@ -45,7 +45,6 @@ namespace UnityExplorer.UI
|
|||||||
SceneExplorer.Instance?.OnSceneChange();
|
SceneExplorer.Instance?.OnSceneChange();
|
||||||
SearchPage.Instance?.OnSceneChange();
|
SearchPage.Instance?.OnSceneChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Update()
|
public static void Update()
|
||||||
{
|
{
|
||||||
MainMenu.Instance?.Update();
|
MainMenu.Instance?.Update();
|
||||||
@ -53,12 +52,9 @@ namespace UnityExplorer.UI
|
|||||||
if (EventSys)
|
if (EventSys)
|
||||||
{
|
{
|
||||||
if (EventSystem.current != EventSys)
|
if (EventSystem.current != EventSys)
|
||||||
{
|
|
||||||
ForceUnlockCursor.SetEventSystem();
|
ForceUnlockCursor.SetEventSystem();
|
||||||
}
|
|
||||||
|
|
||||||
#if CPP
|
#if CPP
|
||||||
// Fix for games which override the InputModule pointer events (eg, VRChat)
|
// Some IL2CPP games behave weird with multiple UI Input Systems, some fixes for them.
|
||||||
var evt = InputManager.InputPointerEvent;
|
var evt = InputManager.InputPointerEvent;
|
||||||
if (evt != null)
|
if (evt != null)
|
||||||
{
|
{
|
||||||
@ -69,9 +65,7 @@ namespace UnityExplorer.UI
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (PanelDragger.Instance != null)
|
if (PanelDragger.Instance != null)
|
||||||
{
|
|
||||||
PanelDragger.Instance.Update();
|
PanelDragger.Instance.Update();
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < SliderScrollbar.Instances.Count; i++)
|
for (int i = 0; i < SliderScrollbar.Instances.Count; i++)
|
||||||
{
|
{
|
||||||
@ -87,40 +81,73 @@ namespace UnityExplorer.UI
|
|||||||
{
|
{
|
||||||
var input = InputFieldScroller.Instances[i];
|
var input = InputFieldScroller.Instances[i];
|
||||||
|
|
||||||
if (input.sliderScroller.CheckDestroyed())
|
if (input.CheckDestroyed())
|
||||||
i--;
|
i--;
|
||||||
else
|
else
|
||||||
input.Update();
|
input.Update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static AssetBundle LoadExplorerUi(string id)
|
||||||
|
{
|
||||||
|
return AssetBundle.LoadFromMemory(ReadFully(typeof(ExplorerCore).Assembly.GetManifestResourceStream($"UnityExplorer.Resources.explorerui.{id}.bundle")));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] ReadFully(this 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static void LoadBundle()
|
private static void LoadBundle()
|
||||||
{
|
{
|
||||||
var bundlePath = ExplorerCore.EXPLORER_FOLDER + @"\explorerui.bundle";
|
AssetBundle bundle = null;
|
||||||
if (File.Exists(bundlePath))
|
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var bundle = AssetBundle.LoadFromFile(bundlePath);
|
bundle = LoadExplorerUi("modern");
|
||||||
|
|
||||||
BackupShader = bundle.LoadAsset<Shader>("DefaultUI");
|
|
||||||
|
|
||||||
// Fix for games which don't ship with 'UI/Default' shader.
|
|
||||||
if (Graphic.defaultGraphicMaterial.shader?.name != "UI/Default")
|
|
||||||
{
|
|
||||||
ExplorerCore.Log("This game does not ship with the 'UI/Default' shader, using manual Default Shader...");
|
|
||||||
Graphic.defaultGraphicMaterial.shader = BackupShader;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResizeCursor = bundle.LoadAsset<Sprite>("cursor");
|
|
||||||
|
|
||||||
ConsoleFont = bundle.LoadAsset<Font>("CONSOLA");
|
|
||||||
|
|
||||||
ExplorerCore.Log("Loaded UI bundle");
|
|
||||||
}
|
}
|
||||||
else
|
catch
|
||||||
{
|
{
|
||||||
ExplorerCore.LogWarning("Could not find the ExplorerUI Bundle! It should exist at '" + bundlePath + "'");
|
ExplorerCore.Log("Failed to load modern ExplorerUI Bundle, falling back to legacy");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
bundle = LoadExplorerUi("legacy");
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// ignored
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bundle == null)
|
||||||
|
{
|
||||||
|
ExplorerCore.LogWarning("Could not load the ExplorerUI Bundle!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BackupShader = bundle.LoadAsset<Shader>("DefaultUI");
|
||||||
|
|
||||||
|
// Fix for games which don't ship with 'UI/Default' shader.
|
||||||
|
if (Graphic.defaultGraphicMaterial.shader?.name != "UI/Default")
|
||||||
|
{
|
||||||
|
ExplorerCore.Log("This game does not ship with the 'UI/Default' shader, using manual Default Shader...");
|
||||||
|
Graphic.defaultGraphicMaterial.shader = BackupShader;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResizeCursor = bundle.LoadAsset<Sprite>("cursor");
|
||||||
|
|
||||||
|
ConsoleFont = bundle.LoadAsset<Font>("CONSOLA");
|
||||||
|
|
||||||
|
ExplorerCore.Log("Loaded UI bundle");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static GameObject CreateRootCanvas()
|
private static GameObject CreateRootCanvas()
|
||||||
@ -139,7 +166,7 @@ namespace UnityExplorer.UI
|
|||||||
canvas.renderMode = RenderMode.ScreenSpaceCamera;
|
canvas.renderMode = RenderMode.ScreenSpaceCamera;
|
||||||
canvas.referencePixelsPerUnit = 100;
|
canvas.referencePixelsPerUnit = 100;
|
||||||
canvas.sortingOrder = 999;
|
canvas.sortingOrder = 999;
|
||||||
canvas.pixelPerfect = false;
|
//canvas.pixelPerfect = false;
|
||||||
|
|
||||||
CanvasScaler scaler = rootObj.AddComponent<CanvasScaler>();
|
CanvasScaler scaler = rootObj.AddComponent<CanvasScaler>();
|
||||||
scaler.referenceResolution = new Vector2(1920, 1080);
|
scaler.referenceResolution = new Vector2(1920, 1080);
|
||||||
@ -149,37 +176,5 @@ namespace UnityExplorer.UI
|
|||||||
|
|
||||||
return rootObj;
|
return rootObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Sprite CreateSprite(Texture2D tex, Rect size = default)
|
|
||||||
{
|
|
||||||
#if CPP
|
|
||||||
Vector2 pivot = Vector2.zero;
|
|
||||||
Vector4 border = Vector4.zero;
|
|
||||||
|
|
||||||
if (size == default)
|
|
||||||
{
|
|
||||||
size = new Rect(0, 0, tex.width, tex.height);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Sprite.CreateSprite_Injected(tex, ref size, ref pivot, 100f, 0u, SpriteMeshType.Tight, ref border, false);
|
|
||||||
#else
|
|
||||||
return Sprite.Create(tex, size, Vector2.zero);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Texture2D MakeSolidTexture(Color color, int width, int height)
|
|
||||||
{
|
|
||||||
Color[] pixels = new Color[width * height];
|
|
||||||
for (int i = 0; i < pixels.Length; i++)
|
|
||||||
{
|
|
||||||
pixels[i] = color;
|
|
||||||
}
|
|
||||||
|
|
||||||
Texture2D tex = new Texture2D(width, height);
|
|
||||||
tex.SetPixels(pixels);
|
|
||||||
tex.Apply();
|
|
||||||
|
|
||||||
return tex;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,310 +1,364 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
<PropertyGroup>
|
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Release_ML_Cpp</Configuration>
|
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<ProjectGuid>{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}</ProjectGuid>
|
|
||||||
<OutputType>Library</OutputType>
|
|
||||||
<!--<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>-->
|
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<Deterministic>true</Deterministic>
|
|
||||||
<TargetFrameworkProfile />
|
|
||||||
<OutputPath>..\Release\Explorer.MelonLoader.Il2Cpp\</OutputPath>
|
|
||||||
<DefineConstants>
|
|
||||||
</DefineConstants>
|
|
||||||
<IsCpp>false</IsCpp>
|
|
||||||
<IsMelonLoader>false</IsMelonLoader>
|
|
||||||
<DebugSymbols>false</DebugSymbols>
|
|
||||||
<DebugType>none</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
|
||||||
<RootNamespace>UnityExplorer</RootNamespace>
|
|
||||||
<!-- Set this to the BepInEx Il2Cpp Game folder, without the ending '\' character. -->
|
|
||||||
<BIECppGameFolder>D:\source\Unity Projects\Test\_BUILD</BIECppGameFolder>
|
|
||||||
<!-- Set this to the MelonLoader Il2Cpp Game folder, without the ending '\' character. -->
|
|
||||||
<MLCppGameFolder>D:\source\Unity Projects\Test\_BUILD</MLCppGameFolder>
|
|
||||||
<NuGetPackageImportStamp>
|
|
||||||
</NuGetPackageImportStamp>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_ML_Cpp|AnyCPU' ">
|
|
||||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
|
||||||
<OutputPath>..\Release\UnityExplorer.MelonLoader.Il2Cpp\</OutputPath>
|
|
||||||
<DefineConstants>CPP,ML</DefineConstants>
|
|
||||||
<AssemblyName>UnityExplorer.ML.IL2CPP</AssemblyName>
|
|
||||||
<IsCpp>true</IsCpp>
|
|
||||||
<IsMelonLoader>true</IsMelonLoader>
|
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_ML_Mono|AnyCPU' ">
|
|
||||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
|
||||||
<OutputPath>..\Release\UnityExplorer.MelonLoader.Mono\</OutputPath>
|
|
||||||
<DefineConstants>MONO,ML</DefineConstants>
|
|
||||||
<AssemblyName>UnityExplorer.ML.Mono</AssemblyName>
|
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
|
||||||
<IsCpp>false</IsCpp>
|
|
||||||
<IsMelonLoader>true</IsMelonLoader>
|
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_BIE_Cpp|AnyCPU' ">
|
|
||||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
|
||||||
<OutputPath>..\Release\UnityExplorer.BepInEx.Il2Cpp\</OutputPath>
|
|
||||||
<DefineConstants>CPP,BIE</DefineConstants>
|
|
||||||
<AssemblyName>UnityExplorer.BIE.IL2CPP</AssemblyName>
|
|
||||||
<IsCpp>true</IsCpp>
|
|
||||||
<IsMelonLoader>false</IsMelonLoader>
|
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_BIE_Mono|AnyCPU' ">
|
|
||||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
|
||||||
<OutputPath>..\Release\UnityExplorer.BepInEx.Mono\</OutputPath>
|
|
||||||
<DefineConstants>MONO,BIE</DefineConstants>
|
|
||||||
<AssemblyName>UnityExplorer.BIE.Mono</AssemblyName>
|
|
||||||
<IsCpp>false</IsCpp>
|
|
||||||
<IsMelonLoader>false</IsMelonLoader>
|
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="INIFileParser, Version=2.5.2.0, Culture=neutral, PublicKeyToken=79af7b307b65cf3c, processorArchitecture=MSIL">
|
|
||||||
<HintPath>packages\ini-parser.2.5.2\lib\net20\INIFileParser.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
<!-- MCS ref -->
|
|
||||||
<Reference Include="mcs">
|
|
||||||
<HintPath>..\lib\mcs.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
|
||||||
<!-- Universal Mono UnityEngine.dll ref (v5.3) -->
|
|
||||||
<ItemGroup Condition="'$(IsCpp)'=='false'">
|
|
||||||
<Reference Include="UnityEngine">
|
|
||||||
<HintPath>..\lib\UnityEngine.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.UI">
|
|
||||||
<HintPath>..\lib\UnityEngine.UI.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
|
||||||
<!-- MelonLoader Mono refs -->
|
|
||||||
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)'=='true|false'">
|
|
||||||
<Reference Include="MelonLoader.ModHandler">
|
|
||||||
<HintPath>..\lib\MelonLoader.ModHandler.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
|
||||||
<!-- BepInEx Mono refs -->
|
|
||||||
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)'=='false|false'">
|
|
||||||
<Reference Include="BepInEx">
|
|
||||||
<HintPath>..\lib\BepInEx.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="0Harmony">
|
|
||||||
<HintPath>..\lib\0Harmony.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
|
||||||
<!-- MelonLoader Il2Cpp refs -->
|
|
||||||
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)'=='true|true'">
|
|
||||||
<Reference Include="MelonLoader.ModHandler">
|
|
||||||
<HintPath>$(MLCppGameFolder)\MelonLoader\MelonLoader.ModHandler.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnhollowerBaseLib">
|
|
||||||
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnhollowerBaseLib.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Il2Cppmscorlib">
|
|
||||||
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\Il2Cppmscorlib.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Il2CppSystem.Core">
|
|
||||||
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\Il2CppSystem.Core.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine">
|
|
||||||
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
|
||||||
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.CoreModule.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.PhysicsModule">
|
|
||||||
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.PhysicsModule.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.TextRenderingModule">
|
|
||||||
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.TextRenderingModule.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.UI">
|
|
||||||
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.UI.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.UIModule">
|
|
||||||
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.UIModule.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.IMGUIModule">
|
|
||||||
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.IMGUIModule.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
|
||||||
<!-- BepInEx Il2Cpp refs -->
|
|
||||||
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)'=='false|true'">
|
|
||||||
<Reference Include="BepInEx">
|
|
||||||
<HintPath>$(BIECppGameFolder)\BepInEx\core\BepInEx.Core.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="0Harmony">
|
|
||||||
<HintPath>$(BIECppGameFolder)\BepInEx\core\0Harmony.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="BepInEx.IL2CPP">
|
|
||||||
<HintPath>$(BIECppGameFolder)\BepInEx\core\BepInEx.IL2CPP.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnhollowerBaseLib">
|
|
||||||
<HintPath>$(BIECppGameFolder)\BepInEx\core\UnhollowerBaseLib.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Il2Cppmscorlib">
|
|
||||||
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\Il2Cppmscorlib.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Il2CppSystem.Core">
|
|
||||||
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\Il2CppSystem.Core.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine">
|
|
||||||
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
|
||||||
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.CoreModule.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.PhysicsModule">
|
|
||||||
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.PhysicsModule.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.TextRenderingModule">
|
|
||||||
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.TextRenderingModule.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.UI">
|
|
||||||
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.UI.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.UIModule">
|
|
||||||
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.UIModule.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.IMGUIModule">
|
|
||||||
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.IMGUIModule.dll</HintPath>
|
|
||||||
<Private>False</Private>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="Helpers\EventHelper.cs" />
|
|
||||||
<Compile Include="Inspectors\MouseInspector.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\CacheObject\CacheEnumerated.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\CacheObject\CacheField.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\CacheObject\CachePaired.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\CacheObject\CacheMember.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\CacheObject\CacheMethod.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\CacheObject\CacheProperty.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\CacheObject\CacheObjectBase.cs" />
|
|
||||||
<Compile Include="Helpers\Texture2DHelpers.cs" />
|
|
||||||
<Compile Include="Config\ModConfig.cs" />
|
|
||||||
<Compile Include="ExplorerCore.cs" />
|
|
||||||
<Compile Include="ExplorerBepInPlugin.cs" />
|
|
||||||
<Compile Include="ExplorerMelonMod.cs" />
|
|
||||||
<Compile Include="Helpers\ReflectionHelpers.cs" />
|
|
||||||
<Compile Include="Helpers\UnityHelpers.cs" />
|
|
||||||
<Compile Include="Inspectors\GameObjects\ChildList.cs" />
|
|
||||||
<Compile Include="Inspectors\GameObjects\ComponentList.cs" />
|
|
||||||
<Compile Include="Inspectors\GameObjects\GameObjectControls.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveBool.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveDictionary.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveEnum.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveEnumerable.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveFlags.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveNumber.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveString.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveUnityStruct.cs" />
|
|
||||||
<Compile Include="UI\ForceUnlockCursor.cs" />
|
|
||||||
<Compile Include="Input\IHandleInput.cs" />
|
|
||||||
<Compile Include="Tests\Tests.cs" />
|
|
||||||
<Compile Include="Input\InputManager.cs" />
|
|
||||||
<Compile Include="Input\InputSystem.cs" />
|
|
||||||
<Compile Include="Input\LegacyInput.cs" />
|
|
||||||
<Compile Include="Input\NoInput.cs" />
|
|
||||||
<Compile Include="UI\Modules\DebugConsole.cs" />
|
|
||||||
<Compile Include="Inspectors\InspectorManager.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\ReflectionInspector.cs" />
|
|
||||||
<Compile Include="UI\MainMenu.cs" />
|
|
||||||
<Compile Include="UI\Modules\CSConsolePage.cs" />
|
|
||||||
<Compile Include="CSConsole\AutoCompleter.cs" />
|
|
||||||
<Compile Include="CSConsole\CodeEditor.cs" />
|
|
||||||
<Compile Include="CSConsole\Lexer\CommentMatch.cs" />
|
|
||||||
<Compile Include="CSConsole\CSharpLexer.cs" />
|
|
||||||
<Compile Include="CSConsole\Lexer\KeywordMatch.cs" />
|
|
||||||
<Compile Include="CSConsole\Lexer\StringMatch.cs" />
|
|
||||||
<Compile Include="CSConsole\Lexer\Matcher.cs" />
|
|
||||||
<Compile Include="CSConsole\Lexer\NumberMatch.cs" />
|
|
||||||
<Compile Include="CSConsole\Lexer\SymbolMatch.cs" />
|
|
||||||
<Compile Include="CSConsole\Suggestion.cs" />
|
|
||||||
<Compile Include="CSConsole\ScriptEvaluator.cs" />
|
|
||||||
<Compile Include="CSConsole\ScriptInteraction.cs" />
|
|
||||||
<Compile Include="UI\Modules\HomePage.cs" />
|
|
||||||
<Compile Include="Inspectors\GameObjects\GameObjectInspector.cs" />
|
|
||||||
<Compile Include="Inspectors\InspectorBase.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\InstanceInspector.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\StaticInspector.cs" />
|
|
||||||
<Compile Include="UI\Modules\OptionsPage.cs" />
|
|
||||||
<Compile Include="Inspectors\SceneExplorer.cs" />
|
|
||||||
<Compile Include="UI\Modules\SearchPage.cs" />
|
|
||||||
<Compile Include="UI\PanelDragger.cs" />
|
|
||||||
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveValue.cs" />
|
|
||||||
<Compile Include="UI\Shared\InputFieldScroller.cs" />
|
|
||||||
<Compile Include="UI\Shared\ScrollRectEx.cs" />
|
|
||||||
<Compile Include="UI\Shared\SliderScrollbar.cs" />
|
|
||||||
<Compile Include="UI\Shared\PageHandler.cs" />
|
|
||||||
<Compile Include="UI\UISyntaxHighlight.cs" />
|
|
||||||
<Compile Include="UI\UIManager.cs" />
|
|
||||||
<Compile Include="Unstrip\AssetBundleUnstrip.cs" />
|
|
||||||
<Compile Include="Unstrip\ColorUtilityUnstrip.cs" />
|
|
||||||
<Compile Include="Unstrip\ImageConversionUnstrip.cs" />
|
|
||||||
<Compile Include="Helpers\ICallHelper.cs" />
|
|
||||||
<Compile Include="Unstrip\LayerMaskUnstrip.cs" />
|
|
||||||
<Compile Include="Unstrip\ResourcesUnstrip.cs" />
|
|
||||||
<Compile Include="Unstrip\SceneUnstrip.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
<Compile Include="UI\UIFactory.cs" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="ILRepack.targets" />
|
|
||||||
<None Include="packages.config" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup />
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
<Import Project="packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets" Condition="Exists('packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets')" />
|
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
<Configuration Condition=" '$(Configuration)' == '' ">Release_ML_Cpp</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<!--<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>-->
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<Deterministic>true</Deterministic>
|
||||||
|
<TargetFrameworkProfile />
|
||||||
|
<OutputPath>..\Release\UnityExplorer.MelonLoader.Il2Cpp\</OutputPath>
|
||||||
|
<DefineConstants>
|
||||||
|
</DefineConstants>
|
||||||
|
<IsCpp>false</IsCpp>
|
||||||
|
<IsMelonLoader>false</IsMelonLoader>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
|
<RootNamespace>UnityExplorer</RootNamespace>
|
||||||
|
<!-- Set this to the BepInEx Il2Cpp Game folder, without the ending '\' character. -->
|
||||||
|
<BIECppGameFolder>E:\source\Unity Projects\Test\_BUILD</BIECppGameFolder>
|
||||||
|
<!-- Set this to the MelonLoader Il2Cpp Game folder, without the ending '\' character. -->
|
||||||
|
<MLCppGameFolder>E:\source\Unity Projects\Test\_BUILD</MLCppGameFolder>
|
||||||
|
<NuGetPackageImportStamp>
|
||||||
|
</NuGetPackageImportStamp>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Error Condition="!Exists('packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets'))" />
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_ML_Cpp|AnyCPU' ">
|
||||||
</Target>
|
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||||
|
<OutputPath>..\Release\UnityExplorer.MelonLoader.Il2Cpp\</OutputPath>
|
||||||
|
<DefineConstants>CPP,ML</DefineConstants>
|
||||||
|
<AssemblyName>UnityExplorer.ML.IL2CPP</AssemblyName>
|
||||||
|
<IsCpp>true</IsCpp>
|
||||||
|
<IsMelonLoader>true</IsMelonLoader>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_ML_Mono|AnyCPU' ">
|
||||||
|
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||||
|
<OutputPath>..\Release\UnityExplorer.MelonLoader.Mono\</OutputPath>
|
||||||
|
<DefineConstants>MONO,ML</DefineConstants>
|
||||||
|
<AssemblyName>UnityExplorer.ML.Mono</AssemblyName>
|
||||||
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
|
<IsCpp>false</IsCpp>
|
||||||
|
<IsMelonLoader>true</IsMelonLoader>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_BIE_Cpp|AnyCPU' ">
|
||||||
|
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||||
|
<OutputPath>..\Release\UnityExplorer.BepInEx.Il2Cpp\</OutputPath>
|
||||||
|
<DefineConstants>CPP,BIE,BIE6</DefineConstants>
|
||||||
|
<AssemblyName>UnityExplorer.BIE.IL2CPP</AssemblyName>
|
||||||
|
<IsCpp>true</IsCpp>
|
||||||
|
<IsMelonLoader>false</IsMelonLoader>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_BIE6_Mono|AnyCPU' ">
|
||||||
|
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||||
|
<OutputPath>..\Release\UnityExplorer.BepInEx6.Mono\</OutputPath>
|
||||||
|
<DefineConstants>MONO,BIE,BIE6</DefineConstants>
|
||||||
|
<AssemblyName>UnityExplorer.BIE6.Mono</AssemblyName>
|
||||||
|
<IsCpp>false</IsCpp>
|
||||||
|
<IsMelonLoader>false</IsMelonLoader>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release_BIE5_Mono|AnyCPU'">
|
||||||
|
<OutputPath>..\Release\UnityExplorer.BepInEx5.Mono\</OutputPath>
|
||||||
|
<DefineConstants>MONO,BIE,BIE5</DefineConstants>
|
||||||
|
<AssemblyName>UnityExplorer.BIE5.Mono</AssemblyName>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
|
<LangVersion>7.3</LangVersion>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release_STANDALONE_Mono|AnyCPU'">
|
||||||
|
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||||
|
<OutputPath>..\Release\UnityExplorer.Standalone.Mono\</OutputPath>
|
||||||
|
<DefineConstants>MONO,STANDALONE</DefineConstants>
|
||||||
|
<AssemblyName>UnityExplorer.STANDALONE.Mono</AssemblyName>
|
||||||
|
<IsCpp>false</IsCpp>
|
||||||
|
<IsMelonLoader>false</IsMelonLoader>
|
||||||
|
<IsStandalone>true</IsStandalone>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release_STANDALONE_Cpp|AnyCPU'">
|
||||||
|
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||||
|
<OutputPath>..\Release\UnityExplorer.Standalone.Il2Cpp\</OutputPath>
|
||||||
|
<DefineConstants>CPP,STANDALONE</DefineConstants>
|
||||||
|
<AssemblyName>UnityExplorer.STANDALONE.IL2CPP</AssemblyName>
|
||||||
|
<IsCpp>true</IsCpp>
|
||||||
|
<IsMelonLoader>false</IsMelonLoader>
|
||||||
|
<IsStandalone>true</IsStandalone>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="INIFileParser, Version=2.5.2.0, Culture=neutral, PublicKeyToken=79af7b307b65cf3c, processorArchitecture=MSIL">
|
||||||
|
<HintPath>packages\ini-parser.2.5.2\lib\net20\INIFileParser.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
<!-- MCS ref -->
|
||||||
|
<Reference Include="mcs">
|
||||||
|
<HintPath>..\lib\mcs.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<!-- Universal Mono UnityEngine.dll ref (v5.3) -->
|
||||||
|
<ItemGroup Condition="'$(IsCpp)'=='false'">
|
||||||
|
<Reference Include="UnityEngine">
|
||||||
|
<HintPath>..\lib\UnityEngine.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UI">
|
||||||
|
<HintPath>..\lib\UnityEngine.UI.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<!-- MelonLoader Mono refs -->
|
||||||
|
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)'=='true|false'">
|
||||||
|
<Reference Include="MelonLoader">
|
||||||
|
<HintPath>..\lib\MelonLoader.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<!-- BepInEx 5 Mono refs -->
|
||||||
|
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)|$(Configuration)'=='false|false|Release_BIE5_Mono'">
|
||||||
|
<Reference Include="BepInEx">
|
||||||
|
<HintPath>..\lib\BepInEx.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="0Harmony">
|
||||||
|
<HintPath>..\lib\0Harmony.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<!-- BepInEx 6 Mono refs -->
|
||||||
|
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)|$(Configuration)'=='false|false|Release_BIE6_Mono'">
|
||||||
|
<Reference Include="BepInEx">
|
||||||
|
<HintPath>..\lib\BepInEx.Core.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="BepInEx.Unity">
|
||||||
|
<HintPath>..\lib\BepInEx.Unity.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="0Harmony">
|
||||||
|
<HintPath>..\lib\0Harmony.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<!-- Standalone refs -->
|
||||||
|
<ItemGroup Condition="'$(IsStandalone)'=='true'">
|
||||||
|
<Reference Include="0Harmony">
|
||||||
|
<HintPath>..\lib\0Harmony.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<!-- MelonLoader Il2Cpp refs -->
|
||||||
|
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)'=='true|true'">
|
||||||
|
<Reference Include="MelonLoader">
|
||||||
|
<HintPath>$(MLCppGameFolder)\MelonLoader\MelonLoader.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnhollowerBaseLib">
|
||||||
|
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnhollowerBaseLib.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Il2Cppmscorlib">
|
||||||
|
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\Il2Cppmscorlib.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Il2CppSystem.Core">
|
||||||
|
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\Il2CppSystem.Core.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine">
|
||||||
|
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.CoreModule">
|
||||||
|
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.CoreModule.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.PhysicsModule">
|
||||||
|
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.PhysicsModule.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.TextRenderingModule">
|
||||||
|
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.TextRenderingModule.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UI">
|
||||||
|
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.UI.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UIModule">
|
||||||
|
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.UIModule.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.IMGUIModule">
|
||||||
|
<HintPath>$(MLCppGameFolder)\MelonLoader\Managed\UnityEngine.IMGUIModule.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<!-- BepInEx Il2Cpp refs -->
|
||||||
|
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)'=='false|true'">
|
||||||
|
<Reference Include="BepInEx">
|
||||||
|
<HintPath>$(BIECppGameFolder)\BepInEx\core\BepInEx.Core.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="0Harmony">
|
||||||
|
<HintPath>$(BIECppGameFolder)\BepInEx\core\0Harmony.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="BepInEx.IL2CPP">
|
||||||
|
<HintPath>$(BIECppGameFolder)\BepInEx\core\BepInEx.IL2CPP.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnhollowerBaseLib">
|
||||||
|
<HintPath>$(BIECppGameFolder)\BepInEx\core\UnhollowerBaseLib.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Il2Cppmscorlib">
|
||||||
|
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\Il2Cppmscorlib.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Il2CppSystem.Core">
|
||||||
|
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\Il2CppSystem.Core.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine">
|
||||||
|
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.CoreModule">
|
||||||
|
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.CoreModule.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.PhysicsModule">
|
||||||
|
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.PhysicsModule.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.TextRenderingModule">
|
||||||
|
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.TextRenderingModule.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UI">
|
||||||
|
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.UI.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UIModule">
|
||||||
|
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.UIModule.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.IMGUIModule">
|
||||||
|
<HintPath>$(BIECppGameFolder)\BepInEx\unhollowed\UnityEngine.IMGUIModule.dll</HintPath>
|
||||||
|
<Private>False</Private>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="ExplorerBepIn6Plugin.cs" />
|
||||||
|
<Compile Include="ExplorerStandalone.cs" />
|
||||||
|
<Compile Include="Helpers\EventHelper.cs" />
|
||||||
|
<Compile Include="Inspectors\MouseInspector.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\CacheObject\CacheEnumerated.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\CacheObject\CacheField.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\CacheObject\CachePaired.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\CacheObject\CacheMember.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\CacheObject\CacheMethod.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\CacheObject\CacheProperty.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\CacheObject\CacheObjectBase.cs" />
|
||||||
|
<Compile Include="Helpers\Texture2DHelpers.cs" />
|
||||||
|
<Compile Include="Config\ModConfig.cs" />
|
||||||
|
<Compile Include="ExplorerCore.cs" />
|
||||||
|
<Compile Include="ExplorerBepIn5Plugin.cs" />
|
||||||
|
<Compile Include="ExplorerMelonMod.cs" />
|
||||||
|
<Compile Include="Helpers\ReflectionHelpers.cs" />
|
||||||
|
<Compile Include="Helpers\UnityHelpers.cs" />
|
||||||
|
<Compile Include="Inspectors\GameObjects\ChildList.cs" />
|
||||||
|
<Compile Include="Inspectors\GameObjects\ComponentList.cs" />
|
||||||
|
<Compile Include="Inspectors\GameObjects\GameObjectControls.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveBool.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveDictionary.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveEnum.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveEnumerable.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveFlags.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveNumber.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveString.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveUnityStruct.cs" />
|
||||||
|
<Compile Include="UI\ForceUnlockCursor.cs" />
|
||||||
|
<Compile Include="Input\IHandleInput.cs" />
|
||||||
|
<Compile Include="Tests\Tests.cs" />
|
||||||
|
<Compile Include="Input\InputManager.cs" />
|
||||||
|
<Compile Include="Input\InputSystem.cs" />
|
||||||
|
<Compile Include="Input\LegacyInput.cs" />
|
||||||
|
<Compile Include="Input\NoInput.cs" />
|
||||||
|
<Compile Include="UI\Modules\DebugConsole.cs" />
|
||||||
|
<Compile Include="Inspectors\InspectorManager.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\ReflectionInspector.cs" />
|
||||||
|
<Compile Include="UI\MainMenu.cs" />
|
||||||
|
<Compile Include="UI\Modules\CSConsolePage.cs" />
|
||||||
|
<Compile Include="CSConsole\AutoCompleter.cs" />
|
||||||
|
<Compile Include="CSConsole\CodeEditor.cs" />
|
||||||
|
<Compile Include="CSConsole\Lexer\CommentMatch.cs" />
|
||||||
|
<Compile Include="CSConsole\CSharpLexer.cs" />
|
||||||
|
<Compile Include="CSConsole\Lexer\KeywordMatch.cs" />
|
||||||
|
<Compile Include="CSConsole\Lexer\StringMatch.cs" />
|
||||||
|
<Compile Include="CSConsole\Lexer\Matcher.cs" />
|
||||||
|
<Compile Include="CSConsole\Lexer\NumberMatch.cs" />
|
||||||
|
<Compile Include="CSConsole\Lexer\SymbolMatch.cs" />
|
||||||
|
<Compile Include="CSConsole\Suggestion.cs" />
|
||||||
|
<Compile Include="CSConsole\ScriptEvaluator.cs" />
|
||||||
|
<Compile Include="CSConsole\ScriptInteraction.cs" />
|
||||||
|
<Compile Include="UI\Modules\HomePage.cs" />
|
||||||
|
<Compile Include="Inspectors\GameObjects\GameObjectInspector.cs" />
|
||||||
|
<Compile Include="Inspectors\InspectorBase.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\InstanceInspector.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\StaticInspector.cs" />
|
||||||
|
<Compile Include="UI\Modules\OptionsPage.cs" />
|
||||||
|
<Compile Include="Inspectors\SceneExplorer.cs" />
|
||||||
|
<Compile Include="UI\Modules\SearchPage.cs" />
|
||||||
|
<Compile Include="UI\PanelDragger.cs" />
|
||||||
|
<Compile Include="Inspectors\Reflection\InteractiveValue\InteractiveValue.cs" />
|
||||||
|
<Compile Include="UI\Shared\InputFieldScroller.cs" />
|
||||||
|
<Compile Include="UI\Shared\ScrollRectEx.cs" />
|
||||||
|
<Compile Include="UI\Shared\SliderScrollbar.cs" />
|
||||||
|
<Compile Include="UI\Shared\PageHandler.cs" />
|
||||||
|
<Compile Include="UI\UISyntaxHighlight.cs" />
|
||||||
|
<Compile Include="UI\UIManager.cs" />
|
||||||
|
<Compile Include="Unstrip\AssetBundleUnstrip.cs" />
|
||||||
|
<Compile Include="Unstrip\ColorUtilityUnstrip.cs" />
|
||||||
|
<Compile Include="Unstrip\ImageConversionUnstrip.cs" />
|
||||||
|
<Compile Include="Helpers\ICallHelper.cs" />
|
||||||
|
<Compile Include="Unstrip\LayerMaskUnstrip.cs" />
|
||||||
|
<Compile Include="Unstrip\ResourcesUnstrip.cs" />
|
||||||
|
<Compile Include="Unstrip\SceneUnstrip.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="UI\UIFactory.cs" />
|
||||||
|
<EmbeddedResource Include="Resources\*" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="ILRepack.targets" />
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup />
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<Import Project="packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets" Condition="Exists('packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets')" />
|
||||||
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Error Condition="!Exists('packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets'))" />
|
||||||
|
</Target>
|
||||||
</Project>
|
</Project>
|
@ -8,19 +8,28 @@ EndProject
|
|||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Release_BIE_Cpp|Any CPU = Release_BIE_Cpp|Any CPU
|
Release_BIE_Cpp|Any CPU = Release_BIE_Cpp|Any CPU
|
||||||
Release_BIE_Mono|Any CPU = Release_BIE_Mono|Any CPU
|
Release_BIE5_Mono|Any CPU = Release_BIE5_Mono|Any CPU
|
||||||
|
Release_BIE6_Mono|Any CPU = Release_BIE6_Mono|Any CPU
|
||||||
Release_ML_Cpp|Any CPU = Release_ML_Cpp|Any CPU
|
Release_ML_Cpp|Any CPU = Release_ML_Cpp|Any CPU
|
||||||
Release_ML_Mono|Any CPU = Release_ML_Mono|Any CPU
|
Release_ML_Mono|Any CPU = Release_ML_Mono|Any CPU
|
||||||
|
Release_STANDALONE_Cpp|Any CPU = Release_STANDALONE_Cpp|Any CPU
|
||||||
|
Release_STANDALONE_Mono|Any CPU = Release_STANDALONE_Mono|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_BIE_Cpp|Any CPU.ActiveCfg = Release_BIE_Cpp|Any CPU
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_BIE_Cpp|Any CPU.ActiveCfg = Release_BIE_Cpp|Any CPU
|
||||||
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_BIE_Cpp|Any CPU.Build.0 = Release_BIE_Cpp|Any CPU
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_BIE_Cpp|Any CPU.Build.0 = Release_BIE_Cpp|Any CPU
|
||||||
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_BIE_Mono|Any CPU.ActiveCfg = Release_BIE_Mono|Any CPU
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_BIE5_Mono|Any CPU.ActiveCfg = Release_BIE5_Mono|Any CPU
|
||||||
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_BIE_Mono|Any CPU.Build.0 = Release_BIE_Mono|Any CPU
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_BIE5_Mono|Any CPU.Build.0 = Release_BIE5_Mono|Any CPU
|
||||||
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_BIE6_Mono|Any CPU.ActiveCfg = Release_BIE6_Mono|Any CPU
|
||||||
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_BIE6_Mono|Any CPU.Build.0 = Release_BIE6_Mono|Any CPU
|
||||||
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_ML_Cpp|Any CPU.ActiveCfg = Release_ML_Cpp|Any CPU
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_ML_Cpp|Any CPU.ActiveCfg = Release_ML_Cpp|Any CPU
|
||||||
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_ML_Cpp|Any CPU.Build.0 = Release_ML_Cpp|Any CPU
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_ML_Cpp|Any CPU.Build.0 = Release_ML_Cpp|Any CPU
|
||||||
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_ML_Mono|Any CPU.ActiveCfg = Release_ML_Mono|Any CPU
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_ML_Mono|Any CPU.ActiveCfg = Release_ML_Mono|Any CPU
|
||||||
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_ML_Mono|Any CPU.Build.0 = Release_ML_Mono|Any CPU
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_ML_Mono|Any CPU.Build.0 = Release_ML_Mono|Any CPU
|
||||||
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_STANDALONE_Cpp|Any CPU.ActiveCfg = Release_STANDALONE_Cpp|Any CPU
|
||||||
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_STANDALONE_Cpp|Any CPU.Build.0 = Release_STANDALONE_Cpp|Any CPU
|
||||||
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_STANDALONE_Mono|Any CPU.ActiveCfg = Release_STANDALONE_Mono|Any CPU
|
||||||
|
{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}.Release_STANDALONE_Mono|Any CPU.Build.0 = Release_STANDALONE_Mono|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
@ -24,6 +24,17 @@ namespace UnityExplorer.Unstrip
|
|||||||
|
|
||||||
return new AssetBundle(ptr);
|
return new AssetBundle(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private delegate IntPtr d_LoadFromMemory(IntPtr binary, uint crc);
|
||||||
|
|
||||||
|
public static AssetBundle LoadFromMemory(byte[] binary, uint crc = 0)
|
||||||
|
{
|
||||||
|
var iCall = ICallHelper.GetICall<d_LoadFromMemory>("UnityEngine.AssetBundle::LoadFromMemory_Internal");
|
||||||
|
|
||||||
|
var ptr = iCall(((Il2CppStructArray<byte>) binary).Pointer, crc);
|
||||||
|
|
||||||
|
return new AssetBundle(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
// ~~~~~~~~~~~~ Instance ~~~~~~~~~~~~
|
// ~~~~~~~~~~~~ Instance ~~~~~~~~~~~~
|
||||||
|
|
||||||
|
@ -10,6 +10,16 @@ namespace UnityExplorer.Unstrip
|
|||||||
{
|
{
|
||||||
public static class ImageConversionUnstrip
|
public static class ImageConversionUnstrip
|
||||||
{
|
{
|
||||||
|
// LoadImage helper from a filepath
|
||||||
|
|
||||||
|
public static bool LoadImage(Texture2D tex, string filePath, bool markNonReadable)
|
||||||
|
{
|
||||||
|
if (!File.Exists(filePath))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return tex.LoadImage(File.ReadAllBytes(filePath), markNonReadable);
|
||||||
|
}
|
||||||
|
|
||||||
#if CPP
|
#if CPP
|
||||||
// byte[] ImageConversion.EncodeToPNG(this Texture2D image);
|
// byte[] ImageConversion.EncodeToPNG(this Texture2D image);
|
||||||
|
|
||||||
@ -17,8 +27,12 @@ namespace UnityExplorer.Unstrip
|
|||||||
|
|
||||||
public static byte[] EncodeToPNG(this Texture2D tex)
|
public static byte[] EncodeToPNG(this Texture2D tex)
|
||||||
{
|
{
|
||||||
IntPtr ptr = ICallHelper.GetICall<d_EncodeToPNG>("UnityEngine.ImageConversion::EncodeToPNG")
|
var iCall = ICallHelper.GetICall<d_EncodeToPNG>("UnityEngine.ImageConversion::EncodeToPNG");
|
||||||
.Invoke(tex.Pointer);
|
|
||||||
|
IntPtr ptr = iCall.Invoke(tex.Pointer);
|
||||||
|
|
||||||
|
if (ptr == IntPtr.Zero)
|
||||||
|
return null;
|
||||||
|
|
||||||
return new Il2CppStructArray<byte>(ptr);
|
return new Il2CppStructArray<byte>(ptr);
|
||||||
}
|
}
|
||||||
@ -29,28 +43,40 @@ namespace UnityExplorer.Unstrip
|
|||||||
|
|
||||||
public static bool LoadImage(this Texture2D tex, byte[] data, bool markNonReadable)
|
public static bool LoadImage(this Texture2D tex, byte[] data, bool markNonReadable)
|
||||||
{
|
{
|
||||||
Il2CppStructArray<byte> il2cppArray = new Il2CppStructArray<byte>(data.Length);
|
var il2cppArray = (Il2CppStructArray<byte>)data;
|
||||||
for (int i = 0; i < data.Length; i++)
|
|
||||||
il2cppArray[i] = data[i];
|
|
||||||
|
|
||||||
bool ret = ICallHelper.GetICall<d_LoadImage>("UnityEngine.ImageConversion::LoadImage")
|
var iCall = ICallHelper.GetICall<d_LoadImage>("UnityEngine.ImageConversion::LoadImage");
|
||||||
.Invoke(tex.Pointer, il2cppArray.Pointer, markNonReadable);
|
|
||||||
|
return iCall.Invoke(tex.Pointer, il2cppArray.Pointer, markNonReadable);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
// Sprite Sprite.Create
|
||||||
|
|
||||||
|
internal delegate IntPtr d_CreateSprite(IntPtr texture, ref Rect rect, ref Vector2 pivot, float pixelsPerUnit,
|
||||||
|
uint extrude, int meshType, ref Vector4 border, bool generateFallbackPhysicsShape);
|
||||||
|
|
||||||
|
public static Sprite CreateSprite(Texture texture, Rect rect, Vector2 pivot, float pixelsPerUnit, uint extrude, Vector4 border)
|
||||||
|
{
|
||||||
|
var iCall = ICallHelper.GetICall<d_CreateSprite>("UnityEngine.Sprite::CreateSprite_Injected");
|
||||||
|
|
||||||
|
var ptr = iCall.Invoke(texture.Pointer, ref rect, ref pivot, pixelsPerUnit, extrude, 1, ref border, false);
|
||||||
|
|
||||||
|
if (ptr == IntPtr.Zero)
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return new Sprite(ptr);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Helper for LoadImage from filepath
|
// Simpler CreateSprite helper
|
||||||
|
|
||||||
public static bool LoadImage(Texture2D tex, string filePath, bool markNonReadable)
|
public static Sprite CreateSprite(Texture2D texture)
|
||||||
{
|
{
|
||||||
if (!File.Exists(filePath))
|
#if CPP
|
||||||
{
|
return CreateSprite(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero, 100f, 0u, Vector4.zero);
|
||||||
return false;
|
#else
|
||||||
}
|
return Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);
|
||||||
|
#endif
|
||||||
byte[] data = File.ReadAllBytes(filePath);
|
|
||||||
return tex.LoadImage(data, markNonReadable);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -3,36 +3,25 @@ using UnityExplorer.Helpers;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
using UnityExplorer.Inspectors;
|
using UnityExplorer.Inspectors;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
namespace UnityExplorer.Unstrip
|
namespace UnityExplorer.Unstrip
|
||||||
{
|
{
|
||||||
public class SceneUnstrip
|
public static class SceneUnstrip
|
||||||
{
|
{
|
||||||
#if MONO
|
#if MONO
|
||||||
public static GameObject[] GetRootGameObjects(Scene scene) => scene.GetRootGameObjects();
|
private static readonly FieldInfo fi_Scene_handle = typeof(Scene).GetField("m_Handle", ReflectionHelpers.CommonFlags);
|
||||||
|
|
||||||
//public static GameObject[] GetRootGameObjects(int handle)
|
|
||||||
//{
|
|
||||||
// Scene scene = default;
|
|
||||||
// if (handle == SceneExplorer.DontDestroyHandle)
|
|
||||||
// scene = SceneExplorer.DontDestroyObject.scene;
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// for (int i = 0; i < SceneManager.sceneCount; i++)
|
|
||||||
// {
|
|
||||||
// var iscene = SceneManager.GetSceneAt(i);
|
|
||||||
// if (iscene.handle == handle)
|
|
||||||
// scene = iscene;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if (scene != default && scene.handle != -1)
|
|
||||||
// return scene.GetRootGameObjects();
|
|
||||||
|
|
||||||
// return new GameObject[0];
|
|
||||||
//}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
public static int GetHandle(this Scene scene)
|
||||||
|
{
|
||||||
|
#if CPP
|
||||||
|
return scene.handle;
|
||||||
|
#else
|
||||||
|
return (int)fi_Scene_handle.GetValue(scene);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#if CPP
|
#if CPP
|
||||||
//Scene.GetRootGameObjects();
|
//Scene.GetRootGameObjects();
|
||||||
|
|
||||||
@ -43,13 +32,16 @@ namespace UnityExplorer.Unstrip
|
|||||||
public static GameObject[] GetRootGameObjects(int handle)
|
public static GameObject[] GetRootGameObjects(int handle)
|
||||||
{
|
{
|
||||||
if (handle == -1)
|
if (handle == -1)
|
||||||
{
|
|
||||||
return new GameObject[0];
|
return new GameObject[0];
|
||||||
}
|
|
||||||
|
|
||||||
Il2CppSystem.Collections.Generic.List<GameObject> list = new Il2CppSystem.Collections.Generic.List<GameObject>(GetRootCount(handle));
|
int count = GetRootCount(handle);
|
||||||
|
|
||||||
d_GetRootGameObjects iCall = ICallHelper.GetICall<d_GetRootGameObjects>("UnityEngine.SceneManagement.Scene::GetRootGameObjectsInternal");
|
if (count < 1)
|
||||||
|
return new GameObject[0];
|
||||||
|
|
||||||
|
var list = new Il2CppSystem.Collections.Generic.List<GameObject>(count);
|
||||||
|
|
||||||
|
var iCall = ICallHelper.GetICall<d_GetRootGameObjects>("UnityEngine.SceneManagement.Scene::GetRootGameObjectsInternal");
|
||||||
|
|
||||||
iCall.Invoke(handle, list.Pointer);
|
iCall.Invoke(handle, list.Pointer);
|
||||||
|
|
||||||
@ -58,14 +50,14 @@ namespace UnityExplorer.Unstrip
|
|||||||
|
|
||||||
//Scene.rootCount;
|
//Scene.rootCount;
|
||||||
|
|
||||||
internal delegate int GetRootCountInternal_delegate(int handle);
|
internal delegate int d_GetRootCountInternal(int handle);
|
||||||
|
|
||||||
public static int GetRootCount(Scene scene) => GetRootCount(scene.handle);
|
public static int GetRootCount(Scene scene) => GetRootCount(scene.handle);
|
||||||
|
|
||||||
public static int GetRootCount(int handle)
|
public static int GetRootCount(int handle)
|
||||||
{
|
{
|
||||||
GetRootCountInternal_delegate iCall = ICallHelper.GetICall<GetRootCountInternal_delegate>("UnityEngine.SceneManagement.Scene::GetRootCountInternal");
|
return ICallHelper.GetICall<d_GetRootCountInternal>("UnityEngine.SceneManagement.Scene::GetRootCountInternal")
|
||||||
return iCall.Invoke(handle);
|
.Invoke(handle);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user