// 構築 -------------------------------------- //linqにしたらシンプルになるか? /// <summary> /// 自身のメッシュと、パーツ以外の子孫のメッシュ(_StructurePart を持たないもの)をすべて統合する。 /// 途中でパーツを発見した場合、そのパーツとその子孫は統合対象から外れる。 /// パーツ以外の子孫は、ゲームオブジェクトレベルですべて破棄される。 /// 子孫がレンダラを一つも持っていない場合は、さっさと処理を抜ける。 /// </summary> public virtual void buildFromPieces() { var tf = transform; var mf = tf.GetComponent <MeshFilter>(); if (mf == null) { var mr = GetComponentInChildren <MeshRenderer>(); if (mr == null) { return; } gameObject.AddComponent <MeshRenderer>().sharedMaterial = mr.sharedMaterial; } var counter = new MeshElementsCounter(); if (mf != null) { counter.count(mf.sharedMesh); } countChildrenMeshes(ref counter, tf); var creator = new ColoredNormalMesthCreator(); //SimpleMeshCreator(); creator.alloc(ref counter); if (mf != null) { var mt = Matrix4x4.identity; creator.addGeometory(mf.sharedMesh, ref mt); } var mtInv = tf.worldToLocalMatrix; buildChildrenMeshes(creator, tf, ref mtInv); if (mf == null) { mf = gameObject.AddComponent <MeshFilter>(); } mf.sharedMesh = creator.create(); }
void countChildrenMeshes(ref MeshElementsCounter counter, Transform tf) { for (var i = 0; i < tf.childCount; i++) { var tfChild = tf.GetChild(i); if (tfChild.GetComponent <_StructurePart3>() == null) { if (tfChild.childCount > 0) { countChildrenMeshes(ref counter, tfChild); } var mf = tfChild.GetComponent <MeshFilter>(); if (mf != null) { counter.count(mf.sharedMesh); } } } }