公開日:2017年11月17日
使用Unity Version:2017.2.0f3
UnityのuGUIのイベント、今回はButtonのクリックまたはタップ、Toggleの切り替えについて記述します。
イベントを受け取る Scriptの作成
まずイベントを受け取るScriptを定義します。
[EventCatcher.cs] using UnityEngine; public class EventCatcher : MonoBehaviour { // Buttonのイベント取得 public void OnButtonClicked() { Debug.Log("Click Button"); } }
Sceneに、空のEventObjectを配置し、Scriptをコンポーネントとして追加します。本投稿では空のEventObjectに設定しますが、追加先は他のGameObject(Canvasなど)でも構いません、アプリケーションに合わせて下さい。
Buttonクリックイベント
まずSceneにCanvasを追加します。Canvasを追加すると同時にEventSystemも追加されます。このEventSystemがイベント検知などを内部的に行うようです。
ちなみに、別のSceneにCanvasだけコピーすると、Buttonクリックなどのイベントが発生しなくなります。その場合は、手動でEventSystemを追加すればイベントが発生するようになります。
Buttonを配置し、Inspectorにある「Button → OnClick () → +」をクリックしてイベントの通知先を追加します。
追加された項目の、以下の部分をクリックし、イベントの通知先のGameObjectを設定します。
次にクリックされた時に呼び出される関数を設定します。
今回は「EvetCatcherのOnButtonClicked」を選択します。
再生して、Buttonをクリックすると、 Consoleにログが出力されます。
Consoleが表示されていない場合は「メニューのWindow → Console」で表示できます。
Toggleの切り替えイベント
CanvasにToggleを配置し、Inspectorにある「Button → On Value Changed (Boolean) → +」をクリックしてイベントの通知先を追加します。
「On Value Changed (Boolean)」に対応する関数をScriptに追加します。
[EventCatcher.cs] using UnityEngine; public class EventCatcher : MonoBehaviour { // Buttonのイベント public void OnButtonClicked() { Debug.Log("Click Button"); } // Toggleのイベント public void OnToggleChanged(bool v) { Debug.Log("Click Toggle[" + v + "]"); } }
Buttonの時と同じように「EVentCatcherのOnToggleChanged(bool)」を選択します。
再生して、Toggleをクリックすると、 Consoleにログが出力されます。
うまくいったように思うのですが、よく見ると引数vの値が常にFalseです!
Unityのアニュアルには以下のように記述されているので、これで正しいように思えるのですが。。。
A UnityEvent that is invoked when the Toggle is clicked. The event can send the current state as a bool type dynamic argument.
ネットで調べて見ると、Sliderで同じような現象が発生し、対処した方がいました。その方の情報を参考にScriptを書き換えます。
[EventCatcher.cs] using UnityEngine; using UnityEngine.UI; public class EventCatcher : MonoBehaviour { // Buttonのイベント public void OnButtonClicked() { Debug.Log("Click Button"); } // Toggleのイベント、引数はtoggle public void OnToggleChanged(Toggle toggle) { // ToggleのON/OFFはisONで判断できる Debug.Log("Click Toggle[" + toggle.isOn + "]"); } }
「On Value Changed (Boolean)」に対応する関数を再設定します。
引数が「None(Toggle)」になりますので、 Toggle自身をドラッグします。
再生して、Toggleをクリックします。
今度はちゃんと、 Toggleの状態が取得できました。