Files
2026-02-21 16:45:37 +08:00

87 lines
1.7 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Serialization;
namespace UltimateWater.Internal
{
[RequireComponent(typeof(Renderer))]
public sealed class WaterSimpleMask : MonoBehaviour
{
[FormerlySerializedAs("water")]
[SerializeField]
private Water _Water;
[FormerlySerializedAs("renderQueuePriority")]
[SerializeField]
private int _RenderQueuePriority;
private const string _WaterIdName = "_WaterId";
public Renderer Renderer { get; private set; }
public int RenderQueuePriority
{
get
{
return _RenderQueuePriority;
}
}
public Water Water
{
get
{
return _Water;
}
set
{
if (!(_Water == value))
{
base.enabled = false;
_Water = value;
base.enabled = true;
}
}
}
private void OnValidate()
{
SetObjectLayer();
}
private void OnEnable()
{
Renderer = GetComponent<Renderer>();
Renderer.enabled = false;
Renderer.material.SetFloat("_WaterId", 1 << _Water.WaterId);
SetObjectLayer();
if (Renderer == null)
{
throw new InvalidOperationException("WaterSimpleMask is attached to an object without any renderer.");
}
_Water.Renderer.AddMask(this);
_Water.WaterIdChanged += OnWaterIdChanged;
}
private void OnDisable()
{
_Water.WaterIdChanged -= OnWaterIdChanged;
_Water.Renderer.RemoveMask(this);
}
private void SetObjectLayer()
{
if (base.gameObject.layer != WaterProjectSettings.Instance.WaterTempLayer)
{
base.gameObject.layer = WaterProjectSettings.Instance.WaterTempLayer;
}
}
private void OnWaterIdChanged()
{
Renderer component = GetComponent<Renderer>();
component.material.SetFloat("_WaterId", 1 << _Water.WaterId);
}
}
}