Files
JJBB/Assets/Project/Script/Shader/FogDensityLerp.cs
2024-08-23 15:49:34 +08:00

95 lines
2.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using Games.Events;
using Module.Log;
using UnityEngine;
public class FogDensityLerp : MonoBehaviour
{
private static bool _usingFogLerp;
private FogSettingData _baseFogSettings;
private bool _isCurrent;
public FogSettingData maxFogSettings;
public float maxHeight = 20f;
public float minHeight = 10f;
private void LateUpdate()
{
var mainPlayer = ObjManager.Instance.MainPlayer;
if (mainPlayer != null)
{
var ratio = Mathf.Clamp01((mainPlayer.Position.y - minHeight) / (maxHeight - minHeight));
_baseFogSettings.Lerp(maxFogSettings, ratio);
}
}
private void Awake()
{
if (_usingFogLerp)
{
LogModule.ErrorLog(string.Format("发现重复的雾效密度调节器,于物体{0}", transform.GetHierarchyName()));
enabled = false;
}
else
{
_usingFogLerp = true;
_isCurrent = true;
LogModule.WarningLog(string.Format("当前场景使用雾效密度调节器进行雾效调节,于物体{0}", transform.GetHierarchyName()));
}
}
// 注如果编辑器中Awake不成功则不会出现Start效果
private void Start()
{
if (_isCurrent)
{
_baseFogSettings = new FogSettingData();
_baseFogSettings.Read();
EventDispatcher.Instance.Add(Games.Events.EventId.FogSettingUpdate, OnFogSettingUpdate);
OnFogSettingUpdate(null);
}
}
private void OnFogSettingUpdate(object args)
{
enabled = PlayerPreferenceData.SystemQualityFog;
}
private void OnDestroy()
{
if (_isCurrent)
{
_usingFogLerp = false;
_baseFogSettings.Write();
}
EventDispatcher.Instance.Remove(Games.Events.EventId.FogSettingUpdate, OnFogSettingUpdate);
}
[Serializable]
public class FogSettingData
{
public float density;
public float endDistance;
public float startDistance;
public void Read()
{
startDistance = RenderSettings.fogStartDistance;
endDistance = RenderSettings.fogEndDistance;
density = RenderSettings.fogDensity;
}
public void Write()
{
RenderSettings.fogStartDistance = startDistance;
RenderSettings.fogEndDistance = endDistance;
RenderSettings.fogDensity = density;
}
public void Lerp(FogSettingData other, float ratio)
{
RenderSettings.fogStartDistance = Mathf.Lerp(startDistance, other.startDistance, ratio);
RenderSettings.fogEndDistance = Mathf.Lerp(endDistance, other.endDistance, ratio);
RenderSettings.fogDensity = Mathf.Lerp(density, other.density, ratio);
}
}
}