Files
BH3/Assets/Scripts/Assembly-CSharp/MoleMole/MonoMeiHairFadeAnimation.cs
2025-08-13 09:26:42 +08:00

147 lines
3.3 KiB
C#

using System;
using UnityEngine;
namespace MoleMole
{
[RequireComponent(typeof(Renderer))]
public class MonoMeiHairFadeAnimation : MonoBehaviour
{
[Serializable]
public class FadeParams
{
public float offset = 1f;
public float range = 0.01f;
public float value = 1f;
public bool IsValidFade()
{
return (double)value < 0.9999;
}
public static FadeParams Lerp(FadeParams params1, FadeParams params2, float t)
{
FadeParams fadeParams = new FadeParams();
if (!params1.IsValidFade())
{
fadeParams.offset = params2.offset;
fadeParams.range = params2.range;
}
if (!params2.IsValidFade())
{
fadeParams.offset = params1.offset;
fadeParams.range = params1.range;
}
else
{
fadeParams.offset = Mathf.Lerp(params1.offset, params2.offset, t);
fadeParams.range = Mathf.Lerp(params1.range, params2.range, t);
}
fadeParams.value = Mathf.Lerp(params1.value, params2.value, t);
return fadeParams;
}
}
private static readonly string NORMAL_SHADER_PATH = "miHoYo/Character/Avatar";
private static readonly string FADING_SHADER_PATH = "miHoYo/Character/Avatar UI Hair";
private Shader _normalShader;
private Shader _fadingShader;
public float fadeDuration;
public FadeParams paramsForWeapon;
public FadeParams paramsForStigmata;
private float _timer;
private FadeParams _originalParams;
private FadeParams _currentParams;
private FadeParams _fromParams;
private FadeParams _toParams;
private Renderer _renderer;
private MaterialPropertyBlock _mpb;
public void CancelFade()
{
FadeToParams(_originalParams);
}
public void FadeForWeaponTab()
{
FadeToParams(paramsForWeapon);
}
public void FadeForStigmataTab()
{
FadeToParams(paramsForStigmata);
}
private void FadeToParams(FadeParams targetParams)
{
_timer = 0f;
_fromParams = _currentParams;
_toParams = targetParams;
}
private void Start()
{
_originalParams = new FadeParams();
_originalParams.value = 1f;
_currentParams = _originalParams;
_fromParams = _originalParams;
_timer = 0f;
_renderer = GetComponent<Renderer>();
_mpb = new MaterialPropertyBlock();
_normalShader = Shader.Find(NORMAL_SHADER_PATH);
_fadingShader = Shader.Find(FADING_SHADER_PATH);
}
private void Update()
{
if (!(_timer < fadeDuration) || _toParams == null)
{
return;
}
_timer += Time.deltaTime;
FadeParams fadeParams = FadeParams.Lerp(_fromParams, _toParams, Mathf.Clamp01(_timer / fadeDuration));
bool flag = (double)_currentParams.value < 0.99;
bool flag2 = (double)fadeParams.value < 0.99;
if (flag2 && !flag)
{
for (int i = 0; i < _renderer.materials.Length; i++)
{
_renderer.materials[i].shader = _fadingShader;
}
}
else if (!flag2 && flag)
{
for (int j = 0; j < _renderer.materials.Length; j++)
{
_renderer.materials[j].shader = _normalShader;
}
}
_currentParams = fadeParams;
ApplyFade();
}
private void ApplyFade()
{
_renderer.GetPropertyBlock(_mpb);
_mpb.SetFloat("_DirectionalFadeOffset", _currentParams.offset);
_mpb.SetFloat("_DirectionalFadeRange", _currentParams.range);
_mpb.SetFloat("_DirectionalFadeValue", _currentParams.value);
_renderer.SetPropertyBlock(_mpb);
}
}
}