using System; using System.Collections.Generic; using UnityEngine; namespace MTE { //Please keep this attribute, it is used by MTE editor. [ExecuteInEditMode] public class GrassLoader : MonoBehaviour { public GrassList grassInstanceList = null; private void Start() { this.RemoveOldGrasses(); this.GenerateGrasses(new GrassGenerationSettings { HideGrassObjectInEditor = true, UseStaticBatch = true }); } /// /// Remove all grass objects under this GameObject /// /// /// Please keep this method public, because MTE Editor will call this method. /// public void RemoveOldGrasses() { bool isEditor = !Application.isPlaying; // remove child GameObjects for (var i = this.transform.childCount - 1; i >= 0; i--) { var objTransform = this.transform.GetChild(i); if (isEditor) { DestroyImmediate(objTransform.gameObject); } else { Destroy(objTransform.gameObject); } } } /// /// Generate grass instances in the scene /// /// /// Please keep this method public, because MTE will call this method to generate grasses in editor. /// public void GenerateGrasses(GrassGenerationSettings settings) { if (grassInstanceList == null) return; // the star: three quads var stars = grassInstanceList.grasses; if (stars != null && stars.Count != 0) { foreach (var star in stars) { GameObject grassObject; MeshRenderer grassMeshRenderer; Mesh grassMesh; GrassUtil.GenerateGrassStarObject( star.Position, Quaternion.Euler(0, star.RotationY, 0), star.Width, star.Height, star.Material, out grassObject, out grassMeshRenderer, out grassMesh); grassObject.transform.SetParent(this.transform, true); grassObject.hideFlags = settings.HideGrassObjectInEditor ? HideFlags.HideInHierarchy : HideFlags.None; //apply existing lightmap data to generated grass object grassMeshRenderer.lightmapIndex = star.LightmapIndex; grassMeshRenderer.lightmapScaleOffset = star.LightmapScaleOffset; } if (settings.UseStaticBatch) { StaticBatchingUtility.Combine(this.gameObject); } } // the quad: one quad var quads = grassInstanceList.quads; if (quads != null && quads.Count != 0) { foreach (var quad in quads) { GameObject grassObject; MeshRenderer grassMeshRenderer; Mesh grassMesh; GrassUtil.GenerateGrassQuadObject( quad.Position, Quaternion.Euler(0, quad.RotationY, 0), quad.Width, quad.Height, quad.Material, out grassObject, out grassMeshRenderer, out grassMesh); grassObject.transform.SetParent(this.transform, true); grassObject.hideFlags = settings.HideGrassObjectInEditor ? HideFlags.HideInHierarchy : HideFlags.None; //apply exist lightmap data to generated grass object grassMeshRenderer.lightmapIndex = quad.LightmapIndex; grassMeshRenderer.lightmapScaleOffset = quad.LightmapScaleOffset; } // billboards shouldn't be static-batched } } } }