mcpField
U
unity-ui-development

unity-ui-development

github.com/josiahsiegelデザイン・UI59104 回インストール19 週間前に更新
リポジトリ

unity-ui-development について

Unity開発者向けに、UGUIまたはUI Toolkitの選択と実装を扱うUI開発スキルです。システム選定、レイアウト、イベント処理、スタイル、データバインディング、一般的なUIパターンを解説します。

主な機能

  1. 01UGUIとUI Toolkitの比較
  2. 02Canvas設定とRectTransformのアンカー
  3. 03レイアウトとイベント処理のパターン
  4. 04UXML、USS、C#の連携
  5. 05UI Toolkitのデータバインディング

活用シーン

  1. 01UnityプロジェクトのUIシステム選定
  2. 02適応型メニューやHUDの構築
  3. 03UI Toolkitによるエディター画面の作成
  4. 04リスト、ポップアップ、ドラッグ&ドロップの実装

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/josiahsiegel/claude-plugin-marketplace --skill unity-ui-development

インストール後、Claude Code で/unity-ui-developmentを入力して読み込まれたか確認します。

詳細

Unity UI 開発

概要

Unity には 2 つの UI システムがあります。UGUI(従来の GameObject ベースのシステム)と、ウェブ技術に着想を得た新しいリテインドモードシステムの UI Toolkit です。このスキルでは、両方のシステムと、それぞれを使用する場面、実装パターンについて説明します。

UI システムの選択

要素UGUIUI Toolkit
ランタイム UI成熟しており、機能が充実対応(Unity 2023+)
エディター UI非対応エディターの主要システム
ワールド空間 UI優秀(ワールド空間キャンバス)限定的
アニメーション/トゥイーンDOTween、Animator、LeanTweenUSS トランジション、C# による操作
スタイル設定要素ごとに手動で設定USS スタイルシート(CSS に類似)
パフォーマンスキャンバスが多いとドローコールが増加リテインドモードにより、ドローコールが少ない
学習曲線Unity 開発者にとっては緩やか高め(ウェブに似たパラダイム)
VR/AR十分にサポートワールド空間のサポートは限定的

推奨: ワールド空間 UI、VR/AR、アセットストアとの最大限の互換性が必要なプロジェクトには UGUI を使用してください。エディター拡張、複雑なデータ駆動型 UI(リスト、ツリー)、Unity 2023+ のプロジェクトには UI Toolkit を使用してください。

UGUI(キャンバスベースの UI)

キャンバスの設定
レンダーモード用途備考
Screen Space - OverlayHUD、メニュー常に最前面に表示され、カメラは不要
Screen Space - CameraUI へのポストプロセスレンダーカメラを割り当てる
World Spaceゲーム内の看板、体力バーインタラクション用にイベントカメラを設定する

パフォーマンスのルール: 静的な UI と動的な UI は、別々のキャンバスに分けてください。子要素が 1 つでも変更されると、キャンバス内のすべての子要素が再構築されます。

RectTransform のアンカー設定
Anchor presets control how elements resize with parent:
- Stretch-Stretch: Element fills parent (full-screen backgrounds)
- Center-Center: Fixed size at center (popup dialogs)
- Bottom-Left: Fixed corner position (minimap)
- Top-Stretch: Stretches horizontally, fixed at top (nav bar)

RectTransform のアンカープリセットウィジェットを使ってアンカーを設定します(Alt+Shift を押したままにすると、ピボットと位置も設定されます)。コードでは anchorMin、anchorMax、offsetMin、offsetMax を使用します。

レイアウトコンポーネント
コンポーネント目的
HorizontalLayoutGroup子要素を左から右へ配置
VerticalLayoutGroup子要素を上から下へ配置
GridLayoutGroupグリッド状に配置(インベントリスロットなど)
LayoutElement最小/推奨/可変サイズを上書き
ContentSizeFitterコンテンツに合わせて自動的にサイズ変更
AspectRatioFitterアスペクト比を維持

意図しない引き伸ばしを防ぐには、Layout.childForceExpandWidth/Height を無効にします。

イベント処理
using UnityEngine.UI;
using TMPro;

[SerializeField] Button startButton;
[SerializeField] TMP_InputField nameField;
[SerializeField] Slider volumeSlider;

void OnEnable()
{
    startButton.onClick.AddListener(OnStartClicked);
    nameField.onEndEdit.AddListener(OnNameChanged);
    volumeSlider.onValueChanged.AddListener(OnVolumeChanged);
}

void OnDisable()
{
    startButton.onClick.RemoveListener(OnStartClicked);
    nameField.onEndEdit.RemoveListener(OnNameChanged);
    volumeSlider.onValueChanged.RemoveListener(OnVolumeChanged);
}

リークやゴースト参照を防ぐため、OnDisable で必ず RemoveListener を呼び出してください。

TextMeshPro

従来の Text ではなく、必ず TextMeshPro(TMP_Text、TextMeshProUGUI)を使用してください。プロンプトが表示されたら、TMP Essentials をインポートします。インラインアイコンには、リッチテキストタグ <color=#FF0000>、<b>、<size=24>、<sprite=0> を使用します。

UI Toolkit(USS/UXML)

アーキテクチャ
UI Toolkit Stack:
  UXML  -- Structure (like HTML)
  USS   -- Styling (like CSS)
  C#    -- Logic (like JavaScript)
UXML の構造
<ui:UXML xmlns:ui="UnityEngine.UIElements">
    <ui:VisualElement class="container">
        <ui:Label text="Player Stats" class="title" />
        <ui:ProgressBar name="health-bar" title="HP" high-value="100" />
        <ui:Button name="attack-btn" text="Attack" class="action-btn" />
        <ui:ListView name="inventory-list" />
    </ui:VisualElement>
</ui:UXML>
USS のスタイル設定
.container {
    flex-direction: column;
    padding: 10px;
    background-color: rgba(0, 0, 0, 0.8);
    border-radius: 8px;
}

.title {
    font-size: 24px;
    color: white;
    -unity-font-style: bold;
    margin-bottom: 10px;
}

.action-btn {
    height: 40px;
    background-color: #4CAF50;
    color: white;
    border-radius: 4px;
    transition-duration: 0.2s;
}

.action-btn:hover {
    background-color: #66BB6A;
    scale: 1.05 1.05;
}

CSS と USS の主な違い:Unity 固有のプロパティには -unity- プレフィックスを使用します。レイアウトモデルは Flexbox です(デフォルトの flex-direction: column)。アニメーションには transition-duration、transition-property を使用します。

C# との連携
[RequireComponent(typeof(UIDocument))]
public class StatsUI : MonoBehaviour
{
    void OnEnable()
    {
        var root = GetComponent<UIDocument>().rootVisualElement;
        var healthBar = root.Q<ProgressBar>("health-bar");
        var attackBtn = root.Q<Button>("attack-btn");
        var inventory = root.Q<ListView>("inventory-list");

        attackBtn.RegisterCallback<ClickEvent>(OnAttack);
        healthBar.value = player.Health;

        // ListView binding
        inventory.makeItem = () => new Label();
        inventory.bindItem = (element, index) =>
            ((Label)element).text = items[index].Name;
        inventory.itemsSource = items;
    }
}

Q<T>("name") または Q<T>(className: "class") で要素を検索します。RegisterCallback<EventType> でコールバックを登録します。必ず rootVisualElement から検索してください。

データバインディング(Unity 2023.2+)
// Runtime data binding with [CreateProperty] and INotifyBindablePropertyChanged
public class PlayerData : INotifyBindablePropertyChanged
{
    public event EventHandler<BindablePropertyChangedEventArgs> propertyChanged;
    private int _health;

    [CreateProperty]
    public int Health
    {
        get => _health;
        set { _health = value; Notify(); }
    }
    void Notify([CallerMemberName] string prop = "")
        => propertyChanged?.Invoke(this, new BindablePropertyChangedEventArgs(prop));
}

UXML では binding-path="Health" を使ってバインドするか、C# では element.SetBinding("value", new DataBinding { dataSourcePath = ... }) を使用します。

一般的な UI パターン

パターンUGUI の方法UI Toolkit の方法
ポップアップダイアログ子パネルを有効化/無効化ビジュアルツリーに追加/削除
スクロールリストScrollRect + VerticalLayoutGroupListView(仮想化)
ドラッグ&ドロップIBeginDragHandler、IDragHandler、IEndDragHandlerPointerManipulator
タブシステムToggle グループ + パネルRadioButtonGroup + 表示切り替え
ツールチップカーソルに追従するパネルManipulator + VisualElement の位置指定
画面フェードCanvasGroup.alpha のトゥイーンUSS opacity トランジション

追加リソース

参考ファイル
  • references/ugui-patterns.md -- UGUI の高度なパターン:スクロールの最適化、動的レイアウト、ワールド空間でのインタラクション、ローカライズ、セーフエリアの処理、画面への適応
  • references/ui-toolkit-advanced.md -- カスタムコントロール、ListView/TreeView の活用、カスタムマニピュレーター、エディター UI との統合、テーマ設定、レスポンシブレイアウト

コメント