こちらのエントリーで自前でPanelオブジェクトを作成するサンプルを紹介しました。
しかし、こちらのコメント欄にまささんよりプレハブ化するとmeshが無くなってしまうとのご指摘を頂きました。実際に試してみると確かに無くなってしまいました。
調査した所、本来はこちらのサイトに書かれてるコードの様に AssetDatabase への保存が必要な様です。
CreatePlane - Unify Community Wiki
http://wiki.unity3d.com/index.php?title=CreatePlane
こちらを参考に修正したコードがこちら。
【CreatePanel.cs】
using UnityEditor;
using UnityEngine;
using System.Collections;
public class CreatePanel : MonoBehaviour
{
[MenuItem ("Create Object/Panel")]
static void Create ()
{
GameObject newGameobject = new GameObject ("CustomPanel");
MeshRenderer meshRenderer = newGameobject.AddComponent<MeshRenderer> ();
meshRenderer.material = new Material (Shader.Find ("Diffuse"));
//meshRenderer.sharedMaterial.mainTexture =
// (Texture)AssetDatabase.LoadAssetAtPath("Assets/test.png", typeof(Texture2D));
MeshFilter meshFilter = newGameobject.AddComponent<MeshFilter> ();
meshFilter.mesh = new Mesh ();
Mesh mesh = meshFilter.sharedMesh;
mesh.name = "CustomPanel";
mesh.vertices = new Vector3[]{
new Vector3 (-0.5f, 0.5f, 0.0f),
new Vector3 (0.5f, 0.5f, 0.0f),
new Vector3 (0.5f, -0.5f, 0.0f),
new Vector3 (-0.5f, -0.5f, 0.0f)
};
mesh.triangles = new int[]{
0, 1, 2,
2, 3, 0
};
mesh.uv = new Vector2[]{
new Vector2 (0.0f, 1.0f),
new Vector2 (1.0f, 1.0f),
new Vector2 (1.0f, 0.0f),
new Vector2 (0.0f, 0.0f)
};
mesh.RecalculateNormals (); // 法線の再計算
mesh.RecalculateBounds (); // バウンディングボリュームの再計算
mesh.Optimize ();
AssetDatabase.CreateAsset (mesh, "Assets/" + mesh.name + ".asset");
AssetDatabase.SaveAssets ();
}
}最後に追加した以下の記述で AssetDatabase に Asset の作成と保存を行なっています。
AssetDatabase.CreateAsset (mesh, "Assets/" + mesh.name + ".asset"); AssetDatabase.SaveAssets ();
後、こちらのエントリーも同様な問題を持っていたので修正版を書いて置きます。
Unityに三角ポリゴン2つのPanelを作成する機能を追加する - 強火で進め
http://d.hatena.ne.jp/nakamura001/20120818/1345304258
【WizardCreatePanel.cs】
using UnityEditor;
using UnityEngine;
using System.Collections;
public enum NormalDirction
{
x_plus,
x_minus,
y_plus,
y_minus,
z_plus,
z_minus,
};
public class WizardCreatePanel : ScriptableWizard
{
public Texture2D texture;
public NormalDirction normalDirction = NormalDirction.z_minus;
[MenuItem ("Create Object/Panel")]
static void Init ()
{
ScriptableWizard.DisplayWizard<WizardCreatePanel> ("Create Custom Panel", "Create");
}
void OnWizardCreate ()
{
CreatePanel ();
}
void CreatePanel ()
{
GameObject newGameobject = new GameObject ("CustomPanel");
MeshRenderer meshRenderer = newGameobject.AddComponent<MeshRenderer> ();
meshRenderer.material = new Material (Shader.Find ("Diffuse"));
if (texture != null) {
meshRenderer.sharedMaterial.mainTexture = texture;
}
MeshFilter meshFilter = newGameobject.AddComponent<MeshFilter> ();
meshFilter.mesh = new Mesh ();
Mesh mesh = meshFilter.sharedMesh;
mesh.name = "CustomPanel";
Vector3[] vertices = new Vector3[]{
new Vector3 (-0.5f, 0.5f, 0.0f),
new Vector3 (0.5f, 0.5f, 0.0f),
new Vector3 (0.5f, -0.5f, 0.0f),
new Vector3 (-0.5f, -0.5f, 0.0f)
};
Quaternion quateRot = Quaternion.Euler (0.0f, 0.0f, 0.0f);
switch (normalDirction) {
case NormalDirction.x_plus:
quateRot = Quaternion.Euler (0.0f, 270.0f, 0.0f);
break;
case NormalDirction.x_minus:
quateRot = Quaternion.Euler (0.0f, 90.0f, 0.0f);
break;
case NormalDirction.y_plus:
quateRot = Quaternion.Euler (90.0f, 0.0f, 0.0f);
break;
case NormalDirction.y_minus:
quateRot = Quaternion.Euler (270.0f, 0.0f, 0.0f);
break;
case NormalDirction.z_plus:
quateRot = Quaternion.Euler (0.0f, 180.0f, 0.0f);
break;
case NormalDirction.z_minus:
quateRot = Quaternion.Euler (0.0f, 0.0f, 0.0f);
break;
}
for (int v=0; v<vertices.Length; v++) {
vertices [v] = quateRot * vertices [v];
}
mesh.vertices = vertices;
mesh.triangles = new int[]{
0, 1, 2,
2, 3, 0
};
mesh.uv = new Vector2[]{
new Vector2 (0.0f, 1.0f),
new Vector2 (1.0f, 1.0f),
new Vector2 (1.0f, 0.0f),
new Vector2 (0.0f, 0.0f)
};
mesh.RecalculateNormals ();
mesh.RecalculateBounds ();
mesh.Optimize ();
AssetDatabase.CreateAsset (mesh, "Assets/" + mesh.name + "_" + normalDirction.ToString() + ".asset");
AssetDatabase.SaveAssets ();
}
}