57 lines
1.6 KiB
C#
57 lines
1.6 KiB
C#
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<MeshRenderer>();
|
|
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<MeshRenderer>();
|
|
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<MeshRenderer>();
|
|
var bounds = meshRenderer.bounds;
|
|
Gizmos.DrawWireCube(bounds.center, bounds.size);
|
|
}
|
|
}
|