using UnityEngine; using UnityEngine.Rendering.HighDefinition; [ExecuteInEditMode] public class FoamShore : MonoBehaviour { public Material deformerCustomMaterial; public WaterDeformer waterDeformer; public float minAliveTime = 6f; public float maxAliveTime = 8f; public float maxPosition = 5f; public float maxSize = 15f; private MaterialPropertyBlock mpb; private float aliveTime; private float startTime; private DecalProjector m_DecalProjectorComponent; private void Awake() { m_DecalProjectorComponent = GetComponent(); m_DecalProjectorComponent.material = new Material(m_DecalProjectorComponent.material); } public void OnEnable() { mpb = new MaterialPropertyBlock(); waterDeformer.SetPropertyBlock(mpb); startTime = Time.realtimeSinceStartup; aliveTime = Random.Range(minAliveTime, maxAliveTime); Reset(); } private void Update() { float num = (Time.realtimeSinceStartup - startTime) % aliveTime / aliveTime; float num2 = 1f - Mathf.Abs(4f * Mathf.Pow(num - 0.5f, 2f)); float value = (((double)num <= 0.5) ? num2 : 1f); float value2 = (((double)num <= 0.5) ? 0f : (1f - num2)); Vector3 size = m_DecalProjectorComponent.size; size.y = Mathf.Lerp(0f, maxSize, num2); m_DecalProjectorComponent.size = size; Vector3 localPosition = base.transform.localPosition; localPosition.x = Mathf.Lerp(0f, maxPosition, num2); base.transform.localPosition = localPosition; m_DecalProjectorComponent.material.SetFloat("_Opacity", value); m_DecalProjectorComponent.material.SetFloat("_NormalizedAliveTime", num); m_DecalProjectorComponent.material.SetFloat("_ContrastNormalized", value2); mpb.SetFloat("_NormalizedAliveTime", num); Vector2 regionSize = waterDeformer.regionSize; regionSize.y = Mathf.Lerp(0f, maxSize, num2); waterDeformer.regionSize = regionSize; waterDeformer.amplitude = num2 * 0.7f; if ((double)num > 0.99) { m_DecalProjectorComponent.material.SetFloat("_Opacity", 0f); waterDeformer.regionSize = new Vector2(regionSize.x, 0f); m_DecalProjectorComponent.size = new Vector3(size.x, 0f, size.z); base.gameObject.SetActive(value: false); } } public void Reset() { Random.Range(0, 2); Random.Range(0, 2); m_DecalProjectorComponent.material.SetFloat("_Opacity", 0f); } }