Try Unity _2 GUITextureのクリックイベント1
前回の記事、「UNITYをはじめてみる GUITexture」より、
単に画像を読み込んで表示するだけならGUITextureはとっても簡単で、
便利だと書きましたが、いざこのGUITextureにクリックなどのイベントを与え、
処理を行おうとすると、いろいろと面倒であることがわかったので
その事について書こうと思います。
まず、GUITextureのクリックイベントを検知するには
下記のようなスクリプトを作成し、GUITextureのオブジェクトにアタッチすることで
クリックイベントを検知することができました。
void Update () {
//マウスDownイベントを検知
if (Input.GetMouseButtonDown(0))
{
//シーン上の全GUIElementに対して当たり判定を行う
GUIElement hit = guiLayer.HitTest(Input.mousePosition);
if (Input.GetMouseButtonDown(0) && hit != null)
{
Debug.Log(hit.name);
}
}
}
しかーし。この感じでボタンとして使用する画像ファイルをGUITextureで
複数作成し、上記のスクリプトをアタッチ後、実行してみると、Debug.Logが
3つ表示されました。
そーです。Input.GetMouseButtonDown(0)はマウス押下を検出するイベントなので、
こいつをアタッチした画像ファイル全てが感知(検知)してしまうんですねー。
「UnityのGUIはOnGUI()の中に書くのが基本です」
ようやく上記の意味がつかめてきました。
スクリプトを下記のように修正し、GUITextureを一旦削除して、
空のゲームオブジェクトを作成(Create Empty)し、スクリプトをアタッチ、
インスペクタービューでicon1に画像ファイルをドラッグアンドドロップで指定
してあげると、画像ファイルが表示され、、無事ひとつのオブジェクトだけを
検知することが出来ました。
using UnityEngine; using System.Collections; public class bt_clickgui : MonoBehaviour { public Texture2D icon1; void Start () { } void Update () { } void OnGUI()
{
if (GUI.Button(new Rect(32, 582, 320, 240), icon1)) { print("クリック1"); } } }
ちなみに、僕はこのあと、 2つ目の画像ファイルを表示したいときは、
別のスクリプトを用意しないといけないのか・・と思いましたが、そんな
面倒なことはなかったです。下記のように2つ目のアイコンをonGUIの中に
指定してあげれば、ひとつのスクリプトで簡単に指定することが出来ました。
GUI.Button(new Rect(x位置, y位置, 幅, 高さ), ボタンに表示するアイコンファイル)
GUItextureは左下指定なのに、GUI.Buttonの原点は右上みたいですね。
なぜなんでしょう・・・・。分かる方いたら教えてくだされ。
using UnityEngine; using System.Collections; public class bt_clickgui : MonoBehaviour { public Texture2D icon1; //1つ目の画像ファイル
public Texture2D icon2; //2つ目の画像ファイル
void Start () { } void Update () { } void OnGUI()
{
//1つ目のアイコンの指定
if (GUI.Button(new Rect(32, 582, 320, 240), icon1)) { print("クリック1");
}
//2つ目のアイコンの設定
if (GUI.Button(new Rect(370, 582, 320, 240), icon2)) { print("クリック2"); }
} }