Deca-pod.jp

Anything

Unity UI Canvasの子要素のポジション問題

UnityのUIシステム、大変お世話になっております。

特に問題もなくUIを作り始めた矢先、それは、Prefab化したボタンをInstantialした時に起こりました。

先ず大前提として全てのUI要素はCanvasの子要素でなくてはならないというルールがあります。

そのため私はこんなコードを書きました。

GameObject prefab = (GameObject)Resources.Load ("Prefabs/button");
                Instantiate (prefab);
                prefab.transform.parent = _ParentObject.transform; 
 

簡単に説明をするとResource.Loadでプレハブのパスを渡してInstantiateの引数にprefabを渡す。その後GameObject Prefabの親要素(Parent)に予めクラス変数として宣言していた_parentObjectを指定しています。
因みにResource.Loadの戻り値はObject型になるのでGameObject型にキャストしています。

Instantiateした後にParentを指定するという愚行です。

気を取り直してこのように修正をしました。

GameObject obj = (GameObject)Resources.Load ("Prefabs/ToOutSidePlate");
                        GameObject prefab = (GameObject)Instantiate (obj);
                        prefab.transform.SetParent (parentObject.transform); 

SetParentは引数に渡したオブジェクトの子要素としてオブジェクトを作成する関数です。

これをビルドしてみると、Canvasの子要素としてボタンを作成することには成功しましたが、Unityでは子要素は親要素のポジションを追従してしまうのでボタンを思ったポジションに表示することができませんでした。

解決策としてはSetParentの第二引数にfalseを渡せばOkです。

GameObject obj = (GameObject)Resources.Load ("Prefabs/ToOutSidePlate");
                        GameObject prefab = (GameObject)Instantiate (obj);
                        prefab.transform.SetParent (parentObject.transform,false);

以上、開発室から今日の報告を終わります。