using System; using UnityEngine; [RequireComponent(typeof(MeshRenderer)), RequireComponent(typeof(MeshFilter))] public class GrassChunk : MonoBehaviour { [Header("LOD 0")] public Material grassMaterialLOD0; [Header("LOD 1")] public Material grassMaterialLOD1; [Header("LOD 2")] public Material grassMaterialLOD2; private int lod = -1; [SerializeField] public int LOD { get { return lod; } set { if (lod == value) return; lod = value; var meshRenderer = GetComponent(); switch (lod) { case 0: meshRenderer.sharedMaterial = grassMaterialLOD0; break; case 1: meshRenderer.sharedMaterial = grassMaterialLOD1; break; case 2: meshRenderer.sharedMaterial = grassMaterialLOD2; break; } } } private void Update() { UpdateLOD(); } public void UpdateLOD() { var meshRenderer = GetComponent(); if (Camera.main) { var sqrCamDist = meshRenderer.bounds.SqrDistance(Camera.main.transform.position); if (sqrCamDist > 20f * 20f) { LOD = 2; } else if (sqrCamDist > 5f * 5f) { LOD = 1; } else { LOD = 0; } } } private void OnDrawGizmos() { Gizmos.color = new Color(1f, 0.7f, 0f, 0.5f); var meshRenderer = GetComponent(); var bounds = meshRenderer.bounds; Gizmos.DrawWireCube(bounds.center, bounds.size); } }