読者です 読者をやめる 読者になる 読者になる

n-yoda's blog

主にUnity3Dに関するあんまり技術的じゃないメモ的な何かを書いています。

OnGUIでの描画とイベント処理の順番

「OnGUI、描画とイベント処理の順番が逆だから、ポップアップ表示とか辛すぎ使えない」などと勘違いしていましたがどうやら違うようです。

GUI.depthです。

こんな感じで使います。

public class GUIDepthDemo : MonoBehaviour
{
	// インスペクターで設定
	public int layer;
	public Rect buttonRect;
	public Rect textureRect;
	public Texture texture;
	
	void OnGUI ()
	{
		GUI.depth = layer;
		// 普通のボタン
		if (GUI.Button (buttonRect, layer.ToString ())) {
			// イベント処理
		}
		
		// 自作UIはこんな感じ
		GUI.DrawTexture (textureRect, texture);
		if (Event.current.type == EventType.MouseDown
		&& textureRect.Contains (Event.current.mousePosition)) {
			//他のイベントを抑制
			Event.current.Use ();
			//イベント処理
		}
	}
}

・depthが小さいほど前面に表示され、クリック判定も優先される!

・ただし、一つのOnGUIの中でGUI.depthを2回呼ぶと上手く動かない…?
 1クラス1depthを守るのが無難です。
GUI.depthのセッターで、まだ呼ばれていないOnGUIを呼ぶようになってるのかも)

Event.current.Use ();

・自前でクリック判定をする場合はEventをUseすることで、以降のクリック判定を抑制できる。