Amazonで商品を見るセール会場へ

UnityでボタンからUI表示を切り替える方法|SetActiveとAnimator

ボタンでUIを開く・閉じるだけなら、ButtonのOn Click()からGameObject.SetActive(bool)を設定できます。一つのボタンで交互に状態を切り替える場合は、AnimatorにON/OFFの状態と遷移を作る方法があります。目的に合う方を選ぶと、不要なアニメーション設定を減らせます。

対象はuGUIのButtonです。Unity 6.3とuGUI 2.0の公式資料を参照していますが、今回のUnityでの設定・再生は未実施です。後半のSepiaTone画像は旧版作例として残し、現在のUnityやURPで同じ手順が動く証拠にはしません。

目次

開く・閉じると、交互の切り替えの違い

目的・症状設定・確認先
開くボタンと閉じるボタンを別に作るOn Click()にGameObject.SetActive(bool)を登録。開くはtrue、閉じるはfalse
一つのボタンでOFF→ON→OFF常時有効な親のAnimatorとON/OFFのクリップ、Triggerで交互に遷移
画像だけを一時的に隠すImageのEnabledを制御する方法なら、GameObjectや他のコンポーネントは有効のまま
パネル配下の機能も止めるGameObjectの非アクティブ化。ただし制御ボタン・Animatorを一緒に無効化しない

方法1:On Click()でパネルを開く・閉じる

  1. Canvasの子にTargetPanelとOpenButtonを作ります。OpenButtonはTargetPanelの外に置き、パネルを閉じても操作できるようにします。
  2. OpenButtonのButtonコンポーネントでOn Click()の「+」を押し、TargetPanelをObject欄へドラッグします。
  3. 関数はGameObject → SetActive(bool)、boolのチェックはONに設定します。これは常に開く処理であり、一回ごとに反転する処理ではありません。
  4. 閉じるボタンにもTargetPanelを登録し、SetActive(bool)のチェックをOFFにします。閉じるボタンはパネル内に置いても、外に残したOpenButtonで再度開ける構成です。
  5. 必要なら再生前にTargetPanelを非アクティブにします。OpenButtonとCanvas/EventSystemは有効なまま残し、開く→閉じる→再度開くことを確認します。

SetActiveは対象のローカル状態を変更します。親が非アクティブなら子だけtrueにしても表示されません。表示対象のImageだけでなく、配下のスクリプト・入力・コルーチン等も止まる条件があるため、見た目だけの変更と区別してください。

方法2:一つのボタンでAnimatorの状態を交互に切り替える

まず一枚のImageだけを隠す最小例にします。Canvasの子に常時有効なDisplayRootを作り、その子にTargetImage、DisplayRootの外にSwitchButtonを配置します。AnimatorはDisplayRootへ追加し、TargetImageのImageコンポーネントのEnabledだけを記録します。親やAnimator自身の有効状態は記録しません。

OFF/ONクリップの記録

  1. DisplayRootを選択してAnimationウィンドウを開き、CreateでDisplayOff.animを保存します。作られたAnimator ControllerがDisplayRootのAnimatorへ割り当てられていることを確認します。
  2. DisplayOffの0フレームで録画をONにし、TargetImageのImageコンポーネントのチェックをOFFにします。GameObject名の左側にあるアクティブチェックとは別です。Add PropertyでTargetImageのImageのEnabledを追加する方法でもかまいません。
  3. 1フレームにも同じOFF値のキーを置き、録画を解除します。クリップをPreviewして、そのImageが隠れることを確認します。
  4. Animationのクリップ一覧からCreate New ClipでDisplayOn.animを作ります。同じEnabledプロパティに0フレーム/1フレームともON値を記録して、録画を解除します。
  5. 両クリップで記録したプロパティが同じImageのEnabledだけであることを確認します。Transformや親のアクティブ状態を誤って記録したキーがあれば外します。

Image.EnabledをOFFにしても、子の文字や別のImageまで一括で隠れるわけではありません。パネル全体を隠す目的では方法1、または常時有効な親から子のアクティブ状態を制御する別構成を選びます。

ステート・Trigger・両方向の遷移

  1. AnimatorにOffとOnの2ステートを用意し、Motionへ対応するDisplayOff/DisplayOnを割り当てます。最初の状態をOffにするならSet as Layer Default StateでOffを既定にします。
  2. ParametersへTrigger型のSwitchを追加します。名前は大文字小文字も含めてボタン側と一致させます。
  3. OffからOn、OnからOffへそれぞれTransitionを接続します。両方のConditionsにSwitchを設定します。
  4. 両方のTransitionでHas Exit TimeをOFF、Transition Durationを0に設定します。時間待ちやブレンドを使わない切り替え例です。
  5. 自動遷移やAny Stateからの追加遷移はこの最小例には作りません。Controllerを確認し、再生前にはAnimationの録画・Previewを終了します。

Triggerは遷移条件を発火させるパラメーターです。boolのON/OFF値を保存するものとは役割が違います。Has Exit Timeが有効な場合は終了時刻の条件も加わるため、クリック後に即時の切り替えを期待する例では外します。

ButtonからAnimator.SetTriggerを呼ぶ

  1. SwitchButtonのOn Click()に、AnimatorのあるDisplayRootを登録します。非表示にするTargetImageそのものを登録する設定とは区別します。
  2. 関数にAnimator → SetTrigger(string)を選び、引数へSwitchを入力します。クリップ名DisplayOnやステート名Onを入力する欄ではありません。
  3. 再生し、初期Off→クリック後On→再クリック後Offという順でImageのEnabledとAnimatorの現在ステートを確認します。
  4. 一回のOn Click()に同じSetTriggerが二重登録されていないことを確認します。高速連打の挙動は別条件として確認してください。

動かない・戻せない場合の確認順

目的・症状設定・確認先
ボタンが反応しないButtonのInteractable、CanvasのGraphic Raycaster、EventSystemと入力モジュール、前面のRaycast Targetを確認
SetActive(true)でも出ない親のactiveInHierarchy、対象参照、Canvas、ImageのEnabled/Alphaを確認
閉じると再表示できない開くボタンや制御するAnimatorが非表示対象の子になっていないか確認
Triggerが見つからないOn Click()のObject、Controller、ParametersのSwitchと型を確認
クリック後に待つ・勝手に切り替わる両TransitionのHas Exit Time、Duration、Conditions、追加遷移を確認
ステートは変わるが画像は同じMotion、子への相対パス、両クリップのEnabledのON/OFFキーを確認

入力の前提はuGUIの基本設定、スクロール内の入力はScrollViewの確認順で補足しています。色やぼかしといった見た目の変更は、オブジェクトを非アクティブにする操作と分けて考えます。

旧版資料:EffectsとSepiaToneのON/OFF

以下は旧記事にあったMain CameraのSepiaToneを切り替える作例です。Assets → Import Package → Effectsというメニューと旧イメージエフェクトを前提にしています。撮影した正確なUnity版は未確認で、現在の新規プロジェクトの導入手順としては使いません。Unity6/URPでは対応する描画方式とポストプロセスを別に確認します。

旧カメラとクリップの準備

旧環境ではMain CameraへSepiaToneを追加し、Animation_offとAnimation_onを作成してコンポーネントのチェックを記録しました。新しいUIの例と画像の対象・名前が異なります。

メインカメラにスクリプトをアタッチし、シーンに配置した確認用キューブの表示がゲーム再生時にセピア色へ変化することを確認する画面。
ボタンで表示状態を切り替えるための、OFF状態のアニメーション作成手順。

旧ステートと遷移

旧作例のステートはanimation_off/animation_on、Trigger名はtestです。2ステートへ各Motionを割り当て、両方向の遷移のConditionsへtestを登録する構成を残します。時間待ちや遷移時間の設定は前の節で説明した条件と照合してください。

デフォルトステートをリネームしてアニメーションファイルを割り当て、新規ステートにもアニメーションファイルを割り当てた状態。
ステート間をトランジションの矢印で接続し、インスペクターの条件欄にテストパラメータを追加した状態。

旧クリップ・ボタン・結果の画像

旧画像はSepiaToneのOFF/ONキー、Main CameraのAnimator.SetTrigger(string)へtestを渡すOn Click()、旧作例の表示を示します。現在のDisplayRoot/TargetImageの手順を実行した証拠ではありません。

各アニメーションクリップでコンポーネントのオンとオフを切り替えてキーフレームを記録し、録画を終了した状態。
ボタンのクリック時イベントにメインカメラを登録し、関数の引数にテストパラメータを入力した設定画面。
ボタンをクリックすることでエフェクトの有効と無効が切り替わり、画面の表示状態が変化する動作確認の様子。

旧記事末尾の「別カメラにレイヤーを分ければ特定物だけ除外できる」という説明は、描画順・背景消去・使用Render Pipelineを指定せず一般化できません。ここでは再現済みの応用手順として掲載せず、旧参考先2015年のイメージエフェクト解説の対象版と条件を確認する資料として残します。

公式資料と関連記事

GameObject.SetActive、Animator.SetTrigger、Animation transitions、Animationでのプロパティ記録を2026年10月3日に参照しました。新しいUIと旧SepiaToneのUnity再生は未検証です。

uGUIでのUI制作は、ほかにも書いています。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

Unityのおすすめ書籍

開発PCの選び方

周辺機器の優先度

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次