[Unity,Dropdown]Dropdownのリストの描画順序がおかしいので対策してみた

UnityのuGUI(今はUnity UIっていうのかな?)でDropdownを使用した際にハマったこと。

かなり適当だけど、原因と対処法をまとめておきます。

 

※Unity5.3.0f4でのお話です。最新版では直っている可能性があります。

 

1.描画順位を上げてもUIの裏側に回ってしまう…

 

まずはどういう状況になっていたのか、↓の動画をご覧ください。

 


(どうでもいいけどでかいな…)

 

動画で分かる通り、Canvasで描画しているもの全ての裏に回ってしまっています。

canvasを変えても表示が変わらず、諦めて他の方法で実装しようと考えていたところ…

 

救 世 主 現 る

 

なるほど、確かによくよく見てみると、Dropdownをタップしたタイミングで、Dropdown Listなるものが…

dropdown3

 

そしてinspectorを見てみると…

 

dropdown4

 

何この普段の僕みたいな雑な設定の仕方!!

30000ってwww

 

というか、Unityさんとしては、SortingLayerはほとんど使わず、

Order in Layerで描画順を決めるのを想定しているのだろうか…

UIとかEnemyとかEffectとか分けまくってると、今回の罠にずばり引っかかります。

 

2.Override Sorting を false にしてしまおう

 

原因がわかってしまえば、対処はそんなに難しくないですよね。

ただ、問題があるとすれば、 Dropdown List が、リストを開いている間しか存在しないってことでしょうか。

 

↓のようなものを作って、DropdownにaddComponentすればOK!

DropdownManager.cs

using UnityEngine;
using System.Collections;

public class DropdownManager : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
		if (transform.FindChild ("Dropdown List") != null) {
			if (transform.FindChild ("Dropdown List").GetComponent<Canvas> ().overrideSorting == true) {
				transform.FindChild ("Dropdown List").GetComponent<Canvas> ().overrideSorting = false;
			}
		}
	}
}

Updateで毎回FindChild (“Dropdown List”)をしてるのが、個人的にはすごく気になるところだけど、
リストを閉じてるとDropdown Listが存在しないので、とりあえずはこれで対応しました。

適宜修正してね☆

 

 

3.余談

 

今回のことで初めて気づいたのだけど、canvasの中にcanvasを入れると、Sorting Layerとか変えられるんですね!

今まで、canvas内ではSorting Layerは一つで固定だと思っていたので、別のcanvasを作ったりしてました。

 

まだまだ知らない便利機能がいっぱいありそうです。

 

 

LINEで送る
Pocket

You can leave a response, or trackback from your own site.

2 Responses to “[Unity,Dropdown]Dropdownのリストの描画順序がおかしいので対策してみた”

  1. イテキ より:

    私もその罠に引っかかたんです。 Coroutineでsorting layerを変えようかなって思ったんですけど、やっぱりやり方がよろしくないのでやめました。 やはり自分でdropdownを作ることにしました。

  2. Saerom より:

    私はどうしてもFindChildを使いたくなかったので
    Templateオブジェクトに下記のスクリプトを追加しました。

    using UnityEngine;

    [RequireComponent(typeof(Canvas))]
    public class CanvasOverrideSortingFixer : MonoBehaviour {

    void Start() {
    GetComponent().overrideSorting = false;
    }
    }

Leave a Reply

*

Powered by WordPress | Designed by: wordpress themes 2011 | Thanks to Best WordPress Themes, Find WordPress Themes and