66 lines
1.9 KiB
C#
66 lines
1.9 KiB
C#
using FishNet.Object;
|
|
using UnityEngine;
|
|
|
|
namespace Players
|
|
{
|
|
public sealed class PlayerRevealController : NetworkBehaviour
|
|
{
|
|
private static readonly int RevealCenterId = Shader.PropertyToID("_RevealCenter");
|
|
private static readonly int RevealRadiusId = Shader.PropertyToID("_GlobalRevealRadius");
|
|
private static readonly int RevealEdgeSoftnessId = Shader.PropertyToID("_GlobalRevealEdgeSoftness");
|
|
|
|
[SerializeField] private Transform _center;
|
|
[SerializeField, Min(0f)] private float _revealRadius = 6f;
|
|
[SerializeField, Min(0.001f)] private float _edgeSoftness = 1f;
|
|
[SerializeField] private Vector3 _centerOffset;
|
|
|
|
public override void OnStartClient()
|
|
{
|
|
base.OnStartClient();
|
|
UpdateShaderGlobals();
|
|
}
|
|
|
|
public override void OnStopClient()
|
|
{
|
|
if (IsOwner)
|
|
ClearShaderGlobals();
|
|
|
|
base.OnStopClient();
|
|
}
|
|
|
|
private void LateUpdate()
|
|
{
|
|
if (!IsOwner)
|
|
return;
|
|
|
|
UpdateShaderGlobals();
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
if (IsOwner)
|
|
ClearShaderGlobals();
|
|
}
|
|
|
|
private void UpdateShaderGlobals()
|
|
{
|
|
if (!IsOwner)
|
|
return;
|
|
|
|
Transform center = _center != null ? _center : transform;
|
|
Vector3 worldCenter = center.position + _centerOffset;
|
|
|
|
Shader.SetGlobalVector(RevealCenterId, new Vector4(worldCenter.x, worldCenter.y, worldCenter.z, 1f));
|
|
Shader.SetGlobalFloat(RevealRadiusId, _revealRadius);
|
|
Shader.SetGlobalFloat(RevealEdgeSoftnessId, _edgeSoftness);
|
|
}
|
|
|
|
private void ClearShaderGlobals()
|
|
{
|
|
Shader.SetGlobalVector(RevealCenterId, Vector4.zero);
|
|
Shader.SetGlobalFloat(RevealRadiusId, 0f);
|
|
Shader.SetGlobalFloat(RevealEdgeSoftnessId, 0f);
|
|
}
|
|
}
|
|
}
|