この記事でのバージョン
Unity 2017.1.0f3
はじめに
タイトル通りなのですが、uGUIのCanvsを非Activeにした状態で
ゲームを開始するとRect Transformの諸々0になります。
一度Activeにすると諸々の数値は自動で設定され、再度非Activeにしてもそのままですが、
エディタを実行すると0に戻ります。
困る事と解決法
これで何が困るの?という話ですが、
Activeにした際に諸々の値は自動で設定されるため基本的に困りません。
ただ、例えば以下のように3Dオブジェクトに合わせてUIを出そうとした際に、
//キューブの上にテキストを表示する
_text.transform.position = RectTransformUtility.WorldToScreenPoint (Camera.main, _cube.transform.position);
開始時からずっと非Activeだったキャンバスの表示と同時に位置を設定するとおかしくなります。
//キャンバスを表示(Activeにしても諸々の数値が即反映されるわけではない) _canvas.SetActive(true); //キューブの上にテキストを表示する(_canvasの諸々の数値は0のままだから位置がズレる) _text.transform.position = RectTransformUtility.WorldToScreenPoint (Camera.main, _cube.transform.position);
上記の通り、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); }
おわりに
今回ご紹介した現象は、以下のような注意書き(?)があることから、おそらく仕様だと思われます。
ほとんど気にする必要は無いと思いますが、覚えておくといざという時にハマらずに済みます。