namespace Assets.Scripts.Water { using UnityEngine; /// /// This class switchs material of dynamic objects if they enter or exit any water area /// After switching to water material it pushes water area properties to dynamic object material /// It allows objects to be under the lake or be in the different water /// Also switching material to diffuse after exiting the water gives a bit performance /// public class WaterMaterialSwitcher : MonoBehaviour { [SerializeField] private Renderer renderer; [SerializeField] private Material waterMaterial; [SerializeField] private Material diffuseMaterial; private MaterialPropertyBlock defaulPropertyBlock; public void Awake() { defaulPropertyBlock = new MaterialPropertyBlock(); renderer.GetPropertyBlock(defaulPropertyBlock); } public void OnTriggerEnter(Collider collider) { if (collider.tag == "Water") { var waterPropertyBlock = collider.GetComponent().WaterPropertyBlock; renderer.sharedMaterial = waterMaterial; renderer.SetPropertyBlock(waterPropertyBlock); } } public void OnTriggerExit(Collider collider) { if (collider.tag == "Water") { renderer.sharedMaterial = diffuseMaterial; renderer.SetPropertyBlock(defaulPropertyBlock); } } } }