You are viewing a potentially older version of this package. View all versions.
penswer-DearImGuiInjection-1.0.0 icon

DearImGuiInjection

Inject Dear ImGui into any process with C#

Date uploaded 3 days ago
Version 1.0.0
Download link penswer-DearImGuiInjection-1.0.0.zip
Downloads 2175
Dependency string penswer-DearImGuiInjection-1.0.0

This mod requires the following mods to function

BepInEx-BepInExPack_PEAK-5.4.2403 icon
BepInEx-BepInExPack_PEAK

BepInEx pack for PEAK. Preconfigured and ready to use.

Preferred version: 5.4.2403

README

DearImGuiInjection

Inject Dear ImGui into any process with C#.

Installation

Unzip this zip file
Place the DearImGuiInjection directory located in BepInEx/plugins into your BepInEx plugins directory for PEAK

Usage

The keybind for bringing up the cursor for interaction is by default the Insert key, which can be modified in the configuration file.

Mod Developers

Download this package and add a reference to ImGui.NET.dll and DearImGuiInjection.dll in your C# project.

Above your BaseUnityPlugin class definition

[BepInDependency(DearImGuiInjection.Metadata.GUID)]
DearImGuiInjection.DearImGuiInjection.Render += MyUI;
private static void MyUI()
{
    if (DearImGuiInjection.DearImGuiInjection.IsCursorVisible)
    {
        var dummy = true;
        ImGui.ShowDemoWindow(ref dummy);

        if (ImGui.BeginMainMenuBar())
        {
            if (ImGui.BeginMenu("MainBar", true))
            {
                if (ImGui.MenuItemBool("MyTestPlugin", null, false, true))
                {
                    _isMyUIOpen ^= true;
                }

                ImGui.EndMenu();
            }

            ImGui.EndMainMenuBar();
        }

        if (ImGui.BeginMainMenuBar())
        {
            if (ImGui.BeginMenu("MainBar", true))
            {
                if (ImGui.MenuItemBool("MyTestPlugin2", null, false, true))
                {
                    _isMyUIOpen ^= true;
                }

                ImGui.EndMenu();
            }

            ImGui.EndMainMenuBar();
        }
    }

    if (_isMyUIOpen)
    {
        var dummy2 = true;
        if (ImGui.Begin(Metadata.GUID, ref dummy2, (int)ImGuiWindowFlags.None))
        {
            ImGui.Text("hello there");


            if (ImGui.Button("Click me", Constants.DefaultVector2))
            {
                // Interacting with the unity api must be done from the unity main thread
                // Can just use the dispatcher shipped with the library for that
                UnityMainThreadDispatcher.Enqueue(() =>
                {
                    //var go = new GameObject();
                    //go.AddComponent<Stuff>();
                });
            }
        }

        ImGui.End();
    }
}

Make sure to only interact with anything UnityEngine related from its main thread, easily doable through UnityMainThreadDispatcher

if (ImGui.Button("Click me", Constants.DefaultVector2))
{
    // Interacting with the unity api must be done from the unity main thread
    // Can just use the dispatcher shipped with the library for that
    UnityMainThreadDispatcher.Enqueue(() =>
    {
        //var go = new GameObject();
        //go.AddComponent<Stuff>();
    });
}

Credits

Sewer56