GrassLoader.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace MTE
  5. {
  6. //Please keep this attribute, it is used by MTE editor.
  7. [ExecuteInEditMode]
  8. public class GrassLoader : MonoBehaviour
  9. {
  10. public GrassList grassInstanceList = null;
  11. private void Start()
  12. {
  13. this.RemoveOldGrasses();
  14. this.GenerateGrasses(new GrassGenerationSettings
  15. {
  16. HideGrassObjectInEditor = true,
  17. UseStaticBatch = true
  18. });
  19. }
  20. /// <summary>
  21. /// Remove all grass objects under this GameObject
  22. /// </summary>
  23. /// <remarks>
  24. /// Please keep this method public, because MTE Editor will call this method.
  25. /// </remarks>
  26. public void RemoveOldGrasses()
  27. {
  28. bool isEditor = !Application.isPlaying;
  29. // remove child GameObjects
  30. for (var i = this.transform.childCount - 1; i >= 0; i--)
  31. {
  32. var objTransform = this.transform.GetChild(i);
  33. if (isEditor)
  34. {
  35. DestroyImmediate(objTransform.gameObject);
  36. }
  37. else
  38. {
  39. Destroy(objTransform.gameObject);
  40. }
  41. }
  42. }
  43. /// <summary>
  44. /// Generate grass instances in the scene
  45. /// </summary>
  46. /// <remarks>
  47. /// Please keep this method public, because MTE will call this method to generate grasses in editor.
  48. /// </remarks>
  49. public void GenerateGrasses(GrassGenerationSettings settings)
  50. {
  51. if (grassInstanceList == null) return;
  52. // the star: three quads
  53. var stars = grassInstanceList.grasses;
  54. if (stars != null && stars.Count != 0)
  55. {
  56. foreach (var star in stars)
  57. {
  58. GameObject grassObject;
  59. MeshRenderer grassMeshRenderer;
  60. Mesh grassMesh;
  61. GrassUtil.GenerateGrassStarObject(
  62. star.Position,
  63. Quaternion.Euler(0, star.RotationY, 0),
  64. star.Width, star.Height,
  65. star.Material,
  66. out grassObject, out grassMeshRenderer, out grassMesh);
  67. grassObject.transform.SetParent(this.transform, true);
  68. grassObject.hideFlags = settings.HideGrassObjectInEditor ?
  69. HideFlags.HideInHierarchy : HideFlags.None;
  70. //apply existing lightmap data to generated grass object
  71. grassMeshRenderer.lightmapIndex = star.LightmapIndex;
  72. grassMeshRenderer.lightmapScaleOffset = star.LightmapScaleOffset;
  73. }
  74. if (settings.UseStaticBatch)
  75. {
  76. StaticBatchingUtility.Combine(this.gameObject);
  77. }
  78. }
  79. // the quad: one quad
  80. var quads = grassInstanceList.quads;
  81. if (quads != null && quads.Count != 0)
  82. {
  83. foreach (var quad in quads)
  84. {
  85. GameObject grassObject;
  86. MeshRenderer grassMeshRenderer;
  87. Mesh grassMesh;
  88. GrassUtil.GenerateGrassQuadObject(
  89. quad.Position,
  90. Quaternion.Euler(0, quad.RotationY, 0),
  91. quad.Width, quad.Height,
  92. quad.Material,
  93. out grassObject, out grassMeshRenderer, out grassMesh);
  94. grassObject.transform.SetParent(this.transform, true);
  95. grassObject.hideFlags = settings.HideGrassObjectInEditor ?
  96. HideFlags.HideInHierarchy : HideFlags.None;
  97. //apply exist lightmap data to generated grass object
  98. grassMeshRenderer.lightmapIndex = quad.LightmapIndex;
  99. grassMeshRenderer.lightmapScaleOffset = quad.LightmapScaleOffset;
  100. }
  101. // billboards shouldn't be static-batched
  102. }
  103. }
  104. }
  105. }