前提
Unity3DでPredabにPrefabをネストしたいんだけどリンク切れちゃうので、Prefabをロードする空のObjectを用意する、みたいなことをやったとき、Gizmosを表示しておかないとどういうオブジェクトがどこに表示されるのかよく分からないよ!
解決方法
PrefabのローダーでGizmosをカスタマイズします。
Meshがあるものに関してはそのMeshを表示し、それ以外は一旦適当なGizmosで代用しておきます。
実装
using UnityEngine;
public class PrefabLoader : MonoBehaviour {
public GameObject prefab;
public Color color;
static readonly float alpha = 0.6f;
static readonly Color defaultColor = new Color(1f, 0f, 0f, alpha);
static readonly Vector3 labelOffset = new Vector3(0f, 1f, 0f);
void Start () {
var obj = Instantiate(prefab, Vector3.zero, Quaternion.identity) as GameObject;
obj.transform.SetParent(transform, false);
}
void OnDrawGizmos () {
Gizmos.color = defaultColor;
// colorのAlphaが0じゃないとき上書き
if (!color.a.Equals(0f)) {
Gizmos.color = color;
}
if (prefab != null) {
#if UNITY_EDITOR
UnityEditor.Handles.Label(transform.position + labelOffset, prefab.name);
#endif
// 3Dオブジェクトの場合はMeshを表示する
if (prefab.GetComponent<MeshFilter>() != null) {
Gizmos.DrawMesh(
prefab.GetComponent<MeshFilter>().sharedMesh,
transform.position,
prefab.transform.rotation,
prefab.transform.localScale);
} else {
Gizmos.DrawSphere(transform.position, alpha);
}
}
}
}
このスクリプトをGameObjectに追加して、表示したいprefabをInspectorで指定すれば完了。
色を変えたい場合はcolorもInspectorで指定できます。