mirror of
https://github.com/sinai-dev/UnityExplorer.git
synced 2025-06-16 06:08:16 +08:00
3.1.7
* Added standalone release build (thanks @Alloc86) * Improved formatting for ToString methods which accept an IFormatProvider * When editing a struct, the reference to the parent member will now be updated if you modify the struct values.
This commit is contained in:
parent
fdfaaadd89
commit
544009dc21
@ -1,5 +1,6 @@
|
|||||||
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;
|
||||||
@ -16,7 +17,7 @@ namespace UnityExplorer
|
|||||||
public class ExplorerCore
|
public class ExplorerCore
|
||||||
{
|
{
|
||||||
public const string NAME = "UnityExplorer";
|
public const string NAME = "UnityExplorer";
|
||||||
public const string VERSION = "3.1.6";
|
public const string VERSION = "3.1.7";
|
||||||
public const string AUTHOR = "Sinai";
|
public const string AUTHOR = "Sinai";
|
||||||
public const string GUID = "com.sinai.unityexplorer";
|
public const string GUID = "com.sinai.unityexplorer";
|
||||||
|
|
||||||
@ -24,6 +25,22 @@ namespace UnityExplorer
|
|||||||
public const string EXPLORER_FOLDER = @"Mods\UnityExplorer";
|
public const string EXPLORER_FOLDER = @"Mods\UnityExplorer";
|
||||||
#elif BIE
|
#elif BIE
|
||||||
public static string EXPLORER_FOLDER = Path.Combine(BepInEx.Paths.ConfigPath, "UnityExplorer");
|
public static string EXPLORER_FOLDER = Path.Combine(BepInEx.Paths.ConfigPath, "UnityExplorer");
|
||||||
|
#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
|
#endif
|
||||||
|
|
||||||
public static ExplorerCore Instance { get; private set; }
|
public static ExplorerCore Instance { get; private set; }
|
||||||
@ -166,6 +183,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());
|
||||||
@ -175,8 +198,10 @@ namespace UnityExplorer
|
|||||||
|
|
||||||
#if ML
|
#if ML
|
||||||
MelonLoader.MelonLogger.Log(message?.ToString());
|
MelonLoader.MelonLogger.Log(message?.ToString());
|
||||||
#else
|
#elif BIE
|
||||||
ExplorerBepInPlugin.Logging?.LogMessage(message?.ToString());
|
ExplorerBepInPlugin.Logging?.LogMessage(message?.ToString());
|
||||||
|
#elif STANDALONE
|
||||||
|
OnLogMessage?.Invoke(message?.ToString());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,8 +214,10 @@ namespace UnityExplorer
|
|||||||
|
|
||||||
#if ML
|
#if ML
|
||||||
MelonLoader.MelonLogger.LogWarning(message?.ToString());
|
MelonLoader.MelonLogger.LogWarning(message?.ToString());
|
||||||
#else
|
#elif BIE
|
||||||
ExplorerBepInPlugin.Logging?.LogWarning(message?.ToString());
|
ExplorerBepInPlugin.Logging?.LogWarning(message?.ToString());
|
||||||
|
#elif STANDALONE
|
||||||
|
OnLogWarning?.Invoke(message?.ToString());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -203,8 +230,10 @@ namespace UnityExplorer
|
|||||||
|
|
||||||
#if ML
|
#if ML
|
||||||
MelonLoader.MelonLogger.LogError(message?.ToString());
|
MelonLoader.MelonLogger.LogError(message?.ToString());
|
||||||
#else
|
#elif BIE
|
||||||
ExplorerBepInPlugin.Logging?.LogError(message?.ToString());
|
ExplorerBepInPlugin.Logging?.LogError(message?.ToString());
|
||||||
|
#elif STANDALONE
|
||||||
|
OnLogError?.Invoke(message?.ToString());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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; }
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,33 @@ 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 +332,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);
|
||||||
|
@ -58,6 +58,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;
|
||||||
|
|
||||||
@ -202,6 +204,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)
|
||||||
{
|
{
|
||||||
|
@ -105,8 +105,10 @@ namespace UnityExplorer.UI
|
|||||||
var harmony =
|
var harmony =
|
||||||
#if ML
|
#if ML
|
||||||
ExplorerMelonMod.Instance.harmonyInstance;
|
ExplorerMelonMod.Instance.harmonyInstance;
|
||||||
#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);
|
||||||
|
@ -68,6 +68,24 @@
|
|||||||
<IsMelonLoader>false</IsMelonLoader>
|
<IsMelonLoader>false</IsMelonLoader>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
</PropertyGroup>
|
</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>
|
||||||
|
<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>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="INIFileParser, Version=2.5.2.0, Culture=neutral, PublicKeyToken=79af7b307b65cf3c, processorArchitecture=MSIL">
|
<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>
|
<HintPath>packages\ini-parser.2.5.2\lib\net20\INIFileParser.dll</HintPath>
|
||||||
@ -217,6 +235,7 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="ExplorerStandalone.cs" />
|
||||||
<Compile Include="Helpers\EventHelper.cs" />
|
<Compile Include="Helpers\EventHelper.cs" />
|
||||||
<Compile Include="Inspectors\MouseInspector.cs" />
|
<Compile Include="Inspectors\MouseInspector.cs" />
|
||||||
<Compile Include="Inspectors\Reflection\CacheObject\CacheEnumerated.cs" />
|
<Compile Include="Inspectors\Reflection\CacheObject\CacheEnumerated.cs" />
|
||||||
|
@ -11,6 +11,8 @@ Global
|
|||||||
Release_BIE_Mono|Any CPU = Release_BIE_Mono|Any CPU
|
Release_BIE_Mono|Any CPU = Release_BIE_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
|
||||||
@ -21,6 +23,10 @@ Global
|
|||||||
{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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user