void AttachCombineScriptToChildren()
 {
     for (int i = 0; i < masterTarget.transform.childCount; i++)
     {
         Transform         t   = masterTarget.transform.GetChild(i);
         SimpleMeshCombine smc = t.GetComponent <SimpleMeshCombine>();
         if (!smc)
         {
             t.gameObject.AddComponent <SimpleMeshCombine>();
         }
     }
 }
Esempio n. 2
0
    public void combineMeshes()
    {
        Transform sceneSections = getSceneSections();

        // Iterate through all of the scene sections
        for (int sectionIndex = 0; sectionIndex < sceneSections.childCount; sectionIndex++)
        {
            SimpleMeshCombine meshCombiner = sceneSections.GetChild(sectionIndex).gameObject.GetComponent <SimpleMeshCombine>();
            if (meshCombiner == null)
            {
                continue;
            }
            if (meshCombiner.transform.childCount == 0)
            {
                continue;
            }
            meshCombiner.CombineMeshes();
            meshCombiner.combined.isStatic = true;
        }
    }
 void CombineAll(bool combine, SimpleMeshCombine[] arr)
 {
     for (int i = 0; i < arr.Length; i++)
     {
         SimpleMeshCombine smc = arr[i];
         if (combine && !smc.combined)
         {
             if (masterTarget.generateLightmapUV)
             {
                 smc.generateLightmapUV = true;
             }
             smc.CombineMeshes();
         }
         else if (!combine && smc.combined)
         {
             smc.EnableRenderers(true);
             if (smc.combined != null)
             {
                 DestroyImmediate(smc.combined);
             }
             smc.combinedGameOjects = null;
         }
     }
 }
 public void Awake()
 {
     simpleMeshCombine = GetComponent <SimpleMeshCombine>();
     //simpleMeshCombine.CombineMeshes();
 }
Esempio n. 5
0
    static void CreateBattleWithCombineMesh()
    {
        if (EditorApplication.isPlaying)
        {
            EditorUtility.DisplayDialog("提示", "不能在運行的時候執行", "OK", "");
            return;
        }

        Transform[] selections = Selection.GetTransforms(SelectionMode.Assets);

        if (selections.Length == 0 || selections.Length > 1)
        {
            EditorUtility.DisplayDialog("提示", "選中一個Battle物體", "OK", "");
            return;
        }

        if (selections[0].GetComponent <BattleBehaviour>() == null)
        {
            EditorUtility.DisplayDialog("提示", "未找到BattleBehaviour腳本", "OK", "");
            return;
        }

        Transform battleT = selections[0];
        //創建copy的gameobject
        GameObject battleCombineGo = GameObject.Instantiate <GameObject>(battleT.gameObject);
        string     prefabName      = battleT.name;
        string     suffix          = "_Raw";
        int        nameFormatIndex = prefabName.LastIndexOf(suffix);

        if (nameFormatIndex == prefabName.Length - suffix.Length)
        {
            //帶了後綴,刪掉後綴就是現在的名稱
            prefabName = prefabName.Substring(0, nameFormatIndex);
        }

        battleCombineGo.name = prefabName;
        //battle才能被看見
        int layer = battleT.gameObject.layer;

        //所有怪點刪除sprite renderer
        EnemyPoint[] enemyPoints = battleCombineGo.GetComponentsInChildren <EnemyPoint>();

        for (int i = 0; i < enemyPoints.Length; i++)
        {
            SpriteRenderer[] renderers = enemyPoints[i].GetComponentsInChildren <SpriteRenderer>();

            for (int j = 0; j < renderers.Length; j++)
            {
                DestroyImmediate(renderers[i]);
            }
        }

        //有SimpleMeshCombine腳本的物體為mesh根目錄。   有可能會有多個目錄
        SimpleMeshCombine[] meshCombines = battleCombineGo.GetComponentsInChildren <SimpleMeshCombine>();

        for (int i = 0; i < meshCombines.Length; i++)
        {
            SimpleMeshCombine tmpMeshCombine = meshCombines[i];

            MeshRenderer[] meshRenderers = tmpMeshCombine.GetComponentsInChildren <MeshRenderer>();

            //合併模型之後其它的renderer會被關閉,複製出來後,將所有對應目錄下關閉了的renderer全部刪掉
            for (int j = 0; j < meshRenderers.Length; j++)
            {
                MeshRenderer renderer = meshRenderers[j];

                if (!renderer.enabled)
                {
                    //如果此renderer被關閉表示合併前的小模型,刪除
                    Object.DestroyImmediate(renderer.gameObject);
                }
                else
                {
                    renderer.gameObject.layer = layer;
                }
            }

            if (tmpMeshCombine != null)
            {
                //合併腳本也直接刪掉
                Object.DestroyImmediate(tmpMeshCombine);
            }
        }

        GameObject battleCombineGoPrefab = PrefabUtility.CreatePrefab(PREFAB_PATH + battleCombineGo.name + ".prefab", battleCombineGo);

        Object.DestroyImmediate(battleCombineGo);
        PrefabUtility.InstantiatePrefab(battleCombineGoPrefab);


        //EditorUtility.DisplayDialog("提示", "創建成功。 請重新賦值合併後的mesh", "ok");

        if (battleT)
        {
            battleT.gameObject.SetActive(false);
        }
    }
Esempio n. 6
0
 void OnEnable()
 {
     smc = (SimpleMeshCombine)target;
 }
Esempio n. 7
0
    public static void Combine(SimpleMeshCombine target)
    {
        MeshFilter[] meshFilters = FindEnabledMeshes(target.transform);

        if (meshFilters.Length > 0)
        {
            GameObject combinedFrags = new GameObject();
            combinedFrags.AddComponent <MeshFilter>();
            combinedFrags.AddComponent <MeshRenderer>();
            MeshInstance[] instances   = new MeshInstance[meshFilters.Length];
            GameObject[]   combinedGOs = new GameObject[meshFilters.Length];
            MeshFilter     matFilter   = null;

            for (int i = 0; i < meshFilters.Length; i++)
            {
                MeshFilter mf = meshFilters[i];
                if (i == meshFilters.Length - 1)
                {
                    matFilter = mf;
                }
                combinedGOs[i] = mf.gameObject;
                MeshInstance mi = new MeshInstance();
                mi.mesh = mf.sharedMesh;
                // D.Log(mi.mesh.vertices.Length);
                // mi.subMeshIndex = mf.sharedMesh.subMeshCount;
                mi.subMeshIndex = 0;
                mi.transform    = mf.transform.localToWorldMatrix;
                instances[i]    = mi;
            }

            target.combinedGameObjects = combinedGOs;
            Mesh m = MeshCombineUtility.Combine(instances, false);

            // D.Log(target.transform.name+
            //       " Combined " + meshFilters.Length + " Meshes");
            // D.Warn("Mesh: " + m.vertices.Length);

            // CombineInstance[] combine = new CombineInstance[meshFilters.Length];
            // GameObject[] mfGOs = new GameObject[meshFilters.Length];
            // for (int i=0; i<meshFilters.Length; i++) {
            //     MeshFilter mf = meshFilters[i];
            //     MeshRenderer mr = combinedFrags.GetComponent<MeshRenderer>();
            //     mr.sharedMaterial = mf.transform.GetComponent<MeshRenderer>().sharedMaterial;
            //     mfGOs[i] = meshFilters[i].gameObject;
            //     CombineInstance ci = combine[i];
            //     ci.mesh = mf.transform.GetComponent<MeshFilter>().sharedMesh;
            //     ci.transform = mf.transform.localToWorldMatrix;
            //     combine[i] = ci;
            // }

            combinedFrags.GetComponent <MeshFilter>().mesh             = m;
            combinedFrags.GetComponent <MeshRenderer>().sharedMaterial = matFilter.GetComponent <Renderer>().sharedMaterial;
            // combinedFrags.GetComponent<MeshFilter>().mesh = new Mesh();
            // combinedFrags.GetComponent<MeshFilter>().sharedMesh.CombineMeshes(combine);

            // // Disabled for now
            // // if (target._generateLightmapUV){
            // //     Unwrapping.GenerateSecondaryUVSet(combinedFrags.GetComponent(MeshFilter).sharedMesh);
            // //     combinedFrags.isStatic = true;
            // // }

            combinedFrags.name             = "_Combined Mesh [" + target.transform.name + "]";
            target.combined                = combinedFrags.gameObject;
            combinedFrags.transform.parent = target.transform;
            EnableRenderers(meshFilters, false);
        }
    }