uGUIでトグルなボタンを作る

トグルボタン

uGUI にはtoggleとbuttonはあるけれど、両方を合わせたやつがない。
下図のようにボタンを押したら、ONになったままになるようなボタンのことだ。

トグルボタン

uGUIのトグル

uGUIのデフォルトのトグルでこれを実現しようとすると問題がある。
下図のように、Target Graphi にOffのときの画像を、 GraphicにOnのときの画像を設定する。
Hierarchy的にはこんな感じ。

Hierarchy

uGUIのトグル

こうすると、トグルがOnのときにGraphicに設定した画像が表示される。しかし、Target Graphicに設定した画像は表示されたままなのである。
デフォルトのチェックボックス的なトグルの使い方だとそれが正しいのだが、今回はちょっと違う。透過処理しているので、Onの画像が表示されているときはOffの画像は消えていてほしい。

toggleのOnValueChangedで画像の表示を変える

調べてみると、まさにこれ。uGUI Graphical Toggle Button
そのページのスクリプトをちょっと直してこんな感じ。

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

[RequireComponent(typeof(Toggle))]
public class ToggleImage : MonoBehaviour {
public Graphic offGraphic;

void Start() {
Toggle toggle = GetComponent<Toggle> ();
toggle.onValueChanged.AddListener((value) => {
OnValueChanged(value);
});
//初期状態を反映
offGraphic.enabled = !toggle.isOn;
}

void OnValueChanged(bool value) {
if (offGraphic != null) {
offGraphic.enabled = !value;
}
}
}

こいつを Toggle にセットし、public にしてある offGraphic に off のときの画像を設定してやればOK。

確認バージョン

Unity 4.6

Unityカテゴリの記事
Color SpaceがLinearのときUIの透明度が正しくならない
History Inspectorの紹介
敵AIとビジュアルスクリプティング
Chronosを使った感想
Smart Inspectorの紹介
コンポーネントの順番をスクリプトから並び替える
Kris' Favorite Assets が便利
キー操作でUIのナビゲーションをループさせる
TextMeshProのSprite Assetを更新する
UnityPhysicsDebugDraw2D が便利
色管理を考える
細かいTips
ビルドスクリプトを書く
AnimatorのCulling Modeでハマった話
Vectrosityを使ってUGUI上で線や円のアニメーションをする
スプレッドシートからjsonデータを読み込む
ビジュアルノベルアセットFungusにコマンドを追加してカスタマイズする
Skinned Mesh Renderer の Boundsについて
シーンごとにビルド結果の容量を出す
シーンビューにクオリティ設定のスライダーを出すエディタ拡張
ビルド結果のFile headersが大きい理由
フリーのビジュアルノベルアセットFungusを使ってRPGのイベントを作る
Move To View を改良する
フリーのビジュアルノベルアセットのFungusが便利
Visual Studio で保存時にフォーマットする
スプレッドシートからデータを読み込む
Easy Save2 で シリアライズされたクラスを保存する
ShaderでSpriteの色相をシフトする
Sprite、Texture の 色相をシフトする
uGUIのButtonをクリック時にハイライトのままになる
uGUIのCanvas Groupを使って透過処理をしたり、操作を制限する
自作のコンフィグ画面に必要なもの
uGUI で動的にボタンを作る
Easy Save2 を使ってみる
csv読み込んで ローカライズ
LoadLevelAdditive で共通シーンを加算
画面全体に色をかける
Any State でどこからでも遷移できるようにする
iTween のStop ではまる
sprite の multiple で 境界がおかしくなる
Renderer の Materials を スクリプトから設定する
2D画面に線を引く Line Renderer
背景をスクロールさせる