TiledTerrain/Assets/Tile Terrain/Runtime/TerrainFloorRenderer.cs

92 lines
2.1 KiB
C#
Raw Normal View History

2024-08-28 11:22:57 +03:00
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<MeshFilter>().sharedMesh = Resources.GetBuiltinResource<Mesh>("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<T>(ref T component) where T : Component
{
if(component == null)
component = gameObject.TryGetComponent(out T found) ? found : gameObject.AddComponent<T>();
}
private void OnDestroy()
{
UnlinkMaterial();
}
}
}