(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

Canvasを非Activeにした状態で開始するとRect Transformの諸々が0になる件【Unity】【uGUI】【トラブルシューティング】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2017.1.0f3


はじめに

タイトル通りなのですが、uGUIのCanvsを非Activeにした状態で

ゲームを開始するとRect Transformの諸々0になります。


f:id:kan_kikuchi:20170827183429j:plain


一度Activeにすると諸々の数値は自動で設定され、再度非Activeにしてもそのままですが、


f:id:kan_kikuchi:20170827184126g:plain


エディタを実行すると0に戻ります。


f:id:kan_kikuchi:20170827184315g:plain


困る事と解決法

これで何が困るの?という話ですが、

Activeにした際に諸々の値は自動で設定されるため基本的に困りません。


ただ、例えば以下のように3Dオブジェクトに合わせてUIを出そうとした際に、

//キューブの上にテキストを表示する
_text.transform.position = RectTransformUtility.WorldToScreenPoint (Camera.main, _cube.transform.position); 

f:id:kan_kikuchi:20170827185223j:plain


開始時からずっと非Activeだったキャンバスの表示と同時に位置を設定するとおかしくなります。

//キャンバスを表示(Activeにしても諸々の数値が即反映されるわけではない)
_canvas.SetActive(true);

//キューブの上にテキストを表示する(_canvasの諸々の数値は0のままだから位置がズレる)
_text.transform.position = RectTransformUtility.WorldToScreenPoint (Camera.main, _cube.transform.position); 

f:id:kan_kikuchi:20170827185240j:plain


上記の通り、SetActiveにしても諸々の数値が即反映されるわけではないので、

うまく位置が設定出来ません。


このような場合の解決方法は単純で、

一旦Activeにする、またはActiveのタイミングを変えてしまえばいいだけです。

例えば、AwakeでActiveにしてからStartで非Activeにしたり(両方AwakeまたはStartでは駄目)、

private void Awake (){
  //一旦Activeにする
  _canvas.SetActive(true);
}

private void Start () {
  //すぐに非アクティブにする。Startなら画面に映る心配もない
  _canvas.SetActive(false);//起動後に非アクティブにしても数値は0にはならない
}


キャンバスはAwakeで表示して、Startでテキストの位置を設定したりする方法があります。

private void Awake (){
   //先にActiveにする
  _canvas.SetActive(true);
}

private void Start () {
  //キューブの上にテキストを表示する
  _text.transform.position = RectTransformUtility.WorldToScreenPoint (Camera.main, _cube.transform.position); 
}



おわりに

今回ご紹介した現象は、以下のような注意書き(?)があることから、おそらく仕様だと思われます。


f:id:kan_kikuchi:20170827190819j:plain


ほとんど気にする必要は無いと思いますが、覚えておくといざという時にハマらずに済みます。