void MergeGrass(GameObject[] _grassesToMerge) { GameObject mergedMesh = new GameObject("MergedGrassGroup"); Vector3 avgPos = GetAvgPosOfObjs(_grassesToMerge); mergedMesh.transform.position = avgPos; //Merge objects to one mesh int count = _grassesToMerge.Length; MeshFilter[] meshFilters = new MeshFilter[count]; for (int i = 0; i < count; i++) { meshFilters[i] = _grassesToMerge[i].transform.GetChild(0).GetComponent <MeshFilter>(); _grassesToMerge[i].transform.position -= avgPos; } GeneratedMesh.CombineMeshes(mergedMesh.transform, meshFilters); ///////////////////////// //AddLods mergedMesh.AddComponent <LODGroup>(); LOD[] lods = new LOD[1]; Renderer[] renderers = new Renderer[1]; renderers[0] = mergedMesh.transform.GetChild(0).GetComponent <Renderer>(); lods[0] = new LOD(0.07f, renderers); mergedMesh.GetComponent <LODGroup>().SetLODs(lods); mergedMesh.GetComponent <LODGroup>().RecalculateBounds(); }
void MergeGrass() { //Merge objects to one mesh int count = generatedBranches.Length; MeshFilter[] meshFilters = new MeshFilter[count]; for (int i = 0; i < count; i++) { meshFilters[i] = generatedBranches[i].GetComponent <MeshFilter>(); } mergedMesh = GeneratedMesh.CombineMeshes(transform, meshFilters); }
private void GenerateFood() { int count = 5; GeneratedLeaves[] food = new GeneratedLeaves[count]; for (int i = 0; i < count; i++) { food[i] = Instantiate(VegetationGenerator.instance.generatedBushFoodPrefab, generatedLeaves.transform); food[i].transform.localPosition = generatedLeaves.GetComponent <MeshFilter>().mesh.vertices[Random.Range(0, generatedLeaves.GetComponent <MeshFilter>().mesh.vertexCount - 1)]; food[i].Generate(0); food[i].transform.localScale = new Vector3(0.15f, 0.15f, 0.15f); food[i].VerySlowlyConvertToFlatShading(); } //Merge food objects to one mesh count = food.Length; MeshFilter[] meshFilters = new MeshFilter[count]; for (int i = 0; i < count; i++) { meshFilters[i] = food[i].GetComponent <MeshFilter>(); } foodObject = GeneratedMesh.CombineMeshes(generatedLeaves.transform, meshFilters); }
protected IEnumerator MergeChildTrees(float LOD0_Distance, float LOD1_Distance) { yield return(new WaitForEndOfFrame()); List <Tree> treesToMerge = new List <Tree>(); if (transform.parent && !transform.parent.GetComponent <Tree>()) { treesToMerge.Add(this); for (int i = 0; i < transform.childCount; i++) { if (transform.GetChild(i).GetComponent <Tree>()) { treesToMerge.Add(transform.GetChild(i).GetComponent <Tree>()); } } //Merge int count = treesToMerge.Count; if (count > 0) { List <MeshFilter> meshFiltersBranches = new List <MeshFilter>(); List <MeshFilter> meshFiltersLeaves = new List <MeshFilter>(); List <MeshFilter> meshFiltersBranchesLOD = new List <MeshFilter>(); List <MeshFilter> meshFiltersLeavesLOD = new List <MeshFilter>(); for (int i = 0; i < count; i++) { meshFiltersBranches.Add(treesToMerge[i].generatedBranch.GetComponent <MeshFilter>()); meshFiltersBranches.AddRange(treesToMerge[i].generatedBranchesParent.GetComponentsInChildren <MeshFilter>()); meshFiltersLeaves.Add(treesToMerge[i].generatedLeaves.GetComponent <MeshFilter>()); meshFiltersBranchesLOD.Add(treesToMerge[i].generatedBranchLOD.GetComponent <MeshFilter>()); meshFiltersLeavesLOD.Add(treesToMerge[i].generatedLeavesLOD.GetComponent <MeshFilter>()); } GameObject mergedBranches = GeneratedMesh.CombineMeshes(transform, meshFiltersBranches.ToArray()); mergedBranches.AddComponent <GeneratedBranch>(); mergedBranches.name = "Newly merged branches"; generatedBranch = mergedBranches.GetComponent <GeneratedBranch>(); GameObject mergedLeaves = GeneratedMesh.CombineMeshes(transform, meshFiltersLeaves.ToArray()); mergedLeaves.AddComponent <GeneratedLeaves>(); mergedLeaves.name = "Newly merged leaves"; generatedLeaves = mergedLeaves.GetComponent <GeneratedLeaves>(); //LOD GameObject mergedBranchesLOD = GeneratedMesh.CombineMeshes(transform, meshFiltersBranchesLOD.ToArray()); mergedBranchesLOD.AddComponent <GeneratedBranch>(); mergedBranchesLOD.name = "Newly merged branches LOD"; generatedBranchLOD = mergedBranchesLOD.GetComponent <GeneratedBranch>(); GameObject mergedLeavesLOD = GeneratedMesh.CombineMeshes(transform, meshFiltersLeavesLOD.ToArray()); mergedLeavesLOD.AddComponent <GeneratedLeaves>(); mergedLeavesLOD.name = "Newly merged leaves LOD"; generatedLeavesLOD = mergedLeavesLOD.GetComponent <GeneratedLeaves>(); } AddLODsNew(LOD0_Distance, LOD1_Distance); } }
void CreateLeaves(int width, int leavesAmount) { float startPosY = 1.5f; float startScale = leavesAmount; int leavesWidth = width; GeneratedCone[] generatedLeavesLOD0 = new GeneratedCone[leavesAmount]; GeneratedCone firstLeaves = Instantiate(VegetationGenerator.instance.generatedConeLeavesPrefab, transform); firstLeaves.Generate(leavesWidth, 1, null); //firstLeaves.VerySlowlyConvertToFlatShading(); firstLeaves.transform.localPosition = new Vector3(0, startPosY, 0); firstLeaves.transform.localScale *= startScale; startScale = 1 * 0.8f; generatedLeavesLOD0[0] = firstLeaves; firstLeaves.GetComponent <Renderer>().material.color = new Color(Random.Range(0.0f, 1.0f), Random.Range(0.7f, 1.0f), Random.Range(0.0f, 0.35f)); //leaves1 = firstLeaves.gameObject; //Creating leaves for LOD0 for (int i = 1; i < leavesAmount; i++) { GeneratedCone newLeaves = Instantiate(VegetationGenerator.instance.generatedConeLeavesPrefab, generatedLeavesLOD0[i - 1].transform /*transform*/); newLeaves.Generate(leavesWidth, 1, null); //newLeaves.VerySlowlyConvertToFlatShading(); newLeaves.transform.localPosition = newLeaves.transform.up * 0.575f /*new Vector3(0,0,0)*/; newLeaves.transform.localScale = new Vector3(1f, 1.25f, 1f) * startScale / firstLeaves.transform.parent.localScale.x; newLeaves.transform.localRotation = Quaternion.Euler(new Vector3(Random.Range(-5f, 5f), 0, Random.Range(-5f, 5f))); startScale *= 0.9f; generatedLeavesLOD0[i] = newLeaves; newLeaves.GetComponent <Renderer>().material.color = firstLeaves.GetComponent <Renderer>().material.color; } //Creating leaves for LOD1 GameObject[] generatedLeavesLOD1 = new GameObject[leavesAmount]; int count = generatedLeavesLOD0.Length; generatedLeavesLOD1[0] = CreateLODFromMesh(generatedLeavesLOD0[0].gameObject, 1); generatedLeavesLOD1[0].GetComponent <Renderer>().material.color = firstLeaves.GetComponent <Renderer>().material.color; for (int i = 1; i < count; i++) { generatedLeavesLOD1[i] = CreateLODFromMesh(generatedLeavesLOD0[i].gameObject, 1); generatedLeavesLOD1[i].transform.parent = generatedLeavesLOD1[i - 1].transform; generatedLeavesLOD1[i].transform.localScale = generatedLeavesLOD0[i].transform.localScale; generatedLeavesLOD1[i].transform.localRotation = generatedLeavesLOD0[i].transform.localRotation; generatedLeavesLOD1[i].GetComponent <Renderer>().material.color = firstLeaves.GetComponent <Renderer>().material.color; } //Making each leave flat-shaded for (int i = 0; i < count; i++) { generatedLeavesLOD0[i].GetComponent <GeneratedCone>().VerySlowlyConvertToFlatShading(); generatedLeavesLOD1[i].GetComponent <GeneratedCone>().VerySlowlyConvertToFlatShading(); } GameObject mergedLeavesLOD0; GameObject mergedLeavesLOD1; //Merge leaves objects to one mesh LOD0 count = generatedLeavesLOD0.Length; MeshFilter[] meshFilters = new MeshFilter[count]; for (int i = 0; i < count; i++) { meshFilters[i] = generatedLeavesLOD0[i].GetComponent <MeshFilter>(); } mergedLeavesLOD0 = GeneratedMesh.CombineMeshes(transform, meshFilters); //Merge leaves objects to one mesh LOD1 count = generatedLeavesLOD0.Length; meshFilters = new MeshFilter[count]; for (int i = 0; i < count; i++) { meshFilters[i] = generatedLeavesLOD1[i].GetComponent <MeshFilter>(); } mergedLeavesLOD1 = GeneratedMesh.CombineMeshes(transform, meshFilters); AddLODs(0.105f, 0.025f, ref mergedLeavesLOD0, ref mergedLeavesLOD1); }