NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Vehicle/State/VehicleStateFadeOut.cs

141 lines
5.7 KiB
C#

using System.Collections.Generic;
using Gameplay.Character;
using Gameplay.Vehicle.Impl;
using LTGame;
using PhxhSDK;
using UnityEngine;
namespace Gameplay.Vehicle.State
{
public class VehicleStateFadeOut : BaseVehicleState
{
private readonly float _totalTime = 1f;
private List<Material> _cacheMaterials;
private static readonly int FadeAlpha = Shader.PropertyToID("_fadeAlpha");
private static readonly int MainTex = Shader.PropertyToID("_MainTex");
private static readonly int MaskTex = Shader.PropertyToID("_MaskTex");
private static readonly int OutlineColor = Shader.PropertyToID("_OutlineColor");
private static readonly int Outline = Shader.PropertyToID("_Outline");
private static readonly int Factor = Shader.PropertyToID("_Factor");
private static readonly int ShadowScale = Shader.PropertyToID("_shadowScale");
private static readonly int SpecularScaleG = Shader.PropertyToID("_specularScaleG");
private static readonly int SpecularScaleB = Shader.PropertyToID("_specularScaleB");
private List<Renderer> _cacheRenderers;
private List<Material> _oldMaterials;
private List<GameObject> _cacheHideObjs;
public VehicleStateFadeOut(NormalVehicle vehicle) : base(vehicle, EVehicleState.FadeOut)
{
}
protected override void _OnEnter(NBaseState exitState,
object param)
{
base._OnEnter(exitState, param);
var isEnemy = owner.commonData.troopId != ETroopsId.Self;
var obj = owner.Node.GameObject;
// 获取所有meshrender
var allMeshRenders = obj.GetComponentsInChildren<UnityEngine.Renderer>();
_cacheMaterials = new List<Material>();
_cacheRenderers = new List<Renderer>();
_oldMaterials = new List<Material>();
_cacheHideObjs = new List<GameObject>();
foreach (var meshRender in allMeshRenders)
{
// 移除描边
OutlineManager.instance.RemoveRenderer(meshRender, isEnemy);
var oldMat = meshRender.material;
if (oldMat.shader.name != "NLD_URP/NLD_Charactor"
&& oldMat.shader.name != "NLD_URP/NLD_Charactor_NoRecvShadow")
{
meshRender.gameObject.SetActive(false);
_cacheHideObjs.Add(meshRender.gameObject);
continue;
}
var newShader = AssetManager.Instance.GetPreLoadResult<Shader>(Framework.Constants.SHADER_FADEOUT_PATH);
var newMat = new Material(newShader);
meshRender.material = newMat;
// 复制属性
// [MainTexture] _MainTex ("Texture", 2D) = "white" {}
// _MaskTex ("Mask", 2D) = "white" {}
// _OutlineColor("Outline Color",color)=(0.1,0.1,0.2,1)
// _Outline("Thick of Outline",range(0,0.1))=0.02
// _Factor("Factor",range(0,1)) = 0.5
// _shadowScale("ShadowScale", range(0, 1.0)) = 0.5
// _specularScaleG("SpecularScaleG", range(0, 10.0)) = 2.0
// _specularScaleB("SpecularScaleB", range(0, 10.0)) = 2.0
var oldTexture = oldMat.GetTexture(MainTex);
newMat.SetTexture(MainTex, oldTexture);
var oldMaskTex = oldMat.GetTexture(MaskTex);
newMat.SetTexture(MaskTex, oldMaskTex);
var oldOutlineColor = oldMat.GetColor(OutlineColor);
newMat.SetColor(OutlineColor, oldOutlineColor);
var oldOutline = oldMat.GetFloat(Outline);
newMat.SetFloat(Outline, oldOutline);
var oldFactor = oldMat.GetFloat(Factor);
newMat.SetFloat(Factor, oldFactor);
var oldShadowScale = oldMat.GetFloat(ShadowScale);
newMat.SetFloat(ShadowScale, oldShadowScale);
var oldSpecularScaleG = oldMat.GetFloat(SpecularScaleG);
newMat.SetFloat(SpecularScaleG, oldSpecularScaleG);
var oldSpecularScaleB = oldMat.GetFloat(SpecularScaleB);
newMat.SetFloat(SpecularScaleB, oldSpecularScaleB);
newMat.SetFloat(FadeAlpha, 1);
_cacheMaterials.Add(newMat);
_cacheRenderers.Add(meshRender);
_oldMaterials.Add(oldMat);
}
}
protected override void _OnRunning()
{
base._OnRunning();
var remainTime = Mathf.Clamp01(_totalTime - passTime);
var remainProgress = remainTime / _totalTime;
for (var i = 0; i < _cacheMaterials.Count; ++i)
{
var mat = _cacheMaterials[i];
mat.SetFloat(FadeAlpha, remainProgress);
}
if (passTime >= _totalTime)
{
isFinished = true;
nextState = EVehicleState.WaitRemove;
}
}
protected override void _OnExit(NBaseState exitState,
object param)
{
base._OnExit(exitState, param);
// 隐藏角色
owner.Node.GameObject.SetActive(false);
// 还原材质
for (var i = 0; i < _cacheRenderers.Count; ++i)
{
var renderer = _cacheRenderers[i];
renderer.sharedMaterial = _oldMaterials[i];
}
// 还原隐藏的物体
foreach (var hideObj in _cacheHideObjs)
{
hideObj.SetActive(true);
}
}
}
}