using System; using UnityEngine; using Object = UnityEngine.Object; namespace BitGames.Terrain { [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))] [DisallowMultipleComponent] public class TerrainFloorRenderer : MonoBehaviour, ITerrainMaterialUser { public TerrainAsset Asset; private MeshRenderer _renderer; private MeshFilter _meshFilter; private Material _instancedMaterial; private void Awake() { LinkMaterial(); ActivateAsset(); UpdateMesh(); } private void UpdateMesh() { VerifyComponents(); transform.localScale = (Asset != null ? Asset.Size : 32) * RuntimeGlobals.TILE_SIZE * Vector3.one; transform.position = Vector3.zero; transform.rotation = Quaternion.Euler(90, 0, 0); GetComponent().sharedMesh = Resources.GetBuiltinResource("Quad.fbx"); } private void LinkMaterial() { VerifyComponents(); if (_instancedMaterial == null) { _instancedMaterial = RuntimeGlobals.RegisterMaterialUser(this); } _renderer.sharedMaterial = _instancedMaterial; } private void UnlinkMaterial() { RuntimeGlobals.RemoveMaterialUser(this); } private void ActivateAsset() { if(Asset != null) RuntimeGlobals.ActivateAsset(Asset); } #if UNITY_EDITOR internal void OnValidate() { UpdateMesh(); LinkMaterial(); ActivateAsset(); } internal void HideMeshFilterRenderer() { VerifyComponents(); const HideFlags flags = HideFlags.HideInInspector; // Hide mesh renderer and filter _renderer.hideFlags = flags; _meshFilter.hideFlags = flags; } #endif private void VerifyComponents() { EnsureComponent(ref _renderer); EnsureComponent(ref _meshFilter); } private void EnsureComponent(ref T component) where T : Component { if(component == null) component = gameObject.TryGetComponent(out T found) ? found : gameObject.AddComponent(); } private void OnDestroy() { UnlinkMaterial(); } } }