mirror of
https://github.com/sinai-dev/UnityExplorer.git
synced 2025-01-06 01:23:31 +08:00
Restoring Texture viewer/saver, and Static/Singleton class searching
This commit is contained in:
parent
6dfa4806ce
commit
28181e2266
@ -22,7 +22,7 @@ namespace UnityExplorer.Config
|
||||
public KeyCode Main_Menu_Toggle = KeyCode.F7;
|
||||
public bool Force_Unlock_Mouse = true;
|
||||
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 Save_Logs_To_Disk = true;
|
||||
|
||||
|
@ -16,7 +16,7 @@ namespace UnityExplorer
|
||||
public class ExplorerCore
|
||||
{
|
||||
public const string NAME = "UnityExplorer";
|
||||
public const string VERSION = "3.0.8";
|
||||
public const string VERSION = "3.1.0";
|
||||
public const string AUTHOR = "Sinai";
|
||||
public const string GUID = "com.sinai.unityexplorer";
|
||||
public const string EXPLORER_FOLDER = @"Mods\UnityExplorer";
|
||||
|
@ -4,6 +4,8 @@ using UnityEngine;
|
||||
using UnityExplorer.Helpers;
|
||||
using UnityExplorer.UI;
|
||||
using UnityEngine.UI;
|
||||
using UnityExplorer.Unstrip;
|
||||
using System.IO;
|
||||
|
||||
namespace UnityExplorer.Inspectors.Reflection
|
||||
{
|
||||
@ -70,8 +72,8 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
|
||||
// WIP
|
||||
|
||||
//if (m_targetType == typeof(Texture2D))
|
||||
// ConstructTextureHelper();
|
||||
if (m_targetType == typeof(Texture2D))
|
||||
ConstructTextureHelper();
|
||||
}
|
||||
|
||||
internal void ConstructCompHelper(GameObject rowObj)
|
||||
@ -136,94 +138,169 @@ namespace UnityExplorer.Inspectors.Reflection
|
||||
//btn.onClick.AddListener(() => { InspectorManager.Instance.Inspect(comp.gameObject); });
|
||||
}
|
||||
|
||||
//internal bool showingTextureHelper;
|
||||
//internal bool constructedTextureViewer;
|
||||
internal bool showingTextureHelper;
|
||||
internal bool constructedTextureViewer;
|
||||
|
||||
//internal void ConstructTextureHelper()
|
||||
//{
|
||||
// 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;
|
||||
internal GameObject m_textureViewerObj;
|
||||
|
||||
// var showBtnObj = UIFactory.CreateButton(rowObj, new Color(0.2f, 0.2f, 0.2f));
|
||||
// var showBtnLayout = showBtnObj.AddComponent<LayoutElement>();
|
||||
// showBtnLayout.minWidth = 50;
|
||||
// showBtnLayout.flexibleWidth = 0;
|
||||
// var showText = showBtnObj.GetComponentInChildren<Text>();
|
||||
// showText.text = "Show";
|
||||
// var showBtn = showBtnObj.GetComponent<Button>();
|
||||
internal void ConstructTextureHelper()
|
||||
{
|
||||
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 labelObj = UIFactory.CreateLabel(rowObj, TextAnchor.MiddleLeft);
|
||||
// var labelText = labelObj.GetComponent<Text>();
|
||||
// labelText.text = "Texture Viewer";
|
||||
var showBtnObj = UIFactory.CreateButton(rowObj, new Color(0.2f, 0.6f, 0.2f));
|
||||
var showBtnLayout = showBtnObj.AddComponent<LayoutElement>();
|
||||
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 viewerGroup = scrollContent.GetComponent<VerticalLayoutGroup>();
|
||||
// viewerGroup.childForceExpandHeight = false;
|
||||
// viewerGroup.childForceExpandWidth = false;
|
||||
// viewerGroup.childControlHeight = true;
|
||||
// viewerGroup.childControlWidth = true;
|
||||
// var mainLayout = textureViewerObj.GetComponent<LayoutElement>();
|
||||
// mainLayout.flexibleHeight = -1;
|
||||
// mainLayout.flexibleWidth = 2000;
|
||||
// mainLayout.minHeight = 25;
|
||||
var labelObj = UIFactory.CreateLabel(rowObj, TextAnchor.MiddleLeft);
|
||||
var labelText = labelObj.GetComponent<Text>();
|
||||
labelText.text = "Texture Viewer";
|
||||
|
||||
// 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(() =>
|
||||
// {
|
||||
// showingTextureHelper = !showingTextureHelper;
|
||||
textureViewerObj.SetActive(false);
|
||||
|
||||
// if (showingTextureHelper)
|
||||
// {
|
||||
// if (!constructedTextureViewer)
|
||||
// ConstructTextureViewerArea(scrollContent);
|
||||
m_textureViewerObj = textureViewerObj;
|
||||
|
||||
// showText.text = "Hide";
|
||||
// textureViewerObj.SetActive(true);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// showText.text = "Show";
|
||||
// textureViewerObj.SetActive(false);
|
||||
// }
|
||||
// });
|
||||
//}
|
||||
showBtn.onClick.AddListener(() =>
|
||||
{
|
||||
showingTextureHelper = !showingTextureHelper;
|
||||
|
||||
//internal void ConstructTextureViewerArea(GameObject parent)
|
||||
//{
|
||||
// constructedTextureViewer = true;
|
||||
if (showingTextureHelper)
|
||||
{
|
||||
if (!constructedTextureViewer)
|
||||
ConstructTextureViewerArea(scrollContent);
|
||||
|
||||
// var tex = Target as Texture2D;
|
||||
showText.text = "Hide";
|
||||
ToggleTextureViewer(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
showText.text = "Show";
|
||||
ToggleTextureViewer(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// if (!tex)
|
||||
// {
|
||||
// ExplorerCore.LogWarning("Could not cast the target instance to Texture2D!");
|
||||
// return;
|
||||
// }
|
||||
internal void ConstructTextureViewerArea(GameObject parent)
|
||||
{
|
||||
constructedTextureViewer = true;
|
||||
|
||||
// var imageObj = UIFactory.CreateUIObject("TextureViewerImage", parent, new Vector2(1, 1));
|
||||
// var image = imageObj.AddComponent<Image>();
|
||||
// var sprite = UIManager.CreateSprite(tex);
|
||||
// image.sprite = sprite;
|
||||
var tex = Target as Texture2D;
|
||||
#if CPP
|
||||
if (!tex)
|
||||
tex = (Target as Il2CppSystem.Object).TryCast<Texture2D>();
|
||||
#endif
|
||||
|
||||
// var fitter = imageObj.AddComponent<ContentSizeFitter>();
|
||||
// fitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||
// //fitter.horizontalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||
if (!tex)
|
||||
{
|
||||
ExplorerCore.LogWarning("Could not cast the target instance to Texture2D! Maybe its null or destroyed?");
|
||||
return;
|
||||
}
|
||||
|
||||
// var imageLayout = imageObj.AddComponent<LayoutElement>();
|
||||
// imageLayout.preferredHeight = sprite.rect.height;
|
||||
// imageLayout.preferredWidth = sprite.rect.width;
|
||||
//}
|
||||
// Save helper
|
||||
|
||||
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);
|
||||
|
||||
var data = tex.EncodeToPNG();
|
||||
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)
|
||||
{
|
||||
|
@ -363,6 +363,10 @@ namespace UnityExplorer.Inspectors
|
||||
|
||||
#region UI CONSTRUCTION
|
||||
|
||||
internal GameObject m_filterAreaObj;
|
||||
internal GameObject m_updateRowObj;
|
||||
internal GameObject m_memberListObj;
|
||||
|
||||
internal void ConstructUI()
|
||||
{
|
||||
var parent = InspectorManager.Instance.m_inspectorContent;
|
||||
@ -423,7 +427,7 @@ namespace UnityExplorer.Inspectors
|
||||
|
||||
ConstructFilterArea();
|
||||
|
||||
ConstructOptionsArea();
|
||||
ConstructUpdateRow();
|
||||
}
|
||||
|
||||
internal void ConstructFilterArea()
|
||||
@ -444,6 +448,8 @@ namespace UnityExplorer.Inspectors
|
||||
filterGroup.padding.top = 4;
|
||||
filterGroup.padding.bottom = 4;
|
||||
|
||||
m_filterAreaObj = filterAreaObj;
|
||||
|
||||
// name filter
|
||||
|
||||
var nameFilterRowObj = UIFactory.CreateHorizontalGroup(filterAreaObj, new Color(1, 1, 1, 0));
|
||||
@ -540,7 +546,7 @@ namespace UnityExplorer.Inspectors
|
||||
btn.colors = colors;
|
||||
}
|
||||
|
||||
internal void ConstructOptionsArea()
|
||||
internal void ConstructUpdateRow()
|
||||
{
|
||||
var optionsRowObj = UIFactory.CreateHorizontalGroup(Content, new Color(1, 1, 1, 0));
|
||||
var optionsLayout = optionsRowObj.AddComponent<LayoutElement>();
|
||||
@ -551,6 +557,8 @@ namespace UnityExplorer.Inspectors
|
||||
optionsGroup.childAlignment = TextAnchor.MiddleLeft;
|
||||
optionsGroup.spacing = 10;
|
||||
|
||||
m_updateRowObj = optionsRowObj;
|
||||
|
||||
// update button
|
||||
|
||||
var updateButtonObj = UIFactory.CreateButton(optionsRowObj, new Color(0.2f, 0.2f, 0.2f));
|
||||
@ -578,11 +586,12 @@ namespace UnityExplorer.Inspectors
|
||||
autoUpdateToggle.isOn = false;
|
||||
autoUpdateToggle.onValueChanged.AddListener((bool val) => { m_autoUpdate = val; });
|
||||
}
|
||||
|
||||
|
||||
internal void ConstructMemberList()
|
||||
{
|
||||
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>();
|
||||
|
||||
var scrollGroup = m_scrollContent.GetComponent<VerticalLayoutGroup>();
|
||||
|
@ -5,6 +5,7 @@ using UnityEngine;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using UnityExplorer.Unstrip;
|
||||
#if CPP
|
||||
using UnhollowerBaseLib;
|
||||
using UnityExplorer.Helpers;
|
||||
@ -121,15 +122,15 @@ namespace UnityExplorer.Tests
|
||||
private static bool m_setOnlyProperty;
|
||||
public static bool ReadSetOnlyProperty => m_setOnlyProperty;
|
||||
|
||||
public Texture TestTexture;
|
||||
public Texture2D TestTexture;
|
||||
public static Sprite TestSprite;
|
||||
|
||||
#if CPP
|
||||
public static Il2CppSystem.Collections.Generic.HashSet<string> CppHashSetTest;
|
||||
public static Il2CppSystem.Collections.Generic.List<string> CppStringTest;
|
||||
public static Il2CppSystem.Collections.IList CppIList;
|
||||
public static Il2CppSystem.Collections.Generic.Dictionary<string, string> CppDictTest;
|
||||
public static Il2CppSystem.Collections.Generic.Dictionary<int, float> CppDictTest2;
|
||||
//public static Il2CppSystem.Collections.Generic.Dictionary<string, string> CppDictTest;
|
||||
//public static Il2CppSystem.Collections.Generic.Dictionary<int, float> CppDictTest2;
|
||||
#endif
|
||||
|
||||
public TestClass()
|
||||
@ -156,35 +157,35 @@ namespace UnityExplorer.Tests
|
||||
CppStringTest.Add("1");
|
||||
CppStringTest.Add("2");
|
||||
|
||||
CppDictTest = new Il2CppSystem.Collections.Generic.Dictionary<string, string>();
|
||||
CppDictTest.Add("key1", "value1");
|
||||
CppDictTest.Add("key2", "value2");
|
||||
CppDictTest.Add("key3", "value3");
|
||||
//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);
|
||||
//CppDictTest2 = new Il2CppSystem.Collections.Generic.Dictionary<int, float>();
|
||||
//CppDictTest2.Add(0, 0.5f);
|
||||
//CppDictTest2.Add(1, 0.5f);
|
||||
//CppDictTest2.Add(2, 0.5f);
|
||||
#endif
|
||||
}
|
||||
|
||||
private void TextureSpriteTest()
|
||||
{
|
||||
//TestTexture = UIManager.MakeSolidTexture(Color.white, 1000, 600);
|
||||
//TestTexture = new Texture();
|
||||
//TestTexture.name = "TestTexture";
|
||||
TestTexture = new Texture2D(32, 32, TextureFormat.ARGB32, false)
|
||||
{
|
||||
name = "TestTexture"
|
||||
};
|
||||
TestSprite = ImageConversionUnstrip.CreateSprite(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);
|
||||
|
||||
//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)}");
|
||||
// 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
|
||||
|
@ -9,6 +9,7 @@ using UnityExplorer.Helpers;
|
||||
using UnityExplorer.Inspectors;
|
||||
using UnityExplorer.UI.Shared;
|
||||
using UnityExplorer.Unstrip;
|
||||
using System.Reflection;
|
||||
#if CPP
|
||||
using UnhollowerRuntimeLib;
|
||||
#endif
|
||||
@ -21,7 +22,7 @@ namespace UnityExplorer.UI.Modules
|
||||
GameObject,
|
||||
Component,
|
||||
Custom,
|
||||
Instance,
|
||||
Singleton,
|
||||
StaticClass
|
||||
}
|
||||
|
||||
@ -46,11 +47,16 @@ namespace UnityExplorer.UI.Modules
|
||||
|
||||
public static SearchPage Instance;
|
||||
|
||||
internal SearchContext m_context;
|
||||
private SceneFilter m_sceneFilter;
|
||||
private ChildFilter m_childFilter;
|
||||
|
||||
internal bool m_isStaticClassSearching;
|
||||
|
||||
// ui elements
|
||||
|
||||
private Text m_resultCountText;
|
||||
|
||||
internal SearchContext m_context;
|
||||
private InputField m_customTypeInput;
|
||||
|
||||
private InputField m_nameInput;
|
||||
@ -60,9 +66,6 @@ namespace UnityExplorer.UI.Modules
|
||||
|
||||
private Dropdown m_sceneDropdown;
|
||||
private int m_lastSceneCount = -1;
|
||||
private SceneFilter m_sceneFilter;
|
||||
|
||||
private ChildFilter m_childFilter;
|
||||
|
||||
private GameObject m_extraFilterRow;
|
||||
|
||||
@ -132,10 +135,9 @@ namespace UnityExplorer.UI.Modules
|
||||
else
|
||||
{
|
||||
var obj = m_results[itemIndex];
|
||||
var unityObj = obj as UnityEngine.Object;
|
||||
|
||||
var uObj = obj as UnityEngine.Object;
|
||||
|
||||
if (obj == null || (uObj != null && !uObj))
|
||||
if (obj == null || (unityObj != null && !unityObj))
|
||||
continue;
|
||||
|
||||
if (i >= m_resultShortList.Count)
|
||||
@ -150,17 +152,25 @@ namespace UnityExplorer.UI.Modules
|
||||
|
||||
var text = m_resultListTexts[i];
|
||||
|
||||
var name = $"<color={UISyntaxHighlight.Class_Instance}>{ReflectionHelpers.GetActualType(obj).Name}</color>";
|
||||
|
||||
if (m_context != SearchContext.Instance && m_context != SearchContext.StaticClass)
|
||||
if (m_context != SearchContext.StaticClass)
|
||||
{
|
||||
if (uObj && !string.IsNullOrEmpty(uObj.name))
|
||||
name += $": {uObj.name}";
|
||||
else
|
||||
name += ": <i><color=grey>untitled</color></i>";
|
||||
}
|
||||
var name = UISyntaxHighlight.ParseFullSyntax(obj.GetActualType(), true);
|
||||
|
||||
text.text = name;
|
||||
if (unityObj && m_context != SearchContext.Singleton && m_context != SearchContext.StaticClass)
|
||||
{
|
||||
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;
|
||||
if (!label.activeSelf)
|
||||
@ -226,10 +236,102 @@ namespace UnityExplorer.UI.Modules
|
||||
|
||||
// ~~~~~ UI Callbacks ~~~~~
|
||||
|
||||
internal void OnUnitySearchClicked()
|
||||
internal void OnSearchClicked()
|
||||
{
|
||||
m_resultListPageHandler.CurrentPage = 0;
|
||||
|
||||
if (m_context == SearchContext.StaticClass)
|
||||
StaticClassSearch();
|
||||
else if (m_context == SearchContext.Singleton)
|
||||
SingletonSearch();
|
||||
else
|
||||
UnityObjectSearch();
|
||||
|
||||
RefreshResultList();
|
||||
}
|
||||
|
||||
internal void StaticClassSearch()
|
||||
{
|
||||
m_isStaticClassSearching = true;
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
private void SingletonSearch()
|
||||
{
|
||||
m_isStaticClassSearching = false;
|
||||
|
||||
var instances = new List<object>();
|
||||
|
||||
var nameFilter = "";
|
||||
if (!string.IsNullOrEmpty(m_nameInput.text))
|
||||
nameFilter = m_nameInput.text.ToLower();
|
||||
|
||||
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
|
||||
{
|
||||
// All non-static classes
|
||||
foreach (var type in asm.TryGetTypes().Where(it => !it.IsSealed && !it.IsAbstract))
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(nameFilter) && !type.FullName.ToLower().Contains(nameFilter))
|
||||
continue;
|
||||
|
||||
// First look for an "Instance" Property
|
||||
if (type.GetProperty("Instance", ReflectionHelpers.CommonFlags) is PropertyInfo pi
|
||||
&& pi.CanRead
|
||||
&& pi.GetGetMethod(true).IsStatic)
|
||||
{
|
||||
var instance = pi.GetValue(null, null);
|
||||
if (instance != null)
|
||||
instances.Add(instance);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Otherwise, look for a typical Instance backing field.
|
||||
FieldInfo fi;
|
||||
fi = type.GetField("m_instance", ReflectionHelpers.CommonFlags);
|
||||
if (fi == null)
|
||||
fi = type.GetField("s_instance", ReflectionHelpers.CommonFlags);
|
||||
if (fi == null)
|
||||
fi = type.GetField("_instance", ReflectionHelpers.CommonFlags);
|
||||
if (fi == null)
|
||||
fi = type.GetField("instance", ReflectionHelpers.CommonFlags);
|
||||
|
||||
if (fi != null && fi.IsStatic)
|
||||
{
|
||||
var instance = fi.GetValue(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
|
||||
m_results = instances.ToArray();
|
||||
}
|
||||
|
||||
internal void UnityObjectSearch()
|
||||
{
|
||||
m_isStaticClassSearching = false;
|
||||
|
||||
Type searchType = null;
|
||||
switch (m_context)
|
||||
{
|
||||
@ -305,12 +407,12 @@ namespace UnityExplorer.UI.Modules
|
||||
: obj.TryCast<Component>().gameObject;
|
||||
#endif
|
||||
|
||||
if (!go)
|
||||
continue;
|
||||
|
||||
// scene check
|
||||
if (m_sceneFilter != SceneFilter.Any)
|
||||
{
|
||||
if (!go)
|
||||
continue;
|
||||
|
||||
switch (m_context)
|
||||
{
|
||||
case SearchContext.GameObject:
|
||||
@ -325,11 +427,17 @@ namespace UnityExplorer.UI.Modules
|
||||
}
|
||||
}
|
||||
|
||||
// root object check (no parent)
|
||||
if (m_childFilter == ChildFilter.HasParent && !go.transform.parent)
|
||||
continue;
|
||||
else if (m_childFilter == ChildFilter.RootObject && go.transform.parent)
|
||||
continue;
|
||||
if (m_childFilter != ChildFilter.Any)
|
||||
{
|
||||
if (!go)
|
||||
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);
|
||||
@ -341,8 +449,6 @@ namespace UnityExplorer.UI.Modules
|
||||
m_resultCountText.text = $"{m_results.Length} Results";
|
||||
else
|
||||
m_resultCountText.text = "No results...";
|
||||
|
||||
RefreshResultList();
|
||||
}
|
||||
|
||||
private void OnResultPageTurn()
|
||||
@ -490,6 +596,23 @@ namespace UnityExplorer.UI.Modules
|
||||
m_customTypeInput = customTypeObj.GetComponent<InputField>();
|
||||
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
|
||||
|
||||
var nameRowObj = UIFactory.CreateHorizontalGroup(optionsGroupObj, new Color(1, 1, 1, 0));
|
||||
@ -601,7 +724,7 @@ namespace UnityExplorer.UI.Modules
|
||||
searchBtnLayout.flexibleHeight = 0;
|
||||
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)
|
||||
|
@ -43,14 +43,11 @@ namespace UnityExplorer.Unstrip
|
||||
|
||||
public static bool LoadImage(this Texture2D tex, byte[] data, bool markNonReadable)
|
||||
{
|
||||
Il2CppStructArray<byte> il2cppArray = new Il2CppStructArray<byte>(data.Length);
|
||||
for (int i = 0; i < data.Length; i++)
|
||||
il2cppArray[i] = data[i];
|
||||
var il2cppArray = (Il2CppStructArray<byte>)data;
|
||||
|
||||
bool ret = ICallHelper.GetICall<d_LoadImage>("UnityEngine.ImageConversion::LoadImage")
|
||||
.Invoke(tex.Pointer, il2cppArray.Pointer, markNonReadable);
|
||||
|
||||
return ret;
|
||||
var iCall = ICallHelper.GetICall<d_LoadImage>("UnityEngine.ImageConversion::LoadImage");
|
||||
|
||||
return iCall.Invoke(tex.Pointer, il2cppArray.Pointer, markNonReadable);
|
||||
}
|
||||
|
||||
// Sprite Sprite.Create
|
||||
@ -70,5 +67,16 @@ namespace UnityExplorer.Unstrip
|
||||
return new Sprite(ptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Simpler CreateSprite helper
|
||||
|
||||
public static Sprite CreateSprite(Texture2D texture)
|
||||
{
|
||||
#if CPP
|
||||
return CreateSprite(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero, 100f, 0u, Vector4.zero);
|
||||
#else
|
||||
return Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user