この記事はUnityのコンポーネントButtonについて解説しています。
<Buttonとは>
ButtonはUnityでUI作りを便利にするUGUIという機能の中の1つです。
UGUIが何かわからない人は↓の記事で解説していますので参考にしてみください。
UIのボタンを作るのに便利です。ヒエラルキーで右クリック>UI>Buttonで作成できます。
すると↓のようになります。
Buttonを作成すると同時にTextの子オブジェクトを作成します。
ボタンの所に「Button」という文字が表示されているのはTextの機能でButtonの機能ではありません。また、Buttonの見た目はButtonと一緒についているImageによって決まります。
このオブジェクトはCanvasの子オブジェクトになっていないと表示されません。また、シーン中にEventSystemがない場合は動作しないので気をつけてください。
↓Buttonと完成の高い記事をまとめてみましたので参考にしてみてください。
<Buttonを使う際の注意点>
Buttonを複数配置したりすると、ボタン同時押しができてしまうため、スクリプトで制御しなければいけません。また、連打対策もしておかないと何度も押されてしまうので、注意が必要です。
シーンが切り替わる際にもフェードなどを入れているとフェード中に押されてしまうので、対策を入れる必要があります。
<Buttonのインスペクター>
Interactable
このボタンが有効か無効かの状態です。チェックが外れているとデフォルトではグレーがかって押せないような雰囲気になります(設定によって変わります)。enabledとの違いは、このグレーがかかるかどうかです。
Transition
ボタンを押した際やボタンが無効な状態変化を設定します。
ボタンの状態に関わらず何も変わりません。
ボタンの状態変化を色で表します。
・Target Graphic
色を変えるImageを指定します。
・Normal Color
通常の状態の色を指定します。
・Highlighted Color
マウスカーソルがボタンにのったときや、カーソルキー、ジョイスティックなどでボタンが選択されている状態の色を指定します。
・Pressed Color
ボタンが押された時の状態の色を指定します。
・Disable Color
ボタンが無効な状態の色を指定します。
・Color Multiplier
設定した色の明るさの倍率を設定します。各ColorにこのColor Multiplierの値が乗算されるのですが、Unityの標準のUIシェーダーではColorはColor Multiplierを使っても255を超えられませんので元の画像を暗く作っておく必要があります。
・Fade Duration
色が変化し終わるまでの秒数を指定します。値が小さいほど素早く変化します。
ボタンの状態変化を画像で表します。各種パラメータにその際の画像を指定します。
・Target Graphic
画像を変えるImageを指定します。
・Highlighted Sprite
マウスカーソルがボタンにのったときや、カーソルキー、ジョイスティックなどでボタンが選択されている状態の時に変わる画像を指定します。
・Pressed Sprite
ボタンが押された状態の時に変わる画像を指定します。
・Disable Sprite
ボタンが無効な状態の時に変わる画像を指定します。
ボタンの状態変化をアニメーションで表します。各種パラメータにその際、アニメーターに送るTriggerの名前を指定します。そのため、Animatorと一緒に使用されます。
・Highlighted Trigger
マウスカーソルがボタンにのったときや、カーソルキー、ジョイスティックなどでボタンが選択されている状態の時に変わる画像を指定します。
・Pressed Trigger
ボタンが押された状態の時に変わる画像を指定します。
・Disable Trigger
ボタンが無効な状態の時に変わる画像を指定します。
・Auto Generate Animation
このゲームオブジェクトにAnimatorがセットされていない場合、このボタンを押すことで自動でAnimatorの設定をやってくれます。
↓押した後
↓作成されたアニメーターの中身です。
ただし、各種アニメーションの中身には何も設定されていないのでアニメーションは自分で設定する必要があります。
Navigation
Buttonに限らず、選択可能なUGUIの選択状態をどういった順番にするのかを指定できます。Tabキーや上下左右のボタンを押した時、次に選択するのがどのUGUIにするのかということを決めます。
・None
選択状態は移行しません。
・Horizontal
水平方向に選択状態を移行します。
・Vertical
垂直方向に選択状態を移行します。
・Automatic
Unityが自動で選んでくれた選択状態へ移行します。
・Explicit
次へ移行する選択状態を自分で指定します。↓の各種要素の中に次へ移行するオブジェクトを選択します。
・Visualize
このボタンを押すことで次へ移行する選択状態の導線を視覚化してくれます。これはゲーム本体には関係なく、編集をやりやすくしてくれる機能です。
OnClick
ボタンが押された時のイベントを発行します。+を押すことでイベントを送る対象を増やし、−で減らすことができます。
・Off
このボタンを押してもイベントは発生しません
・Runtime Only
ゲームを再生中のみイベントを発生させます。
・Editor And Runtime
ゲームを再生していなくなても再生していてもイベントを発生させます。
・イベントを送るゲームオブジェクト
ボタンが押された時、イベントを送るにはイベントを送るゲームオブジェクトを選択します。
ゲームオブジェクトは+を押すことで増やすことができます。
ゲームオブジェクトを設定したら、そのゲームオブジェクトについているコンポーネントの中に存在する関数を選択して、その関数に対してイベントを送ることができます。
呼び出される関数はpublicで戻り値はvoidである必要があります。また引数をint,float,string,bool,Objectの中からいづれか一つ選ぶこともできます。
ボタンが押された時、その関数が呼ばれます。例えば
public void TestClick()
{
Debug.Log("ボタン押した");
}
という関数を書いたスクリプトを書いてゲームオブジェクトにアタッチして、TestClickを選択すれば、ボタンを押した時に、コンソールに「ボタンを押した」と表示されます。
<Buttonのスクリプトの使い方>
名前空間 | UnityEngine.UI |
型 | class |
継承 | UI.Selectable |
デフォルトの状態から使用するには
using UnityEngine.UI;
と記述するか
UI.Text
とする必要があります。
onClick
ボタンが押されたときに呼び出されるUnityEventです。
ボタンを押すというのは、押し込んだ後、離した瞬間を指します。
型 UI.Button.ButtonClickedEvent型
○ 使い方
ボタンを押した際にする処理を追加したい場合などに使用します。インスペクターからも設定できるので、動的に設定したい場合などに使用します。(インスタンシェード時など)
//ボタンを押した場合の処理を追加します。 Button b = GetComponent<Button>(); b.onClick.AddListener(()=> Debug.Log("ボタンを押した"));
OnPointerClick
一応、外からこの関数を呼び出すと、あたかもボタンを押したような挙動を取ることも可能ですが、この関数は通常の関数のようには使用しません。
UnityEngine.EventSystems.IPointerClickHandlerを継承したスクリプトにOnPointerClickという関数を作り、引数にPointerEventDataを受け取るようにし、Buttonと同じゲームオブジェクトにそのスクリプトをアタッチすると、ボタンがタップ、もしくはマウスによるクリックによって押された際、その関数が呼ばれます。
1. ボタンのタップやマウスクリックによる情報 : EventSystems.PointerEventData型
なし
○ 使い方
ボタンに対するイベントを独自に制御したい場合などに使用します。
//ボタンに対するイベントを独自制御するスクリプトを作成します。 using UnityEngine; using UnityEngine.EventSystems; public class Test : MonoBehaviour, IPointerClickHandler { public void OnPointerClick( PointerEventData eventData ) { Debug.Log( "ボタンを押した" ); } }
↑のようなスクリプトをButtonと同じゲームオブジェクトにアタッチし、ボタンを押すと、この関数の中に入ってきます。この時のボタンを押すの定義は押し込んで離した瞬間です。
OnSubmit
機能としては↑のOnPointerClickとほぼ一緒です。違いはタップやマウスによるクリックではなく、Input Managerから設定したSubmitボタンを押して離した時動作します。
1. ボタンのタップやマウスクリックによる情報 : EventSystems.PointerEventData型
なし
○ 使い方
ボタンに対するイベントを独自に制御したい場合などに使用します。
//ボタンに対するイベントを独自制御するスクリプトを作成します。 using UnityEngine; using UnityEngine.EventSystems; public class Test : MonoBehaviour, IPointerClickHandler { public void OnSubmit( PointerEventData eventData ) { Debug.Log( "決定ボタンを押した" ); } }
↑のようなスクリプトをButtonと同じゲームオブジェクトにアタッチし、ボタンを押すと、この関数の中に入ってきます。この時のボタンを押すの定義は押し込んで離した瞬間です。
関数などがよくわからない方は↓の記事を参考にしてみてください