Slide 42
Slide 42 text
第 3 章 ファイトリーグにおける Unity のシーンアセット最適化 3.5 Mesh 結合
}
}
// メッシュの結合を開始
foreach (MeshRenderer renderer in renderers)
{
if (renderer == null) continue;
var filter = renderer.GetComponent();
if (filter == null) continue;
int indexOffset = vertices.Count;
Mesh mesh = filter.sharedMesh;
if (mesh == null) continue;
var scale = renderer.transform.lossyScale;
bool isReverse = scale.x * scale.y * scale.z < 0;
Matrix4x4 transform = renderer.transform.localToWorldMatrix;
// 頂点の結合
var baseVertices = mesh.vertices;
foreach (var baseVertex in baseVertices)
{
vertices.Add(transform.MultiplyPoint(baseVertex));
}
// ライトマップ⽤の UV 作成
var lightmapScaleOffset = renderer.lightmapScaleOffset;
var lightmapScale
= new Vector2(lightmapScaleOffset.x, lightmapScaleOffset.y);
var lightmapOffset
= new Vector2(lightmapScaleOffset.z, lightmapScaleOffset.w);
var lightmapUvs = mesh.uv2;
for (int i = 0; i < lightmapUvs.Length; ++i)
{
lightmapUvs[i].Scale(lightmapScale);
lightmapUvs[i] += lightmapOffset;
}
// 頂点サイズに依存するパラメータの結合
this.AddRangeOfSize(
normals, mesh.normals, vertices.Count, Vector3.zero);
this.AddRangeOfSize(
tangents, mesh.tangents, vertices.Count, Vector3.zero);
this.AddRangeOfSize(uv, mesh.uv, vertices.Count, Vector2.zero);
this.AddRangeOfSize(uv2, lightmapUvs, vertices.Count, Vector2.zero);
this.AddRangeOfSize(uv3, mesh.uv3, vertices.Count, Vector2.zero);
this.AddRangeOfSize(uv4, mesh.uv4, vertices.Count, Vector2.zero);
this.AddRangeOfSize(colors, mesh.colors, vertices.Count, Color.black);
// ポリゴンの結合
Material[] materials = renderer.sharedMaterials;
36