Skip to content

UImGui (Unity ImGui) is an UPM package for the immediate mode GUI library using ImGui.NET. This project is based on RG.ImGui project.

License

Notifications You must be signed in to change notification settings

invocative/uimgui

Β 
Β 

Repository files navigation

UImGui

GitHub tag (latest by date)

UImGui (Unity ImGui) is an UPM package for the immediate mode GUI library using ImGui.NET.

This a fork of UImGui, which that project is based off RG.ImGui. This project use FreeType as the default renderer.

Using ImGui 1.87

What is Dear ImGui?

Dear ImGui is a bloat-free graphical user interface library for C++. It outputs optimized vertex buffers that you can render anytime in your 3D-pipeline enabled application. It is fast, portable, renderer agnostic and self-contained (no external dependencies).

Dear ImGui is designed to enable fast iterations and to empower programmers to create content creation tools and visualization / debug tools (as opposed to UI for the average end-user). It favors simplicity and productivity toward this goal, and lacks certain features normally found in more high-level libraries.

Features

Feature RG UImGui
IL2CPP ❌ βœ”οΈ
Windows βœ”οΈ βœ”οΈ
Linux βœ”οΈ βœ”οΈ (Needs Freetype2 Installed)
MacOS βœ”οΈ ❌
Custom Assert βœ”οΈ ❌
Unity Input Manager βœ”οΈ βœ”οΈ
Unity Input System βœ”οΈ βœ”οΈ
Docking ❌ βœ”οΈ
RenderPipeline Built in βœ”οΈ βœ”οΈ
RenderPipeline URP ❌ βœ”οΈ
RenderPipeline HDRP ❌ βœ”οΈ
Renderer Mesh βœ”οΈ βœ”οΈ
Renderer Procedural ~ βœ”οΈ
FreeType ~ βœ”οΈ
Image / Texture ❌ βœ”οΈ

Usage

  1. Setup UnityNuGet.
  2. Add package from git URL: https://github.com/Voltstro-Studios/uimgui.git.
  3. Add UImGui component to the scene.
  4. (Optional) Set Platform Type to Input System if you're using the new input system.
  5. You're ready. Look at the Example section for more usage samples.

Using URP

  • Add a Render Im Gui Feature render feature to the renderer asset.
  • Assign it to the render feature field of the DearImGui component.
  • Check this issue which I describe how to make it work step by step.

Using HDRP

When using the High Definition Render Pipeline:

  • Add a script called Custom Pass Volume anywhere in your scene.
  • Add "DearImGuiPass".
  • Update Injection Point to before or after post processing.
  • You're good to go.

Examples

You can subscribe to global layout or for a specific UImGui context: If choose to use global, don't to forget to set Do Global Events to true on UImGui instance.

Basic

using UImGui;
using ImGuiNET;
using UnityEngine;

public class StaticSample : MonoBehaviour
{
	private void Awake()
	{
		UImGuiUtility.Layout += OnLayout;
	}

	private void OnLayout(UImGui.UImGui obj)
	{
		// Unity Update method. 
		// Your code belongs here! Like ImGui.Begin... etc.
		ImGui.ShowDemoWindow();
	}

	private void OnInitialize(UImGui.UImGui obj)
	{
		// runs after UImGui.OnEnable();
	}

	private void OnDeinitialize(UImGui.UImGui obj)
	{
		// runs after UImGui.OnDisable();
	}

	private void OnDisable()
	{
		UImGuiUtility.Layout -= OnLayout;
		UImGuiUtility.OnInitialize -= OnInitialize;
		UImGuiUtility.OnDeinitialize -= OnDeinitialize;
	}
}

Simple Example

[SerializeField]
private float sliderFloatValue = 1;

[SerializeField]
private string inputText;

// Add listeners, etc ...

private void OnLayout(UImGui.UImGui obj)
{
	ImGui.Text($"Hello, world {123}");
	if (ImGui.Button("Save"))
	{
		Debug.Log("Save");
	}

	ImGui.InputText("string", ref inputText, 100);
	ImGui.SliderFloat("float", ref sliderFloatValue, 0.0f, 1.0f);
}

Image

More Complex Example

[SerializeField] private Vector4 myColor;
private bool isOpen;

private void OnLayout(UImGui.UImGui obj)
{
	// Create a window called "My First Tool", with a menu bar.
	ImGui.Begin("My First Tool", ref isOpen, ImGuiWindowFlags.MenuBar);
	if (ImGui.BeginMenuBar())
	{
		if (ImGui.BeginMenu("File"))
		{
			if (ImGui.MenuItem("Open..", "Ctrl+O")) 
			{
				/* Do stuff */
			}
			if (ImGui.MenuItem("Save", "Ctrl+S")) 
			{
				/* Do stuff */
			}
			if (ImGui.MenuItem("Close", "Ctrl+W")) 
			{
				isOpen = false; 
			}
			ImGui.EndMenu();
		}
		ImGui.EndMenuBar();
	}

	// Edit a color (stored as ~4 floats)
	ImGui.ColorEdit4("Color", ref myColor);

	// Plot some values
	float[] myValues = new float[] { 0.2f, 0.1f, 1.0f, 0.5f, 0.9f, 2.2f };
	ImGui.PlotLines("Frame Times", ref myValues[0], myValues.Length);


	// Display contents in a scrolling region
	ImGui.TextColored(new Vector4(1, 1, 0, 1), "Important Stuff");
	ImGui.BeginChild("Scrolling");
	for (int n = 0; n < 50; n++)
		ImGui.Text($"{n}: Some text");
	ImGui.EndChild();
	ImGui.End();
}

Image

Image Example

[SerializeField]
private Texture sampleTexture;

private void OnLayout(UImGui.UImGui obj)
{
	if (ImGui.Begin("Image Sample"))
	{
		System.IntPtr id = UImGuiUtility.GetTextureId(sampleTexture);
		Vector2 size = new Vector2(sampleTexture.width, sampleTexture.height)
		ImGui.Image(id, size);

		ImGui.End();
	}
}

Image

Custom UserData Example

[Serializable]
private struct UserData
{
	public int SomeCoolValue;
}

[SerializeField]
private UserData _userData;
private string _input = "";

// Add Listeners... etc.

private unsafe void OnInitialize(UImGui.UImGui uimgui)
{
	fixed (UserData* ptr = &_userData)
	{
		uimgui.SetUserData((IntPtr)ptr);
	}
}

private unsafe void OnLayout(UImGui.UImGui obj)
{
	if (ImGui.Begin("Custom UserData"))
	{
		fixed (UserData* ptr = &_userData)
		{
			ImGuiInputTextCallback customCallback = CustomCallback;
			ImGui.InputText("label", ref _input, 100, ~(ImGuiInputTextFlags)0, customCallback, (IntPtr)ptr);
		}

		ImGui.End();
	}
}

private unsafe int CustomCallback(ImGuiInputTextCallbackData* data)
{
	IntPtr userDataPtr = (IntPtr)data->UserData;
	if (userDataPtr != IntPtr.Zero)
	{
		UserData userData = Marshal.PtrToStructure<UserData>(userDataPtr);
		Debug.Log(userData.SomeCoolValue);
	}

	// You must to overwrite how you handle with new inputs.
	// ...

	return 1;
}

Image

Custom Font

Thanks
Check here for more information

First create a method with ImGuiIOPtr like this

public void AddJapaneseFont(ImGuiIOPtr io)
{
	// you can put on StreamingAssetsFolder and call from there like:
	//string fontPath = $"{Application.streamingAssetsPath}/NotoSansCJKjp - Medium.otf";
	string fontPath = "D:\\Users\\rofli.souza\\Desktop\\NotoSansCJKjp-Medium.otf";
	io.Fonts.AddFontFromFileTTF(fontPath, 18, null, io.Fonts.GetGlyphRangesJapanese());

	// you can create a configs and do a lot of stuffs
	//ImFontConfig fontConfig = default;
	//ImFontConfigPtr fontConfigPtr = new ImFontConfigPtr(&fontConfig);
	//fontConfigPtr.MergeMode = true;
	//io.Fonts.AddFontDefault(fontConfigPtr);
	//int[] icons = { 0xf000, 0xf3ff, 0 };
	//fixed (void* iconsPtr = icons)
	//{
	//	io.Fonts.AddFontFromFileTTF("fontawesome-webfont.ttf", 18.0f, fontConfigPtr, (System.IntPtr)iconsPtr);
	//}
}

Assign the object that contain these method in UImGui script

image

Create an awesome text:

if (ImGui.Begin("γ‚¦γ‚£γƒ³γƒ‰γ‚¦γƒ†γ‚Ήγƒˆ"))
{
	ImGui.Text("γ“γ‚“γ«γ‘γ―οΌγƒ†γ‚Ήγƒˆ");

	ImGui.End();
}

image

Yay!

You can see more samples here.

Authors

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

About

UImGui (Unity ImGui) is an UPM package for the immediate mode GUI library using ImGui.NET. This project is based on RG.ImGui project.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C# 99.3%
  • Other 0.7%