/// <summary>
        /// すべてのメッシュの全頂点にウェイトが設定された状態にします。
        /// </summary>
        /// <param name="root"></param>
        /// <param name="notCombineRendererObjectNames"></param>
        private static void MakeAllVerticesHaveWeights(
            GameObject root,
            IEnumerable <string> notCombineRendererObjectNames
            )
        {
            foreach (var renderer in root.GetComponentsInChildren <SkinnedMeshRenderer>())
            {
                if (notCombineRendererObjectNames.Contains(renderer.name) ||
                    renderer.bones.Length > 1 ||
                    renderer.bones.Length > 0 && renderer.bones[0] != renderer.transform)
                {
                    continue;
                }

                CombineMeshesAndSubMeshes.MakeVerticesHaveWeight(renderer: renderer);
            }

            foreach (var meshRenderer in root.GetComponentsInChildren <MeshRenderer>())
            {
                if (notCombineRendererObjectNames.Contains(meshRenderer.name))
                {
                    continue;
                }

                var        meshFilter = meshRenderer.GetComponent <MeshFilter>();
                Material[] materials  = meshRenderer.sharedMaterials;
                var        renderer   = meshRenderer.gameObject.AddComponent <SkinnedMeshRenderer>();
                renderer.sharedMesh = meshFilter.sharedMesh;
                UnityEngine.Object.DestroyImmediate(meshFilter);
                renderer.sharedMaterials = materials;

                CombineMeshesAndSubMeshes.MakeVerticesHaveWeight(renderer: renderer);
            }
        }
        private void OnWizardCreate()
        {
            CombineMeshesAndSubMeshes.Combine(
                root: this.root,
                notCombineRendererObjectNames: this.notCombineRendererObjectNames.Except(new[] { "" }),
                destinationObjectName: this.destinationObjectName
                );

            EditorUtility.DisplayDialog(
                Wizard.NameAndVersion,
                "メッシュ、およびマテリアルが同一であるサブメッシュの結合が完了しました。",
                "OK"
                );
        }
        /// <summary>
        /// メッシュを結合します。
        /// </summary>
        /// <param name="root"></param>
        /// <param name="notCombineRendererObjectNames">結合しないメッシュレンダラーのオブジェクト名。</param>
        /// <param name="destinationObjectName">結合したメッシュのオブジェクト名。</param>
        /// <returns></returns>
        public static SkinnedMeshRenderer Combine(
            GameObject root,
            IEnumerable <string> notCombineRendererObjectNames,
            string destinationObjectName
            )
        {
            CombineMeshesAndSubMeshes.MakeAllVerticesHaveWeights(
                root: root,
                notCombineRendererObjectNames: notCombineRendererObjectNames
                );

            return(CombineMeshesAndSubMeshes.CombineAllMeshes(
                       root: root,
                       destinationObjectName: destinationObjectName,
                       notCombineRendererObjectNames: notCombineRendererObjectNames
                       ));
        }