タイトル: BPでウィジェットのボタンを選択できなくする方法
SEOタイトル: UE5 UMG ボタン無効化完全ガイド (Is Enabled / Visibility / Style / Focus)
| この記事の要点 |
|
UMG Button を選択不可にする 3 つの方法
UE5 の UMG ウィジェットでボタンの選択を防ぐには、目的に応じて 3 つの方法があります:
| 方法 | クリック | 見た目 | レイアウト | 用途 |
|---|---|---|---|---|
| Is Enabled = false | 無効 | グレーアウト | 保持 | 「現在使えない」表現 |
| Visibility = Hit Test Invisible | 無効 | 通常表示 | 保持 | 表示だけしたい時 |
| Visibility = Hidden | 無効 | 非表示 | 保持 | 空間は残したい |
| Visibility = Collapsed | 無効 | 非表示 | 消失 | 完全に消したい |
方法 1: Is Enabled = false(最も標準)
エディタで設定
- UMG エディタでボタンを選択
- Details パネル → Behavior セクション
- Is Enabled のチェックを外す
ボタンはグレーアウト表示になり、クリックも Hover Animation も Focus も無効化されます。
Blueprint から動的に切替
イベントグラフで:
[Button_StartGame] → [Set Is Enabled]
In Bool: false
ノード詳細:
ターゲット: Button_StartGame
In Is Enabled: false
C++ から
// MyHUDWidget.cpp
if (UButton* Btn = Cast<UButton>(GetWidgetFromName(TEXT("Button_StartGame"))))
{
Btn->SetIsEnabled(false);
}
// 条件付き
Btn->SetIsEnabled(PlayerLevel >= RequiredLevel);
方法 2: Visibility プロパティ
| 値 | 説明 |
|---|---|
| Visible | 表示 + クリック可(既定) |
| Hidden | 非表示だが領域は保持、クリック不可 |
| Collapsed | 非表示 + 領域も消える、クリック不可 |
| Hit Test Invisible | 表示されるがマウスイベントを通さない |
| Self Hit Test Invisible | 自身は不可、子は受け取れる |
Blueprint で動的切替
[Button_StartGame] → [Set Visibility]
In Visibility: Hit Test Invisible
用途別の選び方
- 「機能はまだない、見せたくない」 → Collapsed
- 「条件未達でグレー表示しておきたい」 → Is Enabled = false(推奨)
- 「アイコンとして表示するだけ、押せないはず」 → Hit Test Invisible
- 「動的に出現/消失するが UI のずれを防ぎたい」 → Hidden
Disabled 状態の見た目をカスタマイズ
Is Enabled = false で自動的にグレーアウトしますが、Style → Disabled で独自ブラシを指定できます:
- Button を選択 → Details → Appearance
- Style を展開
- Disabled ブラシを変更(色 / 画像 / ティント)
// C++ で Style の Disabled 色を変える
FButtonStyle Style = Btn->GetStyle();
Style.Disabled.TintColor = FSlateColor(FLinearColor(0.3f, 0.3f, 0.3f, 1.0f));
Btn->SetStyle(Style);
フォーカス(Tab / コントローラ)制御
キーボード Tab / ゲームパッドでフォーカスが当たってしまう場合:
Button Details →
Behavior:
[✓] Is Focusable ← OFF にするとフォーカス対象から除外
C++:
Btn->SetIsFocusable(false);
カーソル形状を変える
Button Details →
Behavior:
Cursor: Default / Hand / Crosshairs / GrabHand / SlashedCircle …
Disabled 風に Slashed Circle にすると分かりやすい:
Cursor = Slashed Circle
複数ボタンの一括管理
VerticalBox 内の全ボタンを無効化
[VerticalBox_Menu] → [Get All Children Of Class]
Class: Button
→ [For Each Loop]
→ [Set Is Enabled]
In Bool: false
C++
TArray<UWidget*> Children;
VerticalBox_Menu->GetSlots(); // Slot ベース
for (UPanelSlot* Slot : VerticalBox_Menu->GetSlots())
{
if (UButton* Btn = Cast<UButton>(Slot->Content))
{
Btn->SetIsEnabled(false);
}
}
// 名前で取得
const TCHAR* Names[] = { TEXT("Btn_Start"), TEXT("Btn_Settings"), TEXT("Btn_Quit") };
for (auto N : Names)
{
if (UButton* Btn = Cast<UButton>(GetWidgetFromName(N)))
Btn->SetIsEnabled(false);
}
条件付き無効化の典型例
| シナリオ | 判定 | 対象ボタン |
|---|---|---|
| ステージ未開放 | PlayerProgress < RequiredStage | Stage Select Buttons |
| 所持金不足 | Gold < Price | Buy Button |
| サーバ接続中 | IsConnecting == true | Login Button |
| クールダウン中 | CooldownRemaining > 0 | Skill Button |
| 初回チュートリアル | !IsTutorialDone | 大半のボタン |
Property Binding(自動連動)
UMG Designer 上で Is Enabled の右に Bind ドロップダウンを開き、関数や変数にバインドすると、Tick ベースで自動更新されます:
Bind → Create Binding → 関数を作成
UFUNCTION(BlueprintCallable)
bool IsBuyButtonEnabled()
{
return PlayerGold >= ItemPrice;
}
注意: Property Binding は毎フレーム評価されるためコスト高。多用するならイベント駆動で Set Is Enabled を呼ぶ方が良い。
FAQ
Q: Disabled にしても色が変わらない
A: Style → Disabled ブラシを Normal と同じにしてあるとそのまま見える。Tint Color を 0.5 程度に下げると典型的なグレーアウト表現に。
Q: ボタンの On Clicked が反応しない
A: Is Enabled、Visibility(Hit Test Invisible 含む)、親の Visibility、親の Is Enabled すべて確認。親が Disabled だと子も無効。
Q: ゲームパッドのフォーカスがスキップされない
A: Is Enabled OFF + Is Focusable OFF の両方を設定してください。さらに、UMG 全体の Input Mode が UI Only か Game And UI かも影響します。
Q: Disabled の見た目を統一したい
A: Button Style Asset(USlateWidgetStyleAsset)を作って共通化すると、複数ボタンで一括変更可能です。