Переделал предыдущий класс под Mesh.CombineMeshes.
Есть одно непонятное, что сделало этот метод и стандартный скрипт CombineChildren неприменимым в моем проекте - в MeshMerger (предыдущий код) результирующий меш каким-то чудесным образом остается связан с параметрами transform дочерних объектов. Два других способа такого не делают. У Mesh.CombineMeshes другая странность - если исполнить его несколько раз с одним родительским объектом и разным состоянием дочерних, то он в результирующем меше визуально накапливает информацию о предыдущих склейках, даже не смотря на то, что родительский меш каждый раз удаляется явным образом.
Используется javascript
// --------- Mesh Merger.js
// Use:
// merger = new MeshMerger(parentObject, material);
// merger.Merge();
// or:
// merger = new MeshMerger(parentObject, null); // get material from first children
// merger.Merge();
#pragma strict
class MeshMerger {
var parentObject: GameObject;
var material: Material;
// Constructor
function MeshMerger (obj: GameObject, mat: Material) {
parentObject = obj;
material = mat;
}
function Merge () {
// hook up the mesh renderer
var mr: MeshRenderer = parentObject.GetComponent(MeshRenderer);
if (!mr) mr = parentObject.AddComponent(MeshRenderer);
var mf: MeshFilter = parentObject.GetComponent(MeshFilter);
if (!mf) mf = parentObject.AddComponent(MeshFilter);
if (mf.sharedMesh) GameObject.Destroy(mf.sharedMesh);
var myTransform: Matrix4x4 = parentObject.transform.worldToLocalMatrix;
// find all the mesh filters
var comps: Component[] = parentObject.GetComponentsInChildren(MeshFilter);
var combine: CombineInstance[] = new CombineInstance[comps.Length];
for (var i = 0; i < comps.Length; i++) {
var comp: MeshFilter = comps[i];
combine[i].mesh = comp.sharedMesh;
combine[i].transform = myTransform * comp.transform.localToWorldMatrix;
var submr: MeshRenderer = comp.gameObject.GetComponent(MeshRenderer);
if (!material) material = submr.material;
if (submr) submr.enabled = false;
}
// hook up the mesh
var me: Mesh = new Mesh();
me.name = parentObject.name;
me.CombineMeshes(combine);
mf.sharedMesh = me;
mr.material = material;
mr.enabled = true;
}
}