mirror of
https://github.com/GrahamKracker/UnityExplorer.git
synced 2025-07-05 04:42:54 +08:00
Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
e7c5170232 | |||
be635e46a0 | |||
687f56eac9 | |||
1dfcdb2dca | |||
0025c83930 | |||
cfa4b12039 | |||
c7ccdf387c | |||
bb46d77a02 |
12
README.md
12
README.md
@ -64,7 +64,7 @@
|
||||
|
||||
## Mod Config
|
||||
|
||||
You can access the settings via the "Options" page of the main menu, or directly from the config at `Mods\UnityExplorer\config.xml` (generated after first launch).
|
||||
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).
|
||||
|
||||
`Main Menu Toggle` (KeyCode)
|
||||
* Default: `F7`
|
||||
@ -80,7 +80,7 @@ You can access the settings via the "Options" page of the main menu, or directly
|
||||
* <b>Requires a restart to take effect</b>, apart from Reflection Inspector tabs.
|
||||
|
||||
`Default Output Path` (string)
|
||||
* Default: `Mods\Explorer`
|
||||
* Default: `Mods\UnityExplorer`
|
||||
* Where output is generated to, by default (for Texture PNG saving, etc).
|
||||
* Currently this is not actually used for anything, but it will be soon.
|
||||
|
||||
@ -92,10 +92,10 @@ You can access the settings via the "Options" page of the main menu, or directly
|
||||
|
||||
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.
|
||||
|
||||
1. Install MelonLoader or BepInEx for your game.
|
||||
2. Open the `src\Explorer.csproj` file in a text editor.
|
||||
3. Set the relevant `GameFolder` values for the versions you want to build, eg. set `MLCppGameFolder` if you want to build for a MelonLoader IL2CPP game.
|
||||
4. Open the `src\Explorer.sln` project.
|
||||
1. Install BepInEx or MelonLoader for your game.
|
||||
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.
|
||||
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.
|
||||
5. The DLLs are built to the `Release\` folder in the root of the repository.
|
||||
6. If ILRepack fails or is missing, use the NuGet package manager to re-install `ILRepack.Lib.MSBuild.Task`, then re-build.
|
||||
|
BIN
lib/INIFileParser.dll
Normal file
BIN
lib/INIFileParser.dll
Normal file
Binary file not shown.
BIN
resources/Older Unity bundle/explorerui.bundle
Normal file
BIN
resources/Older Unity bundle/explorerui.bundle
Normal file
Binary file not shown.
Binary file not shown.
@ -1,18 +1,22 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Xml.Serialization;
|
||||
using UnityEngine;
|
||||
using IniParser;
|
||||
using IniParser.Parser;
|
||||
|
||||
namespace UnityExplorer.Config
|
||||
{
|
||||
public class ModConfig
|
||||
{
|
||||
[XmlIgnore] public static readonly XmlSerializer Serializer = new XmlSerializer(typeof(ModConfig));
|
||||
public static ModConfig Instance;
|
||||
|
||||
//[XmlIgnore] private const string EXPLORER_FOLDER = @"Mods\UnityExplorer";
|
||||
[XmlIgnore] private const string SETTINGS_PATH = ExplorerCore.EXPLORER_FOLDER + @"\config.xml";
|
||||
internal static readonly IniDataParser _parser = new IniDataParser();
|
||||
internal const string INI_PATH = ExplorerCore.EXPLORER_FOLDER + @"\config.ini";
|
||||
|
||||
[XmlIgnore] public static ModConfig Instance;
|
||||
static ModConfig()
|
||||
{
|
||||
_parser.Configuration.CommentString = "#";
|
||||
}
|
||||
|
||||
// Actual configs
|
||||
public KeyCode Main_Menu_Toggle = KeyCode.F7;
|
||||
@ -31,38 +35,66 @@ namespace UnityExplorer.Config
|
||||
|
||||
public static void OnLoad()
|
||||
{
|
||||
Instance = new ModConfig();
|
||||
|
||||
if (LoadSettings())
|
||||
return;
|
||||
|
||||
Instance = new ModConfig();
|
||||
SaveSettings();
|
||||
}
|
||||
|
||||
public static bool LoadSettings()
|
||||
{
|
||||
if (!File.Exists(SETTINGS_PATH))
|
||||
if (!File.Exists(INI_PATH))
|
||||
return false;
|
||||
|
||||
try
|
||||
string ini = File.ReadAllText(INI_PATH);
|
||||
|
||||
var data = _parser.Parse(ini);
|
||||
|
||||
foreach (var config in data.Sections["Config"])
|
||||
{
|
||||
using (var file = File.OpenRead(SETTINGS_PATH))
|
||||
Instance = (ModConfig)Serializer.Deserialize(file);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
switch (config.KeyName)
|
||||
{
|
||||
case "Main_Menu_Toggle":
|
||||
Instance.Main_Menu_Toggle = (KeyCode)Enum.Parse(typeof(KeyCode), config.Value);
|
||||
break;
|
||||
case "Force_Unlock_Mouse":
|
||||
Instance.Force_Unlock_Mouse = bool.Parse(config.Value);
|
||||
break;
|
||||
case "Default_Page_Limit":
|
||||
Instance.Default_Page_Limit = int.Parse(config.Value);
|
||||
break;
|
||||
case "Log_Unity_Debug":
|
||||
Instance.Log_Unity_Debug = bool.Parse(config.Value);
|
||||
break;
|
||||
case "Save_Logs_To_Disk":
|
||||
Instance.Save_Logs_To_Disk = bool.Parse(config.Value);
|
||||
break;
|
||||
case "Default_Output_Path":
|
||||
Instance.Default_Output_Path = config.Value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return Instance != null;
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void SaveSettings()
|
||||
{
|
||||
if (File.Exists(SETTINGS_PATH))
|
||||
File.Delete(SETTINGS_PATH);
|
||||
var data = new IniParser.Model.IniData();
|
||||
|
||||
using (var file = File.Create(SETTINGS_PATH))
|
||||
Serializer.Serialize(file, Instance);
|
||||
data.Sections.AddSection("Config");
|
||||
|
||||
var sec = data.Sections["Config"];
|
||||
sec.AddKey("Main_Menu_Toggle", Instance.Main_Menu_Toggle.ToString());
|
||||
sec.AddKey("Force_Unlock_Mouse", Instance.Force_Unlock_Mouse.ToString());
|
||||
sec.AddKey("Default_Page_Limit", Instance.Default_Page_Limit.ToString());
|
||||
sec.AddKey("Log_Unity_Debug", Instance.Log_Unity_Debug.ToString());
|
||||
sec.AddKey("Save_Logs_To_Disk", Instance.Save_Logs_To_Disk.ToString());
|
||||
sec.AddKey("Default_Output_Path", Instance.Default_Output_Path);
|
||||
|
||||
File.WriteAllText(INI_PATH, data.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,21 +1,22 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using UnityExplorer.Config;
|
||||
using UnityExplorer.Input;
|
||||
using UnityExplorer.Inspectors;
|
||||
using UnityExplorer.UI;
|
||||
using UnityExplorer.UI.Modules;
|
||||
using UnityEngine;
|
||||
using UnityExplorer.Inspectors;
|
||||
using System.IO;
|
||||
using UnityExplorer.Unstrip;
|
||||
using UnityEngine.SceneManagement;
|
||||
#if CPP
|
||||
using UnityExplorer.Helpers;
|
||||
#endif
|
||||
|
||||
namespace UnityExplorer
|
||||
{
|
||||
public class ExplorerCore
|
||||
{
|
||||
public const string NAME = "UnityExplorer";
|
||||
public const string VERSION = "3.0.2.1";
|
||||
public const string VERSION = "3.0.5";
|
||||
public const string AUTHOR = "Sinai";
|
||||
public const string GUID = "com.sinai.unityexplorer";
|
||||
public const string EXPLORER_FOLDER = @"Mods\UnityExplorer";
|
||||
|
@ -10,8 +10,7 @@ namespace UnityExplorer.Helpers
|
||||
{
|
||||
public static class Texture2DHelpers
|
||||
{
|
||||
#if CPP // If Mono
|
||||
#else
|
||||
#if MONO
|
||||
private static bool isNewEncodeMethod = false;
|
||||
private static MethodInfo EncodeToPNGMethod => m_encodeToPNGMethod ?? GetEncodeToPNGMethod();
|
||||
private static MethodInfo m_encodeToPNGMethod;
|
||||
@ -35,7 +34,6 @@ namespace UnityExplorer.Helpers
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
public static bool IsReadable(this Texture2D tex)
|
||||
{
|
||||
try
|
||||
@ -53,7 +51,7 @@ namespace UnityExplorer.Helpers
|
||||
}
|
||||
}
|
||||
|
||||
public static Texture2D Copy(Texture2D orig, Rect rect) //, bool isDTXnmNormal = false)
|
||||
public static Texture2D Copy(Texture2D orig, Rect rect)
|
||||
{
|
||||
Color[] pixels;
|
||||
|
||||
@ -68,6 +66,10 @@ namespace UnityExplorer.Helpers
|
||||
return _newTex;
|
||||
}
|
||||
|
||||
#if CPP
|
||||
internal delegate void d_Blit2(IntPtr source, IntPtr dest);
|
||||
#endif
|
||||
|
||||
public static Texture2D ForceReadTexture(Texture2D tex)
|
||||
{
|
||||
try
|
||||
@ -78,7 +80,13 @@ namespace UnityExplorer.Helpers
|
||||
var rt = RenderTexture.GetTemporary(tex.width, tex.height, 0, RenderTextureFormat.ARGB32);
|
||||
rt.filterMode = FilterMode.Point;
|
||||
RenderTexture.active = rt;
|
||||
|
||||
#if MONO
|
||||
Graphics.Blit(tex, rt);
|
||||
#else
|
||||
var iCall = ICallHelper.GetICall<d_Blit2>("UnityEngine.Graphics::Blit2");
|
||||
iCall.Invoke(tex.Pointer, rt.Pointer);
|
||||
#endif
|
||||
|
||||
var _newTex = new Texture2D(tex.width, tex.height, TextureFormat.ARGB32, false);
|
||||
|
||||
|
@ -5,6 +5,7 @@
|
||||
<ItemGroup>
|
||||
<InputAssemblies Include="$(OutputPath)$(AssemblyName).dll" />
|
||||
<InputAssemblies Include="..\lib\mcs.dll" />
|
||||
<InputAssemblies Include="..\lib\INIFileParser.dll" />
|
||||
</ItemGroup>
|
||||
|
||||
<ILRepack
|
||||
|
@ -140,7 +140,7 @@ namespace UnityExplorer.Inspectors.GameObjects
|
||||
{
|
||||
var vertGroupObj = UIFactory.CreateVerticalGroup(parent, new Color(1, 1, 1, 0));
|
||||
var vertGroup = vertGroupObj.GetComponent<VerticalLayoutGroup>();
|
||||
vertGroup.childForceExpandHeight = false;
|
||||
vertGroup.childForceExpandHeight = true;
|
||||
vertGroup.childForceExpandWidth = false;
|
||||
vertGroup.childControlWidth = true;
|
||||
vertGroup.spacing = 5;
|
||||
|
@ -136,7 +136,7 @@ namespace UnityExplorer.Inspectors.GameObjects
|
||||
{
|
||||
var vertGroupObj = UIFactory.CreateVerticalGroup(parent, new Color(1, 1, 1, 0));
|
||||
var vertGroup = vertGroupObj.GetComponent<VerticalLayoutGroup>();
|
||||
vertGroup.childForceExpandHeight = false;
|
||||
vertGroup.childForceExpandHeight = true;
|
||||
vertGroup.childForceExpandWidth = false;
|
||||
vertGroup.childControlWidth = true;
|
||||
vertGroup.spacing = 5;
|
||||
@ -157,6 +157,7 @@ namespace UnityExplorer.Inspectors.GameObjects
|
||||
var compScrollObj = UIFactory.CreateScrollView(vertGroupObj, out s_compListContent, out SliderScrollbar scroller, new Color(0.07f, 0.07f, 0.07f));
|
||||
var contentLayout = compScrollObj.AddComponent<LayoutElement>();
|
||||
contentLayout.minHeight = 50;
|
||||
contentLayout.flexibleHeight = 5000;
|
||||
|
||||
s_compListPageHandler = new PageHandler(scroller);
|
||||
s_compListPageHandler.ConstructUI(vertGroupObj);
|
||||
|
@ -164,7 +164,7 @@ namespace UnityExplorer.Inspectors
|
||||
m_layerDropdown.value = TargetGO.layer;
|
||||
}
|
||||
|
||||
if (m_lastScene != TargetGO.scene.name)
|
||||
if (string.IsNullOrEmpty(m_lastScene) || m_lastScene != TargetGO.scene.name)
|
||||
{
|
||||
m_lastScene = TargetGO.scene.name;
|
||||
|
||||
@ -217,10 +217,20 @@ namespace UnityExplorer.Inspectors
|
||||
|
||||
s_content = UIFactory.CreateScrollView(parent, out GameObject scrollContent, out _, new Color(0.1f, 0.1f, 0.1f));
|
||||
|
||||
var parentLayout = scrollContent.transform.parent.gameObject.AddComponent<VerticalLayoutGroup>();
|
||||
parentLayout.childForceExpandWidth = true;
|
||||
parentLayout.childControlWidth = true;
|
||||
parentLayout.childForceExpandHeight = true;
|
||||
parentLayout.childControlHeight = true;
|
||||
|
||||
var scrollGroup = scrollContent.GetComponent<VerticalLayoutGroup>();
|
||||
scrollGroup.childForceExpandHeight = true;
|
||||
scrollGroup.childControlHeight = true;
|
||||
scrollGroup.childForceExpandWidth = true;
|
||||
scrollGroup.childControlWidth = true;
|
||||
scrollGroup.spacing = 5;
|
||||
var contentFitter = scrollContent.GetComponent<ContentSizeFitter>();
|
||||
contentFitter.verticalFit = ContentSizeFitter.FitMode.Unconstrained;
|
||||
|
||||
ConstructTopArea(scrollContent);
|
||||
|
||||
@ -230,6 +240,9 @@ namespace UnityExplorer.Inspectors
|
||||
|
||||
s_childList.ConstructChildList(midGroupObj);
|
||||
s_compList.ConstructCompList(midGroupObj);
|
||||
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(s_content.GetComponent<RectTransform>());
|
||||
Canvas.ForceUpdateCanvases();
|
||||
}
|
||||
|
||||
private void ConstructTopArea(GameObject scrollContent)
|
||||
@ -431,11 +444,10 @@ namespace UnityExplorer.Inspectors
|
||||
midGroup.childControlWidth = true;
|
||||
midGroup.childForceExpandHeight = true;
|
||||
midGroup.childControlHeight = true;
|
||||
var midlayout = midGroupObj.AddComponent<LayoutElement>();
|
||||
midlayout.minHeight = 350;
|
||||
midlayout.flexibleHeight = 10000;
|
||||
midlayout.minWidth = 200;
|
||||
midlayout.flexibleWidth = 25000;
|
||||
|
||||
var midLayout = midGroupObj.AddComponent<LayoutElement>();
|
||||
midLayout.minHeight = 300;
|
||||
midLayout.flexibleHeight = 5000;
|
||||
|
||||
return midGroupObj;
|
||||
}
|
||||
|
@ -230,102 +230,35 @@ namespace UnityExplorer.Inspectors
|
||||
invisGroup.padding.right = 2;
|
||||
invisGroup.spacing = 10;
|
||||
|
||||
// // time scale group
|
||||
|
||||
// var timeGroupObj = UIFactory.CreateHorizontalGroup(invisObj, new Color(1, 1, 1, 0));
|
||||
// var timeGroup = timeGroupObj.GetComponent<HorizontalLayoutGroup>();
|
||||
// timeGroup.childForceExpandWidth = false;
|
||||
// timeGroup.childControlWidth = true;
|
||||
// timeGroup.childForceExpandHeight = false;
|
||||
// timeGroup.childControlHeight = true;
|
||||
// timeGroup.padding.top = 2;
|
||||
// timeGroup.padding.left = 5;
|
||||
// timeGroup.padding.right = 2;
|
||||
// timeGroup.padding.bottom = 2;
|
||||
// timeGroup.spacing = 5;
|
||||
// timeGroup.childAlignment = TextAnchor.MiddleCenter;
|
||||
// var timeGroupLayout = timeGroupObj.AddComponent<LayoutElement>();
|
||||
// timeGroupLayout.minWidth = 100;
|
||||
// timeGroupLayout.flexibleWidth = 300;
|
||||
// timeGroupLayout.minHeight = 25;
|
||||
// timeGroupLayout.flexibleHeight = 0;
|
||||
|
||||
// // time scale title
|
||||
|
||||
// var timeTitleObj = UIFactory.CreateLabel(timeGroupObj, TextAnchor.MiddleLeft);
|
||||
// var timeTitle = timeTitleObj.GetComponent<Text>();
|
||||
// timeTitle.text = "Time Scale:";
|
||||
// timeTitle.color = new Color(21f / 255f, 192f / 255f, 235f / 255f);
|
||||
// var titleLayout = timeTitleObj.AddComponent<LayoutElement>();
|
||||
// titleLayout.minHeight = 25;
|
||||
// titleLayout.minWidth = 80;
|
||||
// titleLayout.flexibleHeight = 0;
|
||||
// timeTitle.horizontalOverflow = HorizontalWrapMode.Overflow;
|
||||
|
||||
// // actual active time label
|
||||
|
||||
// var timeLabelObj = UIFactory.CreateLabel(timeGroupObj, TextAnchor.MiddleLeft);
|
||||
// var timeLabelLayout = timeLabelObj.AddComponent<LayoutElement>();
|
||||
// timeLabelLayout.minWidth = 40;
|
||||
// timeLabelLayout.minHeight = 25;
|
||||
// timeLabelLayout.flexibleHeight = 0;
|
||||
|
||||
// // todo make static and update
|
||||
// var s_timeText = timeLabelObj.GetComponent<Text>();
|
||||
// s_timeText.text = Time.timeScale.ToString("F1");
|
||||
|
||||
// // time scale input
|
||||
|
||||
// var timeInputObj = UIFactory.CreateInputField(timeGroupObj);
|
||||
// var timeInput = timeInputObj.GetComponent<InputField>();
|
||||
// timeInput.characterValidation = InputField.CharacterValidation.Decimal;
|
||||
// var timeInputLayout = timeInputObj.AddComponent<LayoutElement>();
|
||||
// timeInputLayout.minWidth = 90;
|
||||
// timeInputLayout.flexibleWidth = 0;
|
||||
// timeInputLayout.minHeight = 25;
|
||||
// timeInputLayout.flexibleHeight = 0;
|
||||
|
||||
// // time scale apply button
|
||||
|
||||
// var applyBtnObj = UIFactory.CreateButton(timeGroupObj);
|
||||
// var applyBtn = applyBtnObj.GetComponent<Button>();
|
||||
|
||||
// applyBtn.onClick.AddListener(SetTimeScale);
|
||||
|
||||
// var applyText = applyBtnObj.GetComponentInChildren<Text>();
|
||||
// applyText.text = "Apply";
|
||||
// applyText.fontSize = 14;
|
||||
// var applyLayout = applyBtnObj.AddComponent<LayoutElement>();
|
||||
// applyLayout.minWidth = 50;
|
||||
// applyLayout.minHeight = 25;
|
||||
// applyLayout.flexibleHeight = 0;
|
||||
|
||||
// void SetTimeScale()
|
||||
// {
|
||||
// var scale = float.Parse(timeInput.text);
|
||||
// Time.timeScale = scale;
|
||||
// s_timeText.text = Time.timeScale.ToString("F1");
|
||||
// }
|
||||
|
||||
|
||||
// inspect under mouse button
|
||||
AddMouseInspectButton(topRowObj, MouseInspector.MouseInspectMode.UI);
|
||||
AddMouseInspectButton(topRowObj, MouseInspector.MouseInspectMode.World);
|
||||
}
|
||||
|
||||
private static void AddMouseInspectButton(GameObject topRowObj, MouseInspector.MouseInspectMode mode)
|
||||
{
|
||||
var inspectObj = UIFactory.CreateButton(topRowObj);
|
||||
var inspectLayout = inspectObj.AddComponent<LayoutElement>();
|
||||
inspectLayout.minWidth = 120;
|
||||
inspectLayout.flexibleWidth = 0;
|
||||
|
||||
var inspectText = inspectObj.GetComponentInChildren<Text>();
|
||||
inspectText.text = "Mouse Inspect";
|
||||
inspectText.fontSize = 13;
|
||||
|
||||
if (mode == MouseInspector.MouseInspectMode.UI)
|
||||
inspectText.text += " (UI)";
|
||||
|
||||
var inspectBtn = inspectObj.GetComponent<Button>();
|
||||
var inspectColors = inspectBtn.colors;
|
||||
inspectColors.normalColor = new Color(0.2f, 0.2f, 0.2f);
|
||||
inspectBtn.colors = inspectColors;
|
||||
var inspectText = inspectObj.GetComponentInChildren<Text>();
|
||||
inspectText.text = "Mouse Inspect";
|
||||
inspectText.fontSize = 13;
|
||||
|
||||
inspectBtn.onClick.AddListener(OnInspectMouseClicked);
|
||||
|
||||
void OnInspectMouseClicked()
|
||||
{
|
||||
MouseInspector.Mode = mode;
|
||||
MouseInspector.StartInspect();
|
||||
}
|
||||
}
|
||||
|
@ -3,18 +3,27 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.UI;
|
||||
using UnityExplorer.Helpers;
|
||||
using UnityExplorer.Input;
|
||||
using UnityExplorer.UI;
|
||||
using UnityExplorer.Unstrip;
|
||||
|
||||
namespace UnityExplorer.Inspectors
|
||||
{
|
||||
public class MouseInspector
|
||||
{
|
||||
public enum MouseInspectMode
|
||||
{
|
||||
World,
|
||||
UI
|
||||
}
|
||||
|
||||
public static bool Enabled { get; set; }
|
||||
|
||||
//internal static Text s_objUnderMouseName;
|
||||
public static MouseInspectMode Mode { get; set; }
|
||||
|
||||
internal static Text s_objNameLabel;
|
||||
internal static Text s_objPathLabel;
|
||||
internal static Text s_mousePosLabel;
|
||||
@ -29,6 +38,18 @@ namespace UnityExplorer.Inspectors
|
||||
Enabled = true;
|
||||
MainMenu.Instance.MainPanel.SetActive(false);
|
||||
s_UIContent.SetActive(true);
|
||||
|
||||
// recache Graphic Raycasters each time we start
|
||||
var casters = ResourcesUnstrip.FindObjectsOfTypeAll(typeof(GraphicRaycaster));
|
||||
m_gCasters = new GraphicRaycaster[casters.Length];
|
||||
for (int i = 0; i < casters.Length; i++)
|
||||
{
|
||||
#if CPP
|
||||
m_gCasters[i] = casters[i].TryCast<GraphicRaycaster>();
|
||||
#else
|
||||
m_gCasters[i] = casters[i] as GraphicRaycaster;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void StopInspect()
|
||||
@ -40,49 +61,68 @@ namespace UnityExplorer.Inspectors
|
||||
ClearHitData();
|
||||
}
|
||||
|
||||
internal static GraphicRaycaster[] m_gCasters;
|
||||
|
||||
public static void UpdateInspect()
|
||||
{
|
||||
if (InputManager.GetKeyDown(KeyCode.Escape))
|
||||
{
|
||||
StopInspect();
|
||||
return;
|
||||
}
|
||||
|
||||
var mousePos = InputManager.MousePosition;
|
||||
|
||||
if (mousePos != s_lastMousePos)
|
||||
{
|
||||
s_lastMousePos = mousePos;
|
||||
|
||||
var inversePos = UIManager.CanvasRoot.transform.InverseTransformPoint(mousePos);
|
||||
|
||||
s_mousePosLabel.text = $"<color=grey>Mouse Position:</color> {((Vector2)InputManager.MousePosition).ToString()}";
|
||||
|
||||
float yFix = mousePos.y < 120 ? 80 : -80;
|
||||
|
||||
s_UIContent.transform.localPosition = new Vector3(inversePos.x, inversePos.y + yFix, 0);
|
||||
}
|
||||
UpdatePosition(mousePos);
|
||||
|
||||
if (!UnityHelpers.MainCamera)
|
||||
return;
|
||||
|
||||
// actual inspect raycast
|
||||
var ray = UnityHelpers.MainCamera.ScreenPointToRay(mousePos);
|
||||
|
||||
if (Physics.Raycast(ray, out RaycastHit hit, 1000f))
|
||||
switch (Mode)
|
||||
{
|
||||
var obj = hit.transform.gameObject;
|
||||
case MouseInspectMode.UI:
|
||||
RaycastUI(mousePos); break;
|
||||
case MouseInspectMode.World:
|
||||
RaycastWorld(mousePos); break;
|
||||
}
|
||||
}
|
||||
|
||||
if (obj != s_lastHit)
|
||||
{
|
||||
s_lastHit = obj;
|
||||
s_objNameLabel.text = $"<b>Click to Inspect:</b> <color=cyan>{obj.name}</color>";
|
||||
s_objPathLabel.text = $"Path: {obj.transform.GetTransformPath(true)}";
|
||||
}
|
||||
internal static void OnHitGameObject(GameObject obj)
|
||||
{
|
||||
if (obj != s_lastHit)
|
||||
{
|
||||
s_lastHit = obj;
|
||||
s_objNameLabel.text = $"<b>Click to Inspect:</b> <color=cyan>{obj.name}</color>";
|
||||
s_objPathLabel.text = $"Path: {obj.transform.GetTransformPath(true)}";
|
||||
}
|
||||
|
||||
if (InputManager.GetMouseButtonDown(0))
|
||||
if (InputManager.GetMouseButtonDown(0))
|
||||
{
|
||||
StopInspect();
|
||||
InspectorManager.Instance.Inspect(obj);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void RaycastWorld(Vector2 mousePos)
|
||||
{
|
||||
var ray = UnityHelpers.MainCamera.ScreenPointToRay(mousePos);
|
||||
var casts = Physics.RaycastAll(ray, 1000f);
|
||||
|
||||
if (casts.Length > 0)
|
||||
{
|
||||
foreach (var cast in casts)
|
||||
{
|
||||
StopInspect();
|
||||
InspectorManager.Instance.Inspect(obj);
|
||||
if (cast.transform)
|
||||
{
|
||||
var obj = cast.transform.gameObject;
|
||||
|
||||
OnHitGameObject(obj);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -92,6 +132,56 @@ namespace UnityExplorer.Inspectors
|
||||
}
|
||||
}
|
||||
|
||||
internal static void RaycastUI(Vector2 mousePos)
|
||||
{
|
||||
var ped = new PointerEventData(null)
|
||||
{
|
||||
position = mousePos
|
||||
};
|
||||
|
||||
#if MONO
|
||||
var list = new List<RaycastResult>();
|
||||
#else
|
||||
var list = new Il2CppSystem.Collections.Generic.List<RaycastResult>();
|
||||
#endif
|
||||
foreach (var gr in m_gCasters)
|
||||
{
|
||||
gr.Raycast(ped, list);
|
||||
|
||||
if (list.Count > 0)
|
||||
{
|
||||
foreach (var hit in list)
|
||||
{
|
||||
if (hit.gameObject)
|
||||
{
|
||||
var obj = hit.gameObject;
|
||||
|
||||
OnHitGameObject(obj);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (s_lastHit)
|
||||
ClearHitData();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static void UpdatePosition(Vector2 mousePos)
|
||||
{
|
||||
s_lastMousePos = mousePos;
|
||||
|
||||
var inversePos = UIManager.CanvasRoot.transform.InverseTransformPoint(mousePos);
|
||||
|
||||
s_mousePosLabel.text = $"<color=grey>Mouse Position:</color> {mousePos.ToString()}";
|
||||
|
||||
float yFix = mousePos.y < 120 ? 80 : -80;
|
||||
s_UIContent.transform.localPosition = new Vector3(inversePos.x, inversePos.y + yFix, 0);
|
||||
}
|
||||
|
||||
internal static void ClearHitData()
|
||||
{
|
||||
s_lastHit = null;
|
||||
@ -99,7 +189,7 @@ namespace UnityExplorer.Inspectors
|
||||
s_objPathLabel.text = "";
|
||||
}
|
||||
|
||||
#region UI Construction
|
||||
#region UI Construction
|
||||
|
||||
internal static void ConstructUI()
|
||||
{
|
||||
@ -112,7 +202,10 @@ namespace UnityExplorer.Inspectors
|
||||
baseRect.anchorMin = half;
|
||||
baseRect.anchorMax = half;
|
||||
baseRect.pivot = half;
|
||||
baseRect.sizeDelta = new Vector2(700, 100);
|
||||
baseRect.sizeDelta = new Vector2(700, 150);
|
||||
|
||||
var group = content.GetComponent<VerticalLayoutGroup>();
|
||||
group.childForceExpandHeight = true;
|
||||
|
||||
// Title text
|
||||
|
||||
@ -131,13 +224,16 @@ namespace UnityExplorer.Inspectors
|
||||
|
||||
var pathLabelObj = UIFactory.CreateLabel(content, TextAnchor.MiddleLeft);
|
||||
s_objPathLabel = pathLabelObj.GetComponent<Text>();
|
||||
s_objPathLabel.color = Color.grey;
|
||||
s_objPathLabel.fontStyle = FontStyle.Italic;
|
||||
s_objPathLabel.horizontalOverflow = HorizontalWrapMode.Overflow;
|
||||
s_objPathLabel.horizontalOverflow = HorizontalWrapMode.Wrap;
|
||||
|
||||
var pathLayout = pathLabelObj.AddComponent<LayoutElement>();
|
||||
pathLayout.minHeight = 75;
|
||||
pathLayout.flexibleHeight = 0;
|
||||
|
||||
s_UIContent.SetActive(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -37,14 +37,7 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
|
||||
if (m_subContentConstructed)
|
||||
{
|
||||
// changing types, destroy subcontent
|
||||
for (int i = 0; i < m_subContentParent.transform.childCount; i++)
|
||||
{
|
||||
var child = m_subContentParent.transform.GetChild(i);
|
||||
GameObject.Destroy(child.gameObject);
|
||||
}
|
||||
|
||||
m_subContentConstructed = false;
|
||||
DestroySubContent();
|
||||
}
|
||||
|
||||
if (!s_enumNamesCache.ContainsKey(type))
|
||||
@ -96,7 +89,10 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
private void SetValueFromDropdown()
|
||||
{
|
||||
var type = Value?.GetType() ?? FallbackType;
|
||||
var value = Enum.Parse(type, m_dropdownText.text);
|
||||
var index = m_dropdown.value;
|
||||
|
||||
var value = Enum.Parse(type, s_enumNamesCache[type][index].Value);
|
||||
|
||||
if (value != null)
|
||||
{
|
||||
Value = value;
|
||||
|
@ -14,8 +14,9 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
{
|
||||
public InteractiveString(object value, Type valueType) : base(value, valueType) { }
|
||||
|
||||
public override bool HasSubContent => false;
|
||||
public override bool SubContentWanted => false;
|
||||
public override bool HasSubContent => true;
|
||||
public override bool SubContentWanted => true;
|
||||
|
||||
public override bool WantInspectBtn => false;
|
||||
|
||||
public override void OnValueUpdated()
|
||||
@ -27,10 +28,9 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
{
|
||||
base.OnException(member);
|
||||
|
||||
if (m_hiddenObj.gameObject.activeSelf)
|
||||
if (m_subContentConstructed && m_hiddenObj.gameObject.activeSelf)
|
||||
m_hiddenObj.gameObject.SetActive(false);
|
||||
|
||||
// m_baseLabel.text = DefaultLabel;
|
||||
m_labelLayout.minWidth = 200;
|
||||
m_labelLayout.flexibleWidth = 5000;
|
||||
}
|
||||
@ -45,39 +45,62 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
return;
|
||||
}
|
||||
|
||||
if (!m_hiddenObj.gameObject.activeSelf)
|
||||
m_hiddenObj.gameObject.SetActive(true);
|
||||
|
||||
m_baseLabel.text = m_richValueType;
|
||||
|
||||
if (Value != null)
|
||||
if (m_subContentConstructed)
|
||||
{
|
||||
var toString = Value.ToString();
|
||||
if (!m_hiddenObj.gameObject.activeSelf)
|
||||
m_hiddenObj.gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty((string)Value))
|
||||
{
|
||||
var toString = (string)Value;
|
||||
if (toString.Length > 15000)
|
||||
toString = toString.Substring(0, 15000);
|
||||
|
||||
m_valueInput.text = toString;
|
||||
m_placeholderText.text = toString;
|
||||
m_readonlyInput.text = toString;
|
||||
|
||||
if (m_subContentConstructed)
|
||||
{
|
||||
m_valueInput.text = toString;
|
||||
m_placeholderText.text = toString;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_valueInput.text = "";
|
||||
m_placeholderText.text = "null";
|
||||
string s = Value == null
|
||||
? "null"
|
||||
: "empty";
|
||||
|
||||
m_readonlyInput.text = $"<i><color=grey>{s}</color></i>";
|
||||
|
||||
if (m_subContentConstructed)
|
||||
{
|
||||
m_valueInput.text = "";
|
||||
m_placeholderText.text = s;
|
||||
}
|
||||
}
|
||||
|
||||
m_labelLayout.minWidth = 50;
|
||||
m_labelLayout.flexibleWidth = 0;
|
||||
}
|
||||
|
||||
|
||||
internal void OnApplyClicked()
|
||||
{
|
||||
Value = m_valueInput.text;
|
||||
Owner.SetValue();
|
||||
RefreshUIForValue();
|
||||
}
|
||||
|
||||
internal InputField m_valueInput;
|
||||
// for the default label
|
||||
internal LayoutElement m_labelLayout;
|
||||
|
||||
//internal InputField m_readonlyInput;
|
||||
internal Text m_readonlyInput;
|
||||
|
||||
// for input
|
||||
internal InputField m_valueInput;
|
||||
internal GameObject m_hiddenObj;
|
||||
internal Text m_placeholderText;
|
||||
|
||||
@ -90,12 +113,38 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
|
||||
m_labelLayout = m_baseLabel.gameObject.GetComponent<LayoutElement>();
|
||||
|
||||
m_hiddenObj = UIFactory.CreateLabel(m_valueContent, TextAnchor.MiddleLeft);
|
||||
var readonlyInputObj = UIFactory.CreateLabel(m_valueContent, TextAnchor.MiddleLeft);
|
||||
m_readonlyInput = readonlyInputObj.GetComponent<Text>();
|
||||
m_readonlyInput.horizontalOverflow = HorizontalWrapMode.Overflow;
|
||||
|
||||
var testFitter = readonlyInputObj.AddComponent<ContentSizeFitter>();
|
||||
testFitter.verticalFit = ContentSizeFitter.FitMode.MinSize;
|
||||
|
||||
var labelLayout = readonlyInputObj.AddComponent<LayoutElement>();
|
||||
labelLayout.minHeight = 25;
|
||||
labelLayout.preferredHeight = 25;
|
||||
labelLayout.flexibleHeight = 0;
|
||||
}
|
||||
|
||||
public override void ConstructSubcontent()
|
||||
{
|
||||
base.ConstructSubcontent();
|
||||
|
||||
var groupObj = UIFactory.CreateVerticalGroup(m_subContentParent, new Color(1, 1, 1, 0));
|
||||
var group = groupObj.GetComponent<VerticalLayoutGroup>();
|
||||
group.spacing = 4;
|
||||
group.padding.top = 3;
|
||||
group.padding.left = 3;
|
||||
group.padding.right = 3;
|
||||
group.padding.bottom = 3;
|
||||
|
||||
m_hiddenObj = UIFactory.CreateLabel(groupObj, TextAnchor.MiddleLeft);
|
||||
m_hiddenObj.SetActive(false);
|
||||
var hiddenText = m_hiddenObj.GetComponent<Text>();
|
||||
hiddenText.color = Color.clear;
|
||||
hiddenText.fontSize = 14;
|
||||
hiddenText.raycastTarget = false;
|
||||
hiddenText.supportRichText = false;
|
||||
var hiddenFitter = m_hiddenObj.AddComponent<ContentSizeFitter>();
|
||||
hiddenFitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||
var hiddenLayout = m_hiddenObj.AddComponent<LayoutElement>();
|
||||
@ -121,19 +170,23 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
|
||||
m_placeholderText = m_valueInput.placeholder.GetComponent<Text>();
|
||||
|
||||
m_valueInput.onValueChanged.AddListener((string val) =>
|
||||
m_placeholderText.supportRichText = false;
|
||||
m_valueInput.textComponent.supportRichText = false;
|
||||
|
||||
m_valueInput.onValueChanged.AddListener((string val) =>
|
||||
{
|
||||
hiddenText.text = val;
|
||||
hiddenText.text = val ?? "";
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(Owner.m_mainRect);
|
||||
});
|
||||
|
||||
if (Owner.CanWrite)
|
||||
{
|
||||
var applyBtnObj = UIFactory.CreateButton(m_valueContent, new Color(0.2f, 0.2f, 0.2f));
|
||||
var applyBtnObj = UIFactory.CreateButton(groupObj, new Color(0.2f, 0.2f, 0.2f));
|
||||
var applyLayout = applyBtnObj.AddComponent<LayoutElement>();
|
||||
applyLayout.minWidth = 50;
|
||||
applyLayout.minHeight = 25;
|
||||
applyLayout.flexibleWidth = 0;
|
||||
|
||||
var applyBtn = applyBtnObj.GetComponent<Button>();
|
||||
applyBtn.onClick.AddListener(OnApplyClicked);
|
||||
|
||||
@ -144,6 +197,8 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
{
|
||||
m_valueInput.readOnly = true;
|
||||
}
|
||||
|
||||
RefreshUIForValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -226,14 +226,15 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
|
||||
if (StructInfo != null)
|
||||
{
|
||||
// changing types, destroy subcontent
|
||||
for (int i = 0; i < m_subContentParent.transform.childCount; i++)
|
||||
{
|
||||
var child = m_subContentParent.transform.GetChild(i);
|
||||
GameObject.Destroy(child.gameObject);
|
||||
}
|
||||
DestroySubContent();
|
||||
//// changing types, destroy subcontent
|
||||
//for (int i = 0; i < m_subContentParent.transform.childCount; i++)
|
||||
//{
|
||||
// var child = m_subContentParent.transform.GetChild(i);
|
||||
// GameObject.Destroy(child.gameObject);
|
||||
//}
|
||||
|
||||
m_UIConstructed = false;
|
||||
//m_UIConstructed = false;
|
||||
}
|
||||
|
||||
m_lastStructType = type;
|
||||
|
@ -78,7 +78,13 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
m_valueContent.SetActive(false);
|
||||
GameObject.Destroy(this.m_valueContent.gameObject);
|
||||
}
|
||||
if (this.m_subContentParent && SubContentWanted)
|
||||
|
||||
DestroySubContent();
|
||||
}
|
||||
|
||||
public virtual void DestroySubContent()
|
||||
{
|
||||
if (this.m_subContentParent && HasSubContent)
|
||||
{
|
||||
for (int i = 0; i < this.m_subContentParent.transform.childCount; i++)
|
||||
{
|
||||
@ -87,6 +93,8 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
GameObject.Destroy(child.gameObject);
|
||||
}
|
||||
}
|
||||
|
||||
m_subContentConstructed = false;
|
||||
}
|
||||
|
||||
public virtual void OnValueUpdated()
|
||||
@ -95,18 +103,16 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
ConstructUI(m_mainContentParent, m_subContentParent);
|
||||
|
||||
if (Owner is CacheMember ownerMember && !string.IsNullOrEmpty(ownerMember.ReflectionException))
|
||||
{
|
||||
OnException(ownerMember);
|
||||
}
|
||||
else
|
||||
{
|
||||
RefreshUIForValue();
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void OnException(CacheMember member)
|
||||
{
|
||||
m_baseLabel.text = "<color=red>" + member.ReflectionException + "</color>";
|
||||
if (m_UIConstructed)
|
||||
m_baseLabel.text = "<color=red>" + member.ReflectionException + "</color>";
|
||||
|
||||
Value = null;
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,12 @@ namespace UnityExplorer.Tests
|
||||
|
||||
public class TestClass
|
||||
{
|
||||
public string AAALongString = @"1
|
||||
2
|
||||
3
|
||||
4
|
||||
5";
|
||||
|
||||
public Vector2 AATestVector2 = new Vector2(1, 2);
|
||||
public Vector3 AATestVector3 = new Vector3(1, 2, 3);
|
||||
public Vector4 AATestVector4 = new Vector4(1, 2, 3, 4);
|
||||
|
@ -63,8 +63,6 @@ namespace UnityExplorer.UI
|
||||
throw new Exception("Could not find Type 'UnityEngine.Cursor'!");
|
||||
}
|
||||
|
||||
ExplorerCore.Log("setting up forceunlockcursor patches...");
|
||||
|
||||
// Get current cursor state and enable cursor
|
||||
try
|
||||
{
|
||||
|
@ -260,11 +260,8 @@ namespace UnityExplorer.UI.Modules
|
||||
|
||||
if (searchType == null)
|
||||
return;
|
||||
#if MONO
|
||||
|
||||
var allObjects = ResourcesUnstrip.FindObjectsOfTypeAll(searchType);
|
||||
#else
|
||||
var allObjects = ResourcesUnstrip.FindObjectsOfTypeAll(Il2CppType.From(searchType));
|
||||
#endif
|
||||
var results = new List<object>();
|
||||
|
||||
// perform filter comparers
|
||||
|
@ -178,13 +178,9 @@ namespace UnityExplorer.UI
|
||||
|
||||
Image image = groupObj.AddComponent<Image>();
|
||||
if (color != default)
|
||||
{
|
||||
image.color = color;
|
||||
}
|
||||
else
|
||||
{
|
||||
image.color = new Color(44f / 255f, 44f / 255f, 44f / 255f);
|
||||
}
|
||||
|
||||
return groupObj;
|
||||
}
|
||||
@ -657,16 +653,16 @@ namespace UnityExplorer.UI
|
||||
contentFitter.horizontalFit = ContentSizeFitter.FitMode.Unconstrained;
|
||||
contentFitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||
|
||||
var contentLayout = content.AddComponent<VerticalLayoutGroup>();
|
||||
contentLayout.childForceExpandHeight = true;
|
||||
contentLayout.childControlHeight = true;
|
||||
contentLayout.childForceExpandWidth = true;
|
||||
contentLayout.childControlWidth = true;
|
||||
contentLayout.padding.left = 5;
|
||||
contentLayout.padding.right = 5;
|
||||
contentLayout.padding.top = 5;
|
||||
contentLayout.padding.bottom = 5;
|
||||
contentLayout.spacing = 5;
|
||||
var contentGroup = content.AddComponent<VerticalLayoutGroup>();
|
||||
contentGroup.childForceExpandHeight = true;
|
||||
contentGroup.childControlHeight = true;
|
||||
contentGroup.childForceExpandWidth = true;
|
||||
contentGroup.childControlWidth = true;
|
||||
contentGroup.padding.left = 5;
|
||||
contentGroup.padding.right = 5;
|
||||
contentGroup.padding.top = 5;
|
||||
contentGroup.padding.bottom = 5;
|
||||
contentGroup.spacing = 5;
|
||||
|
||||
GameObject scrollBarObj = CreateUIObject("DynamicScrollbar", mainObj);
|
||||
|
||||
|
@ -4,7 +4,6 @@ using UnityEngine.UI;
|
||||
using UnityExplorer.Inspectors;
|
||||
using UnityExplorer.UI.Modules;
|
||||
using System.IO;
|
||||
//using TMPro;
|
||||
using System.Reflection;
|
||||
using UnityExplorer.Helpers;
|
||||
using UnityExplorer.UI.Shared;
|
||||
@ -20,9 +19,11 @@ namespace UnityExplorer.UI
|
||||
public static GameObject CanvasRoot { get; private set; }
|
||||
public static EventSystem EventSys { get; private set; }
|
||||
|
||||
internal static Sprite ResizeCursor { get; private set; }
|
||||
internal static Font ConsoleFont { get; private set; }
|
||||
|
||||
internal static Sprite ResizeCursor { get; private set; }
|
||||
internal static Shader BackupShader { get; private set; }
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
LoadBundle();
|
||||
@ -100,11 +101,13 @@ namespace UnityExplorer.UI
|
||||
{
|
||||
var bundle = AssetBundle.LoadFromFile(bundlePath);
|
||||
|
||||
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 = bundle.LoadAsset<Shader>("DefaultUI");
|
||||
Graphic.defaultGraphicMaterial.shader = BackupShader;
|
||||
}
|
||||
|
||||
ResizeCursor = bundle.LoadAsset<Sprite>("cursor");
|
||||
|
@ -25,17 +25,9 @@
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
<RootNamespace>UnityExplorer</RootNamespace>
|
||||
<!-- Set this to the BepInEx Il2Cpp Game folder, without the ending '\' character. -->
|
||||
<BIECppGameFolder>D:\Steam\steamapps\common\Outward_IL2CPP</BIECppGameFolder>
|
||||
<!-- Set this to the BepInEx Mono Game folder, without the ending '\' character. -->
|
||||
<BIEMonoGameFolder>D:\source\Unity Projects\Test\_BUILD_MONO</BIEMonoGameFolder>
|
||||
<!-- Set this to the BepInEx Mono Managed folder, without the ending '\' character. -->
|
||||
<BIEMonoManagedFolder>D:\source\Unity Projects\Test\_BUILD_MONO\Test_Data\Managed</BIEMonoManagedFolder>
|
||||
<BIECppGameFolder>D:\source\Unity Projects\Test\_BUILD</BIECppGameFolder>
|
||||
<!-- Set this to the MelonLoader Il2Cpp Game folder, without the ending '\' character. -->
|
||||
<MLCppGameFolder>D:\Steam\steamapps\common\VRChat</MLCppGameFolder>
|
||||
<!-- Set this to the MelonLoader Mono Game folder, without the ending '\' character. -->
|
||||
<MLMonoGameFolder>D:\source\Unity Projects\Test\_BUILD_MONO</MLMonoGameFolder>
|
||||
<!-- Set this to the MelonLoader Mono Managed folder, without the ending '\' character. -->
|
||||
<MLMonoManagedFolder>D:\source\Unity Projects\Test\_BUILD_MONO\Test_Data\Managed</MLMonoManagedFolder>
|
||||
<MLCppGameFolder>D:\source\Unity Projects\Test\_BUILD</MLCppGameFolder>
|
||||
<NuGetPackageImportStamp>
|
||||
</NuGetPackageImportStamp>
|
||||
</PropertyGroup>
|
||||
@ -77,6 +69,10 @@
|
||||
<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" />
|
||||
@ -103,7 +99,7 @@
|
||||
<!-- MelonLoader Mono refs -->
|
||||
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)'=='true|false'">
|
||||
<Reference Include="MelonLoader.ModHandler">
|
||||
<HintPath>$(MLMonoGameFolder)\MelonLoader\MelonLoader.ModHandler.dll</HintPath>
|
||||
<HintPath>..\lib\MelonLoader.ModHandler.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
|
@ -3,24 +3,27 @@ using Mono.CSharp;
|
||||
using UnityExplorer.Helpers;
|
||||
#if CPP
|
||||
using UnhollowerBaseLib;
|
||||
using UnhollowerRuntimeLib;
|
||||
#endif
|
||||
|
||||
namespace UnityExplorer.Unstrip
|
||||
{
|
||||
public class ResourcesUnstrip
|
||||
{
|
||||
public static UnityEngine.Object[] FindObjectsOfTypeAll(Type type)
|
||||
{
|
||||
#if MONO
|
||||
return UnityEngine.Resources.FindObjectsOfTypeAll(type);
|
||||
#else
|
||||
var iCall = ICallHelper.GetICall<d_FindObjectsOfTypeAll>("UnityEngine.Resources::FindObjectsOfTypeAll");
|
||||
var cppType = Il2CppType.From(type);
|
||||
|
||||
return new Il2CppReferenceArray<UnityEngine.Object>(iCall.Invoke(cppType.Pointer));
|
||||
#endif
|
||||
}
|
||||
|
||||
#if CPP
|
||||
internal delegate IntPtr d_FindObjectsOfTypeAll(IntPtr type);
|
||||
|
||||
public static UnityEngine.Object[] FindObjectsOfTypeAll(Il2CppSystem.Type type)
|
||||
{
|
||||
var iCall = ICallHelper.GetICall<d_FindObjectsOfTypeAll>("UnityEngine.Resources::FindObjectsOfTypeAll");
|
||||
|
||||
return new Il2CppReferenceArray<UnityEngine.Object>(iCall.Invoke(type.Pointer));
|
||||
}
|
||||
#else
|
||||
public static UnityEngine.Object[] FindObjectsOfTypeAll(Type type) => UnityEngine.Resources.FindObjectsOfTypeAll(type);
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="ILRepack.Lib.MSBuild.Task" version="2.0.18.1" targetFramework="net472" />
|
||||
<package id="ini-parser" version="2.5.2" targetFramework="net35" />
|
||||
</packages>
|
Reference in New Issue
Block a user