> [!NOTE]\
> 有新的功能建议或者Bug可以提交Issues (当然你也可以尝试自己修改代码后提交到该仓库\
> New feature suggestions or bugs can be commit as issues. Of course, you can also try modifying the code yourself and then commit it to the repository.
> > Dome
> > - [Phasmophobia Cheat](https://github.com/issuimo/PhasmophobiaCheat/tree/main)
> 如果是MSVC编译器请打开SEH选项 \
> If using the MSVC compiler, please open the SEH option. \
> 对于高版本安卓程序崩溃的可能问题请参阅 [link](https://github.com/issuimo/UnityResolve.hpp/issues/11) \
> For potential issues related to crashes in higher version Android programs, please refer to the link [link](https://github.com/issuimo/UnityResolve.hpp/issues/11)
简要概述 (Brief overview)
# UnityResolve.hpp
> ### 支持的平台 (Supported platforms)
> - [X] Windows
> - [X] Android
> - [X] Linux
> ### 类型 (Type)
> - [X] Camera
> - [X] Transform
> - [X] Component
> - [X] Object (Unity)
> - [X] LayerMask
> - [X] Rigidbody
> - [x] MonoBehaviour
> - [x] Renderer
> - [x] Mesh
> - [X] Behaviour
> - [X] Physics
> - [X] GameObject
> - [X] Collider
> - [X] Vector4
> - [X] Vector3
> - [X] Vector2
> - [X] Quaternion
> - [X] Bounds
> - [X] Plane
> - [X] Ray
> - [X] Rect
> - [X] Color
> - [X] Matrix4x4
> - [X] Array
> - [x] String
> - [x] Object (C#)
> - [X] Type (C#)
> - [X] List
> - [X] Dictionary
> - [X] Animator
> - [X] CapsuleCollider
> - [X] BoxCollider
> - [X] Time
> - More...
> ### 功能 (Function)
> - [X] DumpToFile
> - [X] 附加线程 (Thread Attach / Detach)
> - [X] 修改静态变量值 (Modifying the value of a static variable)
> - [X] 获取对象 (Obtaining an instance)
> - [X] 创建C#字符串 (Create C# String)
> - [X] 创建C#数组 (Create C# Array)
> - [X] 创建C#对象 (Create C# instance)
> - [X] 世界坐标转屏幕坐标/屏幕坐标转世界坐标 (WorldToScreenPoint/ScreenToWorldPoint)
> - [X] 获取继承子类的名称 (Get the name of the inherited subclass)
> - [X] 获取函数地址(变量偏移) 及调用(修改/获取) (Get the function address (variable offset) and invoke (modify/get))
> - [x] 获取Gameobject组件 (Get GameObject component)
> - More...
功能使用 (How to use)
#### 更改平台 (Change platform)
> ``` c++
> #define WINDOWS_MODE 1 // 如果需要请改为 1 | 1 if you need
> #define ANDROID_MODE 0
> #define LINUX_MODE 0
> ```
#### 初始化 (Initialization)
> ``` c++
> UnityResolve::Init(GetModuleHandle(L"GameAssembly.dll | mono.dll"), UnityResolve::Mode::Mono);
> // Linux or Android
> UnityResolve::Init(dlopen(L"GameAssembly.so | mono.so", RTLD_NOW), UnityResolve::Mode::Mono);
> ```
> 参数1: dll句柄 \
> Parameter 1: DLL handle \
> 参数2: 使用模式 \
> Parameter 2: Usage mode
> - Mode::Il2cpp
> - Mode::Mono
#### 附加线程 (Thread Attach / Detach)
> ``` c++
> // C# GC Attach
> UnityResolve::ThreadAttach();
>
> // C# GC Detach
> UnityResolve::ThreadDetach();
> ```
#### 获取函数地址(变量偏移) 及调用(修改/获取) (Get the function address (variable offset) and invoke (modify/get))
> ``` c++
> const auto assembly = UnityResolve::Get("assembly.dll | 程序集名称.dll");
> const auto pClass = assembly->Get("className | 类名称");
> // assembly->Get("className | 类名称", "*");
> // assembly->Get("className | 类名称", "namespace | 空间命名");
>
> const auto field = pClass->Get("Field Name | 变量名");
> const auto fieldOffset = pClass->Get("Field Name | 变量名");
> const int time = pClass->GetValue(obj Instance | 对象地址, "time");
> // pClass->GetValue(obj Instance*, name);
> = pClass->SetValue(obj Instance | 对象地址, "time", 114514);
> // pClass->SetValue(obj Instance*, name, value);
> const auto method = pClass->Get("Method Name | 函数名");
> // pClass->Get("Method Name | 函数名", { "System.String" });
> // pClass->Get("Method Name | 函数名", { "*", "System.String" });
> // pClass->Get("Method Name | 函数名", { "*", "", "System.String" });
> // pClass->Get("Method Name | 函数名", { "*", "System.Int32", "System.String" });
> // pClass->Get("Method Name | 函数名", { "*", "System.Int32", "System.String", "*" });
> // "*" == ""
>
> const auto functionPtr = method->function;
>
> const auto method1 = pClass->Get("method name1 | 函数名称1");
> const auto method2 = pClass->Get("method name2 | 函数名称2");
>
> method1->Invoke(114, 514, "114514");
> // Invoke(args...);
>
> const auto ptr = method2->Cast();
> // Cast(void);
> ptr(114514, true);
> ```
#### 转存储到文件 (DumpToFile)
> ``` C++
> UnityResolve::DumpToFile("./output/");
> ```
#### 创建C#字符串 (Create C# String)
> ``` c++
> const auto str = UnityResolve::UnityType::String::New("string | 字符串");
> std::string cppStr = str.ToString();
> ```
#### 创建C#数组 (Create C# Array)
> ``` c++
> const auto assembly = UnityResolve::Get("assembly.dll | 程序集名称.dll");
> const auto pClass = assembly->Get("className | 类名称");
> const auto array = UnityResolve::UnityType::Array::New(pClass, size);
> std::vector cppVector = array.ToVector();
> ```
#### 创建C#对象 (Create C# instance)
> ``` c++
> const auto assembly = UnityResolve::Get("assembly.dll | 程序集名称.dll");
> const auto pClass = assembly->Get("className | 类名称");
> const auto pGame = pClass->New();
> ```
#### 获取对象 (Obtaining an instance)
> ``` c++
> const auto assembly = UnityResolve::Get("assembly.dll | 程序集名称.dll");
> const auto pClass = assembly->Get("className | 类名称");
> std::vector playerVector = pClass->FindObjectsByType();
> // FindObjectsByType(void);
> playerVector.size();
> ```
#### 世界坐标转屏幕坐标/屏幕坐标转世界坐标 (WorldToScreenPoint/ScreenToWorldPoint)
> ``` c++
> Camera* pCamera = UnityResolve::UnityType::Camera::GetMain();
> Vector3 point = pCamera->WorldToScreenPoint(Vector3, Eye::Left);
> Vector3 world = pCamera->ScreenToWorldPoint(point, Eye::Left);
> ```
#### 获取继承子类的名称 (Get the name of the inherited subclass)
> ``` c++
> const auto assembly = UnityResolve::Get("UnityEngine.CoreModule.dll");
> const auto pClass = assembly->Get("MonoBehaviour");
> Parent* pParent = pClass->FindObjectsByType()[0];
> std::string child = pParent->GetType()->GetFullName();
> ```
#### 获取Gameobject组件 (Get GameObject component)
> ``` c++
> std::vector objs = gameobj->GetComponents(UnityResolve::Get("assembly.dll")->Get("class")));
> // gameobj->GetComponents(Class* component)
> std::vector objs = gameobj->GetComponentsInChildren(UnityResolve::Get("assembly.dll")->Get("class")));
> // gameobj->GetComponentsInChildren(Class* component)
> std::vector objs = gameobj->GetComponentsInParent(UnityResolve::Get("assembly.dll")->Get("class")));
> // gameobj->GetComponentsInParent(Class* component)
> ```