Skip to content

Instantly share code, notes, and snippets.

@glcoder
Created January 15, 2024 22:51
Show Gist options
  • Save glcoder/2dfeb3b96461c947518ce8879e1ed742 to your computer and use it in GitHub Desktop.
Save glcoder/2dfeb3b96461c947518ce8879e1ed742 to your computer and use it in GitHub Desktop.
Unity Auto Splitter FindComponentByName helper method (asl-help is used).
Func<IntPtr, string, IntPtr> GameObjectFindComponentByName = null; // for recursive call
GameObjectFindComponentByName = (ManagedGameObjectPtr, ComponentName) =>
{
if (ManagedGameObjectPtr == IntPtr.Zero)
return IntPtr.Zero;
var NativeGameObjectPtr = vars.Helper.Read<IntPtr>(ManagedGameObjectPtr + 0x10 /* ManagedGameObject.m_CachedPtr */);
if (NativeGameObjectPtr == IntPtr.Zero)
return IntPtr.Zero;
var NativeGameObjectName = vars.Helper.ReadString(256, ReadStringType.AutoDetect, NativeGameObjectPtr + 0x60 /* GameObject.m_Name */ + 0x0 /* ConstantString.m_Buffer */, 0x0 /* char* */);
if (string.IsNullOrEmpty(NativeGameObjectName))
return IntPtr.Zero;
var NativeComponentsCount = vars.Helper.Read<int>(NativeGameObjectPtr + 0x30 /* GameObject.m_Component */ + 0x10 /* dynamic_array.m_size */);
if (NativeComponentsCount == 0)
return IntPtr.Zero;
var RootTransformPtr = vars.Helper.Read<IntPtr>(NativeGameObjectPtr + 0x30 /* GameObject.m_Component */, 0x8 /* ComponentPair.component */); // First component is GameObject's root Transform
var RootTransformChildCount = vars.Helper.Read<int>(RootTransformPtr + 0x70 /* Transform.m_Children */ + 0x10 /* dynamic_array.m_size */);
for (int i = 0; i < RootTransformChildCount; ++i)
{
var NativeChildTransformPtr = vars.Helper.Read<IntPtr>(RootTransformPtr + 0x70 /* Transform.m_Children */, i * 0x8 /* ImmediatePtr */);
var NativeChildGameObjectPtr = vars.Helper.Read<IntPtr>(NativeChildTransformPtr + 0x30 /* Unity::Component.m_GameObject */);
var ManagedChildGameObjectPtr = vars.Helper.Read<IntPtr>(NativeChildGameObjectPtr + 0x18 /* Object.m_MonoReference */ + 0x10 /* ScriptingGCHandle.m_Object */);
var ManagedComponentPtr = GameObjectFindComponentByName(ManagedChildGameObjectPtr, ComponentName);
if (ManagedComponentPtr != IntPtr.Zero)
return ManagedComponentPtr;
}
for (int i = 0; i < NativeComponentsCount; ++i)
{
var NativeComponentPtr = vars.Helper.Read<IntPtr>(NativeGameObjectPtr + 0x30 /* GameObject.m_Component */, i * 0x10 /* ComponentPair */ + 0x8 /* ComponentPair.component */);
var ManagedComponentPtr = vars.Helper.Read<IntPtr>(NativeComponentPtr + 0x18 /* Object.m_MonoReference */ + 0x10 /* ScriptingGCHandle.m_Object */);
var ManagedComponentName = vars.Helper.ReadString(256, ReadStringType.AutoDetect, ManagedComponentPtr /* MonoObject.vtable */, 0x0 /* MonoVTable.klass */, 0x48 /* MonoClass.name */, 0x0 /* char* */);
if (!string.IsNullOrEmpty(ManagedComponentName) && ManagedComponentName == ComponentName)
return ManagedComponentPtr;
}
return IntPtr.Zero;
};
Func<IntPtr, string, IntPtr> SceneFindComponentByName = (ScenePtr, ComponentName) =>
{
if (ScenePtr == IntPtr.Zero)
return IntPtr.Zero;
var SceneObjectsPrevPtr = vars.Helper.Read<IntPtr>(ScenePtr + 0xB0 /* UnityScene.m_Roots */ + 0x0 /* List.m_Root */ + 0x0 /* ListElement.m_Prev */);
var SceneObjectsNextPtr = vars.Helper.Read<IntPtr>(ScenePtr + 0xB0 /* UnityScene.m_Roots */ + 0x0 /* List.m_Root */ + 0x8 /* ListElement.m_Next */);
for (var AddressIt = SceneObjectsNextPtr; AddressIt != SceneObjectsPrevPtr && AddressIt != IntPtr.Zero; AddressIt = vars.Helper.Read<IntPtr>(AddressIt + 0x8 /* ListElement.m_Prev */))
{
var NativeTransformPtr = vars.Helper.Read<IntPtr>(AddressIt + 0x10 /* ListNode.m_Data */);
var NativeGameObjectPtr = vars.Helper.Read<IntPtr>(NativeTransformPtr + 0x30 /* Unity::Component.m_GameObject */);
var ManagedGameObjectPtr = vars.Helper.Read<IntPtr>(NativeGameObjectPtr + 0x18 /* Object.m_MonoReference */ + 0x10 /* ScriptingGCHandle.m_Object */);
var ManagedComponentPtr = GameObjectFindComponentByName(ManagedGameObjectPtr, ComponentName);
if (ManagedComponentPtr != IntPtr.Zero)
return ManagedComponentPtr;
}
return IntPtr.Zero;
};
Func<IntPtr, string, IntPtr> SceneManagerFindComponentByName = (SceneManagerPtr, ComponentName) =>
{
if (SceneManagerPtr == IntPtr.Zero)
return IntPtr.Zero;
var SceneCount = vars.Helper.Read<int>(SceneManagerPtr + 0x8 /* RuntimeSceneManager.m_Scenes */ + 0x10 /* dynamic_array.m_size */);
for (int i = 0; i < SceneCount; ++i)
{
var ScenePtr = vars.Helper.Read<IntPtr>(SceneManagerPtr + 0x8 /* RuntimeSceneManager.m_Scenes */, i * IntPtr.Size /* UnityScene* */);
var ScenePath = vars.Helper.ReadString(256, ReadStringType.AutoDetect, ScenePtr + 0x10 /* UnityScene.m_ScenePath */, 0x0 /* char* */);
var SceneName = System.IO.Path.GetFileNameWithoutExtension(ScenePath);
var ManagedComponentPtr = SceneFindComponentByName(ScenePtr, ComponentName);
if (ManagedComponentPtr != IntPtr.Zero)
return ManagedComponentPtr;
}
return IntPtr.Zero;
};
vars.FindComponentByName = (Func<string, IntPtr>)(ComponentName =>
{
var SceneManagerPtr = vars.SceneManagerAddress.GetValue(IntPtr.Zero);
return SceneManagerFindComponentByName(vars.Helper.Read<IntPtr>(SceneManagerPtr), ComponentName);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment