本日は Unity の技術調査枠です。
UnityのMeshクラスで作成したメッシュをAssetsフォルダに出力する手順を記事にします。
Mesh
スクリプトからメッシュの作成や変更を行うUnityEngineのクラスです。
Meshクラスには頂点データや面データが含まれていてサーフェス形式の3Dモデルを形成します。
docs.unity3d.com
作成したメッシュはMeshFilterに引き渡して各種コンポーネントがアクセスできるようにします。
メッシュをレンダリング(描画)するにはMeshRendererコンポーネントを利用します。
docs.unity3d.com
docs.unity3d.com
作成したメッシュをAssetsフォルダに出力する場合はAssetDatabase.CreateAsset関数を使用します。
docs.unity3d.com
docs.unity3d.com
Color color = Color.red; Material material = new Material(Shader.Find("Specular")); AssetDatabase.CreateAsset(material, "Assets/Artifacts/material.mat"); material.SetColor("_Color", color); AssetDatabase.SaveAssets();
サンプルスクリプト
以下の前回記事を参考にシーンの再生と共にCubeの形状を作成するスクリプトを作成しました。
bluebirdofoz.hatenablog.com
今回は更に、作成したCubeのメッシュをAssetsフォルダに出力するボタンをEditor拡張で追加しました。
・CubeMesh.cs
using System.Collections.Generic; using UnityEditor; using UnityEngine; [RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshRenderer))] public class CubeMesh : MonoBehaviour { [SerializeField] private Material _material; void Start() { // メッシュを作成 Mesh mesh = new Mesh(); // 頂点リストを作成 List<Vector3> vertices = new List<Vector3> { new Vector3(1.0f, 1.0f, 1.0f), new Vector3(-1.0f, 1.0f, 1.0f), new Vector3(-1.0f, -1.0f, 1.0f), new Vector3(1.0f, -1.0f, 1.0f), new Vector3(1.0f, -1.0f, -1.0f), new Vector3(-1.0f, -1.0f, -1.0f), new Vector3(-1.0f, 1.0f, -1.0f), new Vector3(1.0f, 1.0f, -1.0f), }; // 面を構成するインデックスリストを作成 List<int> triangles = new List<int> { 0, 1, 2, // 奥面 0, 2, 3, // 奥面 4, 5, 6, // 前面 4, 6, 7, // 前面 0, 4, 7, // 右面 0, 3, 4, // 右面 6, 2, 1, // 左面 6, 5, 2, // 左面 6, 1, 0, // 上面 7, 6, 0, // 上面 4, 3, 2, // 下面 5, 4, 2, // 下面 }; // メッシュに頂点を登録する mesh.SetVertices(vertices); // メッシュに面を構成するインデックスリストを登録する mesh.SetTriangles(triangles, 0); // 作成したメッシュをメッシュフィルターに設定する MeshFilter meshFilter = GetComponent<MeshFilter>(); meshFilter.mesh = mesh; // メッシュにマテリアルを設定する MeshRenderer meshRenderer = GetComponent<MeshRenderer>(); meshRenderer.material = _material; } #if UNITY_EDITOR // 作成したCubeのメッシュをAssetsフォルダに出力するためのエディタ拡張 [CustomEditor(typeof(CubeMesh))] public class CubeMeshEditor : UnityEditor.Editor { public override void OnInspectorGUI() { base.OnInspectorGUI(); var cubeMesh = target as CubeMesh; // 生成したMeshをAssetフォルダにエクスポートする if (GUILayout.Button("Export Mesh")) { if (!Application.isPlaying) return; if (cubeMesh is null) return; var mesh = cubeMesh.GetComponent<MeshFilter>().sharedMesh; AssetDatabase.CreateAsset(mesh, "Assets/Sandbox/MeshTest/ExportMesh/CubeMesh.asset"); AssetDatabase.SaveAssets(); } } } #endif }
シーンを再生すると、メッシュが構築されてCubeが生成されます。
この状態でサンプルスクリプトのInspectorに表示されている[Export Mesh]ボタンを押下すると以下のフォルダにAssetsファイルが出力されます。
Assets/Sandbox/MeshTest/ExportMesh/CubeMesh.asset
出力されたCubeMesh.assetを確認すると、Cubeの形状のメッシュデータが確認できます。