強火で進め

このブログではプログラム関連の記事を中心に書いてます。

Unityに三角ポリゴン2つのPanelを作成する機能を追加する

こちらの記事のプログラムの機能拡張版。自分で同様なプログラムを作る時の参考にする場合にはこちらのプログラムから読むことお勧めします。

プログラム

こちらのプログラムのファイルを Editor フォルダに格納して下さい。

(2012/08/30 追記)
以下のプログラムは Prefab 化した時に問題が有ります。修正版を書きましたのでこちらを参照下さい。
(追記ここまで)

【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();
	}
}

操作説明

メニューから「Create Object」→「Panel」と選択すると設定を行うウィンドウが表示されます。設定を行い、「Create」ボタンを押すとPanelが生成されます。

【設定項目の説明】
Texture:テクスチャの設定。テクスチャを貼らない場合には選択しないでOK。
Normal Direction:法線(Panel)の向きを指定。

プログラム作成時の参考サイト

Procedural generated mesh in Unity « Morten Nobel's Blog
http://blog.nobel-joergensen.com/2010/12/25/procedural-generated-mesh-in-unity/

Procedural generated mesh in Unity part 2 with UV mapping « Morten Nobel's Blog
http://blog.nobel-joergensen.com/2011/04/05/procedural-generated-mesh-in-unity-part-2-with-uv-mapping/