Inheritance: MonoBehaviour
Beispiel #1
0
	void CreateRailLandAsset(){
		
		#if UNITY_EDITOR
		AssetDatabase.DeleteAsset(pathFolder+"/Rail");
		AssetDatabase.CreateFolder(pathFolder, "Rail");
		GameObject railPacked = new GameObject("RailPacked");
		
		int mX = xMinEffectiveBoard;
		while(mX <= xMaxEffectiveBoard){
			GameObject nRail = Instantiate(rail, Vector3.zero, Quaternion.identity)as GameObject;
			nRail.transform.position = new Vector3(mX, 0, 0);
			nRail.transform.SetParent(railPacked.transform);
			mX++;
		}
		mX = xMinBoard;
		while(mX < xMinEffectiveBoard){
			GameObject nRail = Instantiate(deepRail, Vector3.zero, Quaternion.identity) as GameObject;
			nRail.transform.position = new Vector3(mX, 0,0);
			nRail.transform.SetParent(railPacked.transform);
			mX++;
		}
		mX = xMaxEffectiveBoard+1;
		while(mX <= xMaxBoard){
			GameObject nRail = Instantiate(deepRail, Vector3.zero, Quaternion.identity) as GameObject;
			nRail.transform.position = new Vector3(mX, 0,0);
			nRail.transform.SetParent(railPacked.transform);
			mX++;
		}
		railPacked.tag = "Rail";
		MeshCombine.CreatePrefab(railPacked, pathFolder, "Rail", "Rail");
		
		Destroy(railPacked);
		#endif
	}
Beispiel #2
0
    void OnSceneGUI()
    {
        MeshCombine mc = target as MeshCombine;

        if (Handles.Button(mc.transform.position + Vector3.up * 5, Quaternion.LookRotation(Vector3.up), 1, 1, Handles.CylinderHandleCap))
        {
            mc.CombineMeshes();
        }
    }
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();
        MeshCombine mc = target as MeshCombine;

        if (GUILayout.Button("Combine Meshes Basic"))
        {
            mc.CombineMeshesBas();
        }

        if (GUILayout.Button("Combine Meshes Advance"))
        {
            mc.CombineMeshesAdv();
        }
    }
Beispiel #4
0
    protected void Test()
    {
        if (isInit == true)
        {
            return;
        }
        isInit = true;
        MeshCombine combine = new MeshCombine();

        combine.Combine(this.gameObject.AddComponent <MeshRenderer>(),
                        this.gameObject.GetComponentsInChildren <MeshRenderer>(),
                        new string[] { "_MainTex", "_BumpMap" },
                        new Material(Shader.Find("Mobile/Bumped Diffuse")),
                        1024,
                        512,
                        true);
    }
Beispiel #5
0
	void CreateGrassLandAsset(){
#if UNITY_EDITOR
		AssetDatabase.DeleteAsset(pathFolder+"/Grass");
		AssetDatabase.CreateFolder(pathFolder, "Grass");
		GameObject grassPacked = new GameObject("GrassPacked");

		int xGrass = xMinEffectiveBoard;
		while(xGrass <= xMaxEffectiveBoard){
			GameObject nGrass = Instantiate(grass, Vector3.zero, Quaternion.identity)as GameObject;
			nGrass.transform.position = new Vector3(xGrass, 0, 0);
			nGrass.transform.SetParent(grassPacked.transform);
			xGrass++;
		}
		xGrass = xMinBoard;
		while(xGrass < xMinEffectiveBoard){
			GameObject nDGrass = Instantiate(deepGrass, Vector3.zero, Quaternion.identity) as GameObject;
			nDGrass.transform.position = new Vector3(xGrass, 0,0);
			nDGrass.transform.SetParent(grassPacked.transform);
			if(tree.Length == 0){
				Debug.LogError("Tree Array is Null, make sure you have assign it");
				EditorApplication.isPaused = true;
			}
			else{
				GameObject nTree = Instantiate(tree[UnityEngine.Random.Range(0, tree.Length)],new Vector3(xGrass, 0,0), Quaternion.identity)as GameObject;
				nTree.transform.SetParent(grassPacked.transform);

			}
			xGrass++;
		}
		xGrass = xMaxEffectiveBoard+1;
		while(xGrass <= xMaxBoard){
			GameObject nDGrass = Instantiate(deepGrass, Vector3.zero, Quaternion.identity) as GameObject;
			nDGrass.transform.position = new Vector3(xGrass, 0,0);
			nDGrass.transform.SetParent(grassPacked.transform);
			GameObject nTree = Instantiate(tree[UnityEngine.Random.Range(0, tree.Length)],new Vector3(xGrass, 0,0), Quaternion.identity)as GameObject;
			nTree.transform.SetParent(grassPacked.transform);
			xGrass++;
		}
		grassPacked.tag = "Grass";
		MeshCombine.CreatePrefab(grassPacked, pathFolder, "Grass", "Grass");
		
		Destroy(grassPacked);
#endif
	}
        static Mesh CreateSlopeMesh(Sprite sprite, Sprite sideSprite, Sprite backSprite, float height)
        {
            //
            Mesh main = SpriteTileGenerator.CreateMeshFromSprite(sprite);

            Vector3[] verts = main.vertices;
            for (int i = 0; i <= 1; i++)
            {
                verts[i] += Vector3.up * height;
            }
            main.SetVertices(verts);
            main.RecalculateNormals();
            main.RecalculateTangents();

            if (sideSprite)
            {
                Mesh[] partials = new Mesh[4]; // two quads, two tris
                partials[0] = main;
                partials[1] = CreatePartialQuad(backSprite ?? sideSprite, height);
                TransformMesh(partials[1],
                              Quaternion.Euler(270f, 90f, 90f),
                              new Vector3(0f, 0.5f, 0.5f));

                partials[2] = CreatePartialTris(sideSprite, height);
                TransformMesh(partials[2],
                              Quaternion.Euler(90f, 90f, 0f),
                              new Vector3(0.5f, 0.5f, 0f));

                partials[3] = CreatePartialTris(sideSprite, height);
                TransformMesh(partials[3],
                              Quaternion.Euler(90f, 90f, 0f),
                              new Vector3(-0.5f, 0.5f, 0f));

                partials[3].triangles = new int[] { partials[3].triangles[2], partials[3].triangles[1], partials[3].triangles[0] };

                return(MeshCombine.CombineMeshes(partials));
            }
            else
            {
                return(main);
            }
            //return CreatePartialQuad(sprite, height);
        }
 static Mesh CreateBlockMesh(Sprite sprite, Sprite topSprite)
 {
     Mesh[] partials = new Mesh[5];
     for (int i = 0; i <= 3; i++)
     {
         partials[i] = SpriteTileGenerator.CreateMeshFromSprite(sprite);
         TransformMesh(partials[i],
                       Quaternion.Euler(270f, 90f + 90f * i, 90f),
                       Vector3.up * 0.5f
                       + Quaternion.Euler(0f, 90f * i, 0f).normalized *Vector3.forward * 0.5f);
     }
     if (topSprite)
     {
         partials[4] = SpriteTileGenerator.CreateMeshFromSprite(topSprite);
         TransformMesh(partials[4],
                       Quaternion.Euler(0f, 0f, 0f),
                       Vector3.up * 1f);
     }
     return(MeshCombine.CombineMeshes(partials));
 }
Beispiel #8
0
	void CreateTrain(){
#if UNITY_EDITOR
		AssetDatabase.DeleteAsset(pathFolder+"/"+"Train");
		AssetDatabase.CreateFolder(pathFolder, "Train");

		int longTrain = minLongTrain;
		while(longTrain <= maxLongTrain){
			float trainWidth;
			GameObject realTrainInstance = new GameObject("TrainLong_"+longTrain.ToString());
			GameObject trainDummy = Instantiate(carriage, new Vector3(-300, -300, -300), Quaternion.identity) as GameObject;
			trainWidth = trainDummy.transform.GetChild(0).GetComponent<MeshRenderer>().bounds.size.x;
			Destroy(trainDummy);
			GameObject headTr = Instantiate(headTrain, transform.position, Quaternion.identity) as GameObject;
			int i =0;
			while(i < longTrain){
				GameObject trainInstance = Instantiate(carriage, new Vector3(transform.position.x - (i * trainWidth), transform.position.y, transform.position.z), Quaternion.identity) as GameObject;
				trainInstance.transform.SetParent(headTr.transform);
				i++;
			}
			realTrainInstance.transform.position = transform.position;
			headTr.transform.SetParent(realTrainInstance.transform);

			MeshCombine.CreatePrefab(realTrainInstance, pathFolder, "Train", "Train");

//			//This so heavy
//			UnityEngine.Object dummyPrefab = EditorUtility.CreateEmptyPrefab("Assets/CrossyWay/Prefabs/Train/TrainComplete/RealTrain_"+longTrain.ToString()+".prefab");
//			GameObject prefabTrain = PrefabUtility.ReplacePrefab(realTrainInstance, dummyPrefab, ReplacePrefabOptions.ConnectToPrefab) as GameObject;
//			prefabTrain.tag = "Train";
//			//Heavy part end

			Destroy(realTrainInstance);

			longTrain++;
		}

#endif
	}
    public GameObject MergeMeshes(GameObject source)
    {
        // Get a copy of the source GameObject
        GameObject sourceParent = GameObject.Instantiate(source);

        // ---------------------------------------------------------------------------
        // Remove GameObjects to Exclude from the Merge and move them back later
        // ---------------------------------------------------------------------------

        // Create GameObject that will hold all models to exclude from the Merge
        GameObject excludeFromMergeParent = new GameObject("Not Merged");

        // Get all child Transforms in the Source GameObject
        Transform[] sourceTransforms = sourceParent.GetComponentsInChildren <Transform>();

        // Loop through each child Transform in the Source GameObject
        for (int i = sourceTransforms.Length - 1; i >= 0; i--)
        {
            // If not including this GameObject in the MeshCombine
            if (!IncludeInMerge(sourceTransforms[i].gameObject))
            {
                sourceTransforms[i].parent = excludeFromMergeParent.transform;
            }
        }

        // Get all MeshFilters and MeshRenderers from the source GameObject's children
        MeshFilter[]   sourceMeshFilters   = sourceParent.GetComponentsInChildren <MeshFilter>();
        MeshRenderer[] sourceMeshRenderers = sourceParent.GetComponentsInChildren <MeshRenderer>();

        // ---------------------------------------------------------------------------
        // Get Unique Material List
        // ---------------------------------------------------------------------------

        // Create a List containing all unique Materials in the GameObjects
        List <Material> uniqueMats = new List <Material>();
        bool            foundMat;

        // Loop through each MeshRenderer
        for (int i = 0; i < sourceMeshRenderers.Length; i++)
        {
            // Loop through each MeshRenderer's SharedMaterials
            for (int j = 0; j < sourceMeshRenderers[i].sharedMaterials.Length; j++)
            {
                // Set Found Material flag to "False"
                foundMat = false;

                // Loop through all Materials in the Unique Material list
                for (int k = 0; k < uniqueMats.Count; k++)
                {
                    // If Material was found, set the Found Material flag to "True"
                    if (sourceMeshRenderers[i].sharedMaterials[j].name == uniqueMats[k].name)
                    {
                        foundMat = true;
                    }
                }

                // If Found Material flag is "True", add the Material to the Unique Material Array
                if (!foundMat)
                {
                    uniqueMats.Add(sourceMeshRenderers[i].sharedMaterials[j]);
                }
            }
        }

        // ---------------------------------------------------------------------------
        // Extract Meshes into Separate CombineInstances based on Material
        // ---------------------------------------------------------------------------

        // Create a MeshCombine Class Array the size of the uniqueMats List and initialize
        MeshCombine[] uniqueMatMeshCombine = new MeshCombine[uniqueMats.Count];
        for (int i = 0; i < uniqueMats.Count; i++)
        {
            uniqueMatMeshCombine[i]             = new MeshCombine();
            uniqueMatMeshCombine[i].combineList = new List <CombineInstance>();
        }

        // Prepare variables
        CombineInstance combineInstance;

        // Loop through each MeshRenderer in sourceMeshRenderers
        for (int i = 0; i < sourceMeshRenderers.Length; i++)
        {
            // Loop through each Material in each MeshRenderer
            for (int j = 0; j < sourceMeshRenderers[i].sharedMaterials.Length; j++)
            {
                // Loop through each Material in the uniqueMats List
                for (int k = 0; k < uniqueMats.Count; k++)
                {
                    // If this Material matches the Material in the uniqueMats List
                    if (sourceMeshRenderers[i].sharedMaterials[j] == uniqueMats[k])
                    {
                        // Initialize a Combine Instance
                        combineInstance = new CombineInstance();

                        // Copy this mesh to the Combine Instance
                        combineInstance.mesh = sourceMeshFilters[i].sharedMesh;

                        // Set it to only include the Mesh with the specified material
                        combineInstance.subMeshIndex = j;

                        // Transform to world matrix
                        combineInstance.transform = sourceMeshFilters[i].transform.localToWorldMatrix;

                        // Add this CombineInstance to the appropriate CombineInstance List (by Material)
                        uniqueMatMeshCombine[k].combineList.Add(combineInstance);
                    }
                }
            }
        }

        // ---------------------------------------------------------------------------
        // Combine all Mesh Instances into a single GameObject
        // ---------------------------------------------------------------------------

        // Disable all Source GameObjects
        for (int i = 0; i < sourceMeshFilters.Length; i++)
        {
            sourceMeshFilters[i].gameObject.SetActive(false);
        }

        // Create the final GameObject that will hold all the other GameObjects
        GameObject finalGameObject = new GameObject("Merged Meshes");

        // Create a new GameObject Array the size of the All Materials List
        GameObject[] singleMatGameObject = new GameObject[uniqueMats.Count];

        // Combine meshes for each singleMatGameObject into one mesh
        CombineInstance[] finalCombineInstance = new CombineInstance[uniqueMats.Count];

        // Enable all Source GameObjects
        for (int i = 0; i < sourceMeshFilters.Length; i++)
        {
            sourceMeshFilters[i].gameObject.SetActive(true);
        }

        // Prepare mesh filter and mesh renderer arrays for the final combine
        MeshFilter[]   meshFilter   = new MeshFilter[uniqueMats.Count];
        MeshRenderer[] meshRenderer = new MeshRenderer[uniqueMats.Count];

        // Loop through each Material in the uniqueMats List
        for (int i = 0; i < uniqueMats.Count; i++)
        {
            // Initialize GameObject
            singleMatGameObject[i] = new GameObject();

            singleMatGameObject[i].name = uniqueMats[i].name;

            // Add a MeshRender and set the Material
            meshRenderer[i] = singleMatGameObject[i].AddComponent <MeshRenderer>();
            meshRenderer[i].sharedMaterial = uniqueMats[i];

            // Add a MeshFilter and add the Combined Meshes with this Material
            meshFilter[i]            = singleMatGameObject[i].AddComponent <MeshFilter>();
            meshFilter[i].sharedMesh = new Mesh();
            meshFilter[i].sharedMesh.CombineMeshes(uniqueMatMeshCombine[i].combineList.ToArray());

            // Add this Mesh to the final Mesh Combine
            finalCombineInstance[i].mesh      = meshFilter[i].sharedMesh;
            finalCombineInstance[i].transform = meshFilter[i].transform.localToWorldMatrix;

            // Hide the GameObject
            meshFilter[i].gameObject.SetActive(false);

            GameObject.DestroyImmediate(singleMatGameObject[i]);
        }

        // Add MeshFilter to final GameObject and Combine all Meshes
        MeshFilter finalMeshFilter = finalGameObject.AddComponent <MeshFilter>();

        finalMeshFilter.sharedMesh = new Mesh();
        finalMeshFilter.sharedMesh.CombineMeshes(finalCombineInstance, false, false);

        // Add MeshRenderer to final GameObject Attach Materials
        MeshRenderer finalMeshRenderer = finalGameObject.AddComponent <MeshRenderer>();

        finalMeshRenderer.sharedMaterials = uniqueMats.ToArray();

        // Name finalGameObject and make it the child of an empty parent
        GameObject finalGameObjectParent = new GameObject(sourceParent.name + " Merged");

        finalGameObject.transform.parent = finalGameObjectParent.transform;

        // If the Unmerged GameObject holder is isn't empty, make it a child of the empty parent
        if (excludeFromMergeParent.transform.childCount > 0)
        {
            excludeFromMergeParent.transform.parent = finalGameObjectParent.transform;
        }

        // If the Unmerged GameObject holder is empty, delete it
        else
        {
            GameObject.DestroyImmediate(excludeFromMergeParent);
        }

        // Delete unneeded GameObjects
        GameObject.DestroyImmediate(sourceParent);

        // Return the complete GameObject
        return(finalGameObjectParent);
    }
Beispiel #10
0
    // ---------------------------------------------------------------------------
    // Merge all Meshes by Material
    // ---------------------------------------------------------------------------
    public GameObject MergeMeshesByMaterial(GameObject sourceParent)
    {
        // Recursively search through child tree and add any unique materials
        // This will result in 2 lists: [Materials mats] and [string matNames]
        FindUniqueMaterials(sourceParent.transform);

        // Prep Mesh combine array
        meshCombine = new MeshCombine[matNames.Count];
        for (int i = 0; i < matNames.Count; i++)
        {
            meshCombine[i]             = new MeshCombine();
            meshCombine[i].combineList = new List <CombineInstance>();
        }

        // Recursively search through child tre and add each Mesh
        // to the corresponding array, sorted by Material name
        GroupMeshesByMaterial(sourceParent.transform);

        // Create the target parent.  This will add it to the Hierarchy as well
        GameObject targetParent = new GameObject();

        // Define variable used to create target GameObject
        GameObject targetChild;
        MeshFilter targetMeshFilter;
        Renderer   targetRenderer;

        // Loop through each list of Meshes
        for (int i = 0; i < matNames.Count; i++)
        {
            // Create child GameObject for all Meshes with this Material
            targetChild = new GameObject();
            targetChild.SetActive(false);
            targetChild.transform.SetParent(targetParent.transform);
            targetChild.name = matNames[i];

            // Add MeshFilter and Meshes
            targetMeshFilter      = targetChild.AddComponent <MeshFilter>();
            targetMeshFilter.mesh = new Mesh();
            targetMeshFilter.sharedMesh.CombineMeshes(meshCombine[i].combineList.ToArray());

            // Add MeshRender and Material
            targetRenderer = targetChild.AddComponent <MeshRenderer>();
            targetRenderer.sharedMaterial = mats[i];

            // Enable child
            targetChild.SetActive(true);
        }

        // Add copy of each excluded from merge GameObject to the parent GameObject
        GameObject unmergedGameObject;

        foreach (GameObject gameObject in excludeFromMerge)
        {
            unmergedGameObject      = GameObject.Instantiate(gameObject);
            unmergedGameObject.name = gameObject.name;
            unmergedGameObject.transform.SetParent(targetParent.transform);
        }

        // Return the new target parent
        return(targetParent);
    }
Beispiel #11
0
	void CreateRoadLandAsset(){
#if UNITY_EDITOR
		AssetDatabase.DeleteAsset(pathFolder+"/Road");
		AssetDatabase.CreateFolder(pathFolder, "Road");

		GameObject solidRoadPacked = new GameObject("SolidRoadPacked");
		int mX = xMinEffectiveBoard;
		while(mX <= xMaxEffectiveBoard){
			GameObject nRail = Instantiate(road, Vector3.zero, Quaternion.identity)as GameObject;
			nRail.transform.position = new Vector3(mX, 0, 0);
			nRail.transform.SetParent(solidRoadPacked.transform);
			mX++;
		}
		mX = xMinBoard;
		while(mX < xMinEffectiveBoard){
			GameObject nRail = Instantiate(deepRoad, Vector3.zero, Quaternion.identity) as GameObject;
			nRail.transform.position = new Vector3(mX, 0,0);
			nRail.transform.SetParent(solidRoadPacked.transform);
			mX++;
		}
		mX = xMaxEffectiveBoard+1;
		while(mX <= xMaxBoard){
			GameObject nRail = Instantiate(deepRoad, Vector3.zero, Quaternion.identity) as GameObject;
			nRail.transform.position = new Vector3(mX, 0,0);
			nRail.transform.SetParent(solidRoadPacked.transform);
			mX++;
		}
		MeshCombine.CreatePrefab(solidRoadPacked, pathFolder, "Road", "SolidRoad");

		Destroy(solidRoadPacked);
		

		//BREAK =========================================================

		GameObject roadTopLinePacked = new GameObject("roadTopLinePacked");
		mX = xMinEffectiveBoard;
		while(mX <= xMaxEffectiveBoard){
			GameObject nRoad;
			if(mX % 2 == 0){
				nRoad = Instantiate(roadTopLine, Vector3.zero, Quaternion.identity)as GameObject;
			}
			else
				nRoad = Instantiate(road, Vector3.zero, Quaternion.identity)as GameObject;
			nRoad.transform.position = new Vector3(mX, 0, 0);
			nRoad.transform.SetParent(roadTopLinePacked.transform);
			mX++;
		}
		mX = xMinBoard;
		while(mX < xMinEffectiveBoard){
			GameObject nRail = Instantiate(deepRoad, Vector3.zero, Quaternion.identity) as GameObject;
			nRail.transform.position = new Vector3(mX, 0,0);
			nRail.transform.SetParent(roadTopLinePacked.transform);
			mX++;
		}
		mX = xMaxEffectiveBoard+1;
		while(mX <= xMaxBoard){
			GameObject nRail = Instantiate(deepRoad, Vector3.zero, Quaternion.identity) as GameObject;
			nRail.transform.position = new Vector3(mX, 0,0);
			nRail.transform.SetParent(roadTopLinePacked.transform);
			mX++;
		}
		MeshCombine.CreatePrefab(roadTopLinePacked, pathFolder, "Road", "RoadTopLine");

		Destroy(roadTopLinePacked);

		//BREAK =========================================================
		
		GameObject roadBothLinePacked = new GameObject("roadBothLinePacked");
		mX = xMinEffectiveBoard;
		while(mX <= xMaxEffectiveBoard){
			GameObject nRoad;
			if(mX % 2 == 0){
				nRoad = Instantiate(roadBothLine, Vector3.zero, Quaternion.identity)as GameObject;
			}
			else
				nRoad = Instantiate(road, Vector3.zero, Quaternion.identity)as GameObject;
			nRoad.transform.position = new Vector3(mX, 0, 0);
			nRoad.transform.SetParent(roadBothLinePacked.transform);
			mX++;
		}
		mX = xMinBoard;
		while(mX < xMinEffectiveBoard){
			GameObject nRail = Instantiate(deepRoad, Vector3.zero, Quaternion.identity) as GameObject;
			nRail.transform.position = new Vector3(mX, 0,0);
			nRail.transform.SetParent(roadBothLinePacked.transform);
			mX++;
		}
		mX = xMaxEffectiveBoard+1;
		while(mX <= xMaxBoard){
			GameObject nRail = Instantiate(deepRoad, Vector3.zero, Quaternion.identity) as GameObject;
			nRail.transform.position = new Vector3(mX, 0,0);
			nRail.transform.SetParent(roadBothLinePacked.transform);
			mX++;
		}
		MeshCombine.CreatePrefab(roadBothLinePacked, pathFolder, "Road", "RoadBothLine");
		
		Destroy(roadBothLinePacked);

		//BREAK =========================================================
		
		GameObject roadBottomLinePacked = new GameObject("roadBottomLinePacked");
		mX = xMinEffectiveBoard;
		while(mX <= xMaxEffectiveBoard){
			GameObject nRoad;
			if(mX % 2 == 0){
				nRoad = Instantiate(roadBottomLine, Vector3.zero, Quaternion.identity)as GameObject;
			}
			else
				nRoad = Instantiate(road, Vector3.zero, Quaternion.identity)as GameObject;
			nRoad.transform.position = new Vector3(mX, 0, 0);
			nRoad.transform.SetParent(roadBottomLinePacked.transform);
			mX++;
		}
		mX = xMinBoard;
		while(mX < xMinEffectiveBoard){
			GameObject nRail = Instantiate(deepRoad, Vector3.zero, Quaternion.identity) as GameObject;
			nRail.transform.position = new Vector3(mX, 0,0);
			nRail.transform.SetParent(roadBottomLinePacked.transform);
			mX++;
		}
		mX = xMaxEffectiveBoard+1;
		while(mX <= xMaxBoard){
			GameObject nRail = Instantiate(deepRoad, Vector3.zero, Quaternion.identity) as GameObject;
			nRail.transform.position = new Vector3(mX, 0,0);
			nRail.transform.SetParent(roadBottomLinePacked.transform);
			mX++;
		}
		MeshCombine.CreatePrefab(roadBottomLinePacked, pathFolder, "Road", "RoadBottomLine");

		Destroy(roadBottomLinePacked);
#endif
	}
            public static GameObject CombineAllMeshesInGameObject(List <Material> matsInCombine, MeshFilter[] sourceMeshFilters, MeshRenderer[] sourceMeshRenderers)
            {
                // ---------------------------------------------------------------------------
                // Extract Meshes into Separate CombineInstances based on Material
                // ---------------------------------------------------------------------------

                // Create a MeshCombine Class Array the size of the uniqueMats List and initialize
                MeshCombine[] uniqueMatMeshCombine = new MeshCombine[matsInCombine.Count];
                for (int i = 0; i < matsInCombine.Count; i++)
                {
                    uniqueMatMeshCombine[i]             = new MeshCombine();
                    uniqueMatMeshCombine[i].combineList = new List <CombineInstance>();
                }

                // Prepare variables
                CombineInstance combineInstance;

                // Loop through each MeshRenderer in sourceMeshRenderers
                for (int i = 0; i < sourceMeshRenderers.Length; i++)
                {
                    // Loop through each Material in each MeshRenderer
                    for (int j = 0; j < sourceMeshRenderers[i].sharedMaterials.Length; j++)
                    {
                        // Loop through each Material in the uniqueMats List
                        for (int k = 0; k < matsInCombine.Count; k++)
                        {
                            // If this Material matches the Material in the uniqueMats List
                            if (sourceMeshRenderers[i].sharedMaterials[j] == matsInCombine[k])
                            {
                                // Initialize a Combine Instance
                                combineInstance = new CombineInstance();

                                // Copy this mesh to the Combine Instance
                                combineInstance.mesh = sourceMeshFilters[i].sharedMesh;

                                // Set it to only include the Mesh with the specified material
                                combineInstance.subMeshIndex = j;

                                // Transform to world matrix
                                combineInstance.transform = sourceMeshFilters[i].transform.localToWorldMatrix;

                                // Add this CombineInstance to the appropriate CombineInstance List (by Material)
                                uniqueMatMeshCombine[k].combineList.Add(combineInstance);
                            }
                        }
                    }
                }

                // ---------------------------------------------------------------------------
                // Combine all Mesh Instances into a single GameObject
                // ---------------------------------------------------------------------------

                // Disable all Source GameObjects
                for (int i = 0; i < sourceMeshFilters.Length; i++)
                {
                    sourceMeshFilters[i].gameObject.SetActive(false);
                }

                // Create the final GameObject that will hold all the other GameObjects
                GameObject finalGameObject = new GameObject("Merged Meshes");

                // Create a new GameObject Array the size of the All Materials List
                GameObject[] singleMatGameObject = new GameObject[matsInCombine.Count];

                // Combine meshes for each singleMatGameObject into one mesh
                CombineInstance[] finalCombineInstance = new CombineInstance[matsInCombine.Count];

                // Enable all Source GameObjects
                for (int i = 0; i < sourceMeshFilters.Length; i++)
                {
                    sourceMeshFilters[i].gameObject.SetActive(true);
                }

                // Prepare mesh filter and mesh renderer arrays for the final combine
                MeshFilter[]   meshFilter   = new MeshFilter[matsInCombine.Count];
                MeshRenderer[] meshRenderer = new MeshRenderer[matsInCombine.Count];

                // Loop through each Material in the uniqueMats List
                for (int i = 0; i < matsInCombine.Count; i++)
                {
                    // Initialize GameObject
                    singleMatGameObject[i] = new GameObject();

                    singleMatGameObject[i].name = matsInCombine[i].name;

                    // Add a MeshRender and set the Material
                    meshRenderer[i] = singleMatGameObject[i].AddComponent <MeshRenderer>();
                    meshRenderer[i].sharedMaterial = matsInCombine[i];

                    // Add a MeshFilter and add the Combined Meshes with this Material
                    meshFilter[i]                        = singleMatGameObject[i].AddComponent <MeshFilter>();
                    meshFilter[i].sharedMesh             = new Mesh();
                    meshFilter[i].sharedMesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
                    meshFilter[i].sharedMesh.CombineMeshes(uniqueMatMeshCombine[i].combineList.ToArray());

                    // Weld duplicate vertices
                    //meshFilter[i].sharedMesh = WeldVertices(meshFilter[i].sharedMesh, 0.001f);

                    // Add this Mesh to the final Mesh Combine
                    finalCombineInstance[i].mesh      = meshFilter[i].sharedMesh;
                    finalCombineInstance[i].transform = meshFilter[i].transform.localToWorldMatrix;

                    // Hide the GameObject
                    meshFilter[i].gameObject.SetActive(false);

                    GameObject.DestroyImmediate(singleMatGameObject[i]);
                }

                // Combine the Mesh, optimize it, and recalculate the bounds
                Mesh mesh = new Mesh();

                mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
                mesh.CombineMeshes(finalCombineInstance, false, false);
                MeshUtility.Optimize(mesh);
                mesh.RecalculateBounds();

                // Add MeshFilter to final GameObject and Combine all Meshes
                MeshFilter finalMeshFilter = finalGameObject.AddComponent <MeshFilter>();

                finalMeshFilter.sharedMesh = new Mesh();
                finalMeshFilter.sharedMesh = mesh;

                // Add MeshRenderer to final GameObject Attach Materials
                MeshRenderer finalMeshRenderer = finalGameObject.AddComponent <MeshRenderer>();

                finalMeshRenderer.sharedMaterials = matsInCombine.ToArray();

                return(finalGameObject);
            }
 void Awake()
 {
     meshCombine = new MeshCombine();
     meshCombine.combineMeshes(rocksParent);
 }