using UnityEngine; using UnityEngine.Rendering; [RequireComponent(typeof(MeshRenderer)), RequireComponent(typeof(MeshFilter))] public class GrassChunk : MonoBehaviour { [SerializeField] private Material _materialLOD0; public Material MaterialLOD0 { get { return _materialLOD0; } set { _materialLOD0 = value; UpdateLODAssets(); } } [SerializeField] private Mesh _meshLOD0; public Mesh MeshLOD0 { get { return _meshLOD0; } set { _meshLOD0 = value; UpdateLODAssets(); } } [SerializeField] private bool _enableShadowsLOD0; public bool EnableShadowsLOD0 { get { return _enableShadowsLOD0; } set { _enableShadowsLOD0 = value; UpdateLODAssets(); } } [SerializeField] private Material _materialLOD1; public Material MaterialLOD1 { get { return _materialLOD1; } set { _materialLOD1 = value; UpdateLODAssets(); } } [SerializeField] private Mesh _meshLOD1; public Mesh MeshLOD1 { get { return _meshLOD1; } set { _meshLOD1 = value; UpdateLODAssets(); } } [SerializeField] private bool _enableShadowsLOD1; public bool EnableShadowsLOD1 { get { return _enableShadowsLOD1; } set { _enableShadowsLOD1 = value; UpdateLODAssets(); } } [SerializeField] private Material _materialLOD2; public Material MaterialLOD2 { get { return _materialLOD2; } set { _materialLOD2 = value; UpdateLODAssets(); } } [SerializeField] private Mesh _meshLOD2; public Mesh MeshLOD2 { get { return _meshLOD2; } set { _meshLOD2 = value; UpdateLODAssets(); } } [SerializeField] private bool _enableShadowsLOD2; public bool EnableShadowsLOD2 { get { return _enableShadowsLOD2; } set { _enableShadowsLOD2 = value; UpdateLODAssets(); } } [SerializeField] private Material _materialLOD3; public Material MaterialLOD3 { get { return _materialLOD3; } set { _materialLOD3 = value; UpdateLODAssets(); } } [SerializeField] private Mesh _meshLOD3; public Mesh MeshLOD3 { get { return _meshLOD3; } set { _meshLOD3 = value; UpdateLODAssets(); } } [SerializeField] private bool _enableShadowsLOD3; public bool EnableShadowsLOD3 { get { return _enableShadowsLOD3; } set { _enableShadowsLOD3 = value; UpdateLODAssets(); } } private int _lod; public int LOD { get { return _lod; } set { if (_lod == value) return; _lod = value; UpdateLODAssets(); } } private MeshRenderer _meshRenderer; public MeshRenderer MeshRenderer { get { if (!_meshRenderer) { _meshRenderer = GetComponent(); } return _meshRenderer; } private set { _meshRenderer = value; } } private MeshFilter _meshFilter; public MeshFilter MeshFilter { get { if (!_meshFilter) { _meshFilter = GetComponent(); } return _meshFilter; } private set { _meshFilter = value; } } private void UpdateLODAssets() { switch (_lod) { case 0: MeshRenderer.sharedMaterial = _materialLOD0; MeshRenderer.shadowCastingMode = EnableShadowsLOD0 ? ShadowCastingMode.On : ShadowCastingMode.Off; MeshFilter.sharedMesh = _meshLOD0; break; case 1: MeshRenderer.sharedMaterial = _materialLOD1; MeshRenderer.shadowCastingMode = EnableShadowsLOD1 ? ShadowCastingMode.On : ShadowCastingMode.Off; MeshFilter.sharedMesh = _meshLOD1; break; case 2: MeshRenderer.sharedMaterial = _materialLOD2; MeshRenderer.shadowCastingMode = EnableShadowsLOD2 ? ShadowCastingMode.On : ShadowCastingMode.Off; MeshFilter.sharedMesh = _meshLOD2; break; case 3: MeshRenderer.sharedMaterial = _materialLOD3; MeshRenderer.shadowCastingMode = EnableShadowsLOD3 ? ShadowCastingMode.On : ShadowCastingMode.Off; MeshFilter.sharedMesh = _meshLOD3; break; default: Debug.LogError("ehm?"); break; } } private void OnDrawGizmosSelected() { Gizmos.color = new Color(1f, 0.7f, 0f, 0.2f); var meshRenderer = GetComponent(); var bounds = meshRenderer.bounds; Gizmos.DrawWireCube(bounds.center, bounds.size); } }