Unity Dear ImGui - 追加中文字體教學
2025-02-17 21:27:51

IMG
在使用 UImGui 時,預設是不支援中文的。若需要在介面上顯示繁體中文,就需要為 Dear ImGui
指定一個支援中文的字型檔。以下將示範如何下載並加入 Noto Sans TC,讓我們的 Dear ImGui 視窗能正確顯示繁體中文文字。


1. 下載 Noto Sans TC 字型

  1. 前往 Google Fonts - Noto Sans TC
  2. 點擊 Download family 下載字型壓縮檔。
  3. 解壓縮後,你可以看到多種不同字重的 .ttf 檔案,例如:NotoSansTC-Regular.otfNotoSansTC-Bold.otf

這裡以 NotoSansTC-Regular.otf 為例。


2. 將字型放入專案

  1. 在 Unity 專案中,建立或找到 Assets/StreamingAssets 資料夾(若不存在,請自行建立)。
  2. NotoSansTC-Regular.otf 複製到 Assets/StreamingAssets 資料夾中。

注意StreamingAssets 資料夾可以在打包後被正確帶入,並維持原有的檔案路徑,方便我們在程式中透過 Application.streamingAssetsPath 取得。


3. 新增自訂字體初始化程式

建立一個 ImguiCustomFont 腳本,用於初始化中文字體,程式碼範例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using ImGuiNET;
using UnityEngine;

public class ImguiCustomFont : MonoBehaviour
{
// 這裡假設你將 NotoSansTC-Regular.otf 放在 StreamingAssets 資料夾中
private readonly string fontPath = $"{Application.streamingAssetsPath}/NotoSansTC-Regular.otf";

/// <summary>
/// 這個方法會在 UImGui 初始化時被呼叫,用於載入自訂字體。
/// </summary>
/// <param name="io">ImGui IO 介面</param>
public void AddChineseFont(ImGuiIOPtr io)
{
// 以 20 pt 為字體大小,可根據需求調整
io.Fonts.AddFontFromFileTTF(fontPath, 20, null, io.Fonts.GetGlyphRangesChineseFull());
}
}
  • fontPath: 利用 Application.streamingAssetsPath 取得 StreamingAssets 內的字型檔路徑。
  • AddFontFromFileTTF: 從檔案路徑讀取 .ttf.otf 字型,並指定字型大小。
  • GetGlyphRangesChineseFull(): 使用 Dear ImGui 內建的中文字形範圍,讓繁體中文能正確顯示。

4. UImGui 設定

  1. 在場景中找到 UImGui 元件,或自行建立一個新的 GameObject,並加入 UImGui 元件。
  2. UImGui 組件的 Font Atlas Configuration 區塊中,將 Font Custom Initializer (ImGuiIOPtr)
    設定為你剛剛建立的 ImguiCustomFont.AddChineseFont 方法。
    • Runtime Only:在執行時載入字體
    • ImGui Custom Font:指向 ImguiCustomFont 腳本物件中的方法

在某些版本的 UImGui 中,介面可能略有不同,但主要流程是一致的:把自訂的字體初始化方法掛在 UImGui 的字體設定位置。

IMG


5. 測試與驗證

  1. 進入 Play Mode 後,Dear ImGui 會在初始化階段讀取並載入 NotoSansTC-Regular.otf 字型。
  2. 你可以在自定義視窗中輸入繁體中文,或在程式碼中顯示中文字串,以驗證字體是否正常顯示。

範例程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using UImGui;
using UnityEngine;

public class TestChineseWindow : MonoBehaviour
{
private void OnEnable()
{
UImGuiUtility.Layout += DrawChineseWindow;
}

private void OnDisable()
{
UImGuiUtility.Layout -= DrawChineseWindow;
}

private void DrawChineseWindow(UImGui.UImGui uImGui)
{
ImGuiNET.ImGui.Begin("中文測試視窗");
ImGuiNET.ImGui.Text("你好,世界!");
ImGuiNET.ImGui.Text("這裡可以顯示繁體中文。");
ImGuiNET.ImGui.End();
}
}

若字體沒有正常載入或顯示,請確認路徑是否正確、StreamingAssets 資料夾是否存在,以及 UImGui 的 Font Atlas 設定是否正確。

IMG


上一頁
2025-02-17 21:27:51