// Encoding UCS-2 LE
using UnityEngine;
using System.Collections;
/* DrawMeshとCombineMeshesのテスト
meshListに複数のメッシュを指定して描画する
isCombineをtrueにすると、その瞬間のmeshList、offsetList、rotationListからCombineMeshesを行い
isCombineがtrueの間、Combineしたメッシュを描画する
*/
[ExecuteInEditMode]
public class DrawMeshScript : MonoBehaviour {
public Material useMaterial; // メッシュを描画する時に使うマテリアル
public Mesh[] meshList; // 描画するメッシュのリスト
public Vector3[] offsetList; // メッシュ個別のオフセット
public Vector3[] rotationList; // メッシュ個別の回転
public bool isCombine = false; // trueにするとCombineしたメッシュを利用して描画する
private bool isCreateCombine = false; // Combineしたメッシュを作ったかどうかのフラグ
private Mesh combineMesh; // Combineしたメッシュの格納先
void Awake () {
// メッシュの作成
combineMesh = new Mesh();
}
void Update () {
// Combineしたメッシュの作成
if (isCombine == true && isCreateCombine == false) {
CombineInstance[] combine = new CombineInstance[meshList.Length];
for (int i = 0; i < meshList.Length; ++i) {
combine[i].mesh = meshList[i];
combine[i].transform = CalcMeshMatrix(i, Matrix4x4.identity);
}
combineMesh.CombineMeshes(combine);
}
isCreateCombine = isCombine;
}
// 個々のメッシュのMatrixを計算
Matrix4x4 CalcMeshMatrix (int index, Matrix4x4 parentMatrix) {
return Matrix4x4.TRS(
parentMatrix * (index < offsetList.Length ? offsetList[index] : Vector3.zero),
index < rotationList.Length ? Quaternion.Euler(rotationList[index]) : Quaternion.identity,
Vector3.one) * parentMatrix;
}
void LateUpdate () {
// Combineしている場合の描画
if (isCombine) {
Graphics.DrawMesh(combineMesh, transform.localToWorldMatrix, useMaterial, 0);
}
// Combineしていない場合の描画
else {
if (meshList == null) { return; }
Matrix4x4 thisMatrix = transform.localToWorldMatrix;
for (int i = 0; i < meshList.Length; ++i) {
Graphics.DrawMesh(meshList[i], CalcMeshMatrix(i, thisMatrix), useMaterial, 0);
}
}
}
}