//tips
//Prefab内に組み込んだUIの表示方法
Prefab内に組み込んだUIをprefab生成と同時に生成できない問題を考えていく。
一旦シンプルな下記スクリプトでUIをprefab化し生成してみた。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PrefabGene : MonoBehaviour
{
//Canvasをセット
// public GameObject canvasObject;
public GameObject prefab;
void Start()
{
//GameObjectを生成、生成したオブジェクトを変数に代入
//GameObject Prefab = (GameObject)Instantiate(prefab);
GameObject Prefab = Instantiate(prefab);
//Prefab.transform.SetParent(canvasObject.transform, false);
Prefab.transform.SetParent(this.transform, false);
}
}
次にCubeオブジェクトに上のスクリプトをつけたcanvasを子要素に加えたときの反応を確認した。この場合はきちんとprefabは生成された。
今度は、prefabを分解し、canvasまでを含めたものをprefabにする。シーン上に存在するcubeの方にPrefabGeneスクリプトを添付する。
Canvasprefab内のPlayerUIの座標を調整することで問題なく表示された。
ここで気がかりなのは生成されたcanvasの座標がずれてしまうことで、これはcanvasをprefab化した際のインスペクターRectTransformで修正しておく。
では、本命の先のcanvasがついたcubeごとprefab化してしまう作業に取り掛かる。
SampleScene3ではこの部分でエラーが出ていたはずなので、今回のシンプルな形で見直し、成功した形を適応する。
シーン上に空オブジェクトを作成し、PrefabGeneスクリプトをアタッチすることで、cubeとそのUIは表示することができたが下記エラー表示がでた。
UnassignedReferenceException: The variable playerprefab of PrefabGene has not been assigned.
You probably need to assign the playerprefab variable of the PrefabGene script in the inspector.
UnityEngine.Object.Instantiate[T] (T original) (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEngineObject.bindings.cs:275)
PrefabGene.Start () (at Assets/PrefabGene.cs:17)
実際にprefab内容は表示されるのでプログラムの読み込み順序のエラーではないかと考え、void Start()ではなく、void Awake()に書き換えたが同じエラーが発生。
これはprefab内にも同じPrefabGeneがついており、取り忘れていたのが要因だった。
SampleScene3との違いは生成スクリプトにPrefab.transform.SetParent(this.transform, false);が含まれているかいないかのように思われるので、下記にSetParentに該当するものを追加する。
var v = new Vector3(Random.Range(-3f, 3f), Random.Range(1f, 2f));
PhotonNetwork.Instantiate("GamePlayer", v, Quaternion.identity);
下記のようにSampleスクリプトを変更することでシーン移行時にUIが表示できるようになったがプレイヤーがpanel下に落下するようになってしまった。
GameObject Prefab = PhotonNetwork.Instantiate("GamePlayer", v, Quaternion.identity);
Prefab.transform.SetParent(this.transform, false);
おそらくtransform.SetParentで空オブジェクトであるSampleオブジェクトの座標(0,0,0)に問題があると思われるため、Sampleオブジェクトを各プレイヤーのシーンごとにPlane上かつランダムな座標に移動させるようにすることで対応できそう。
また、表示されているUIが豆粒大なのでインスペクターの表示を見直していく。