にほんブログ村 IT技術ブログ IT技術メモへ ブログ村 IT技術ブログへ ブログ村 オヤジ日記へ ブログランキング・にほんブログ村へ

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"); }
} }