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 _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 _cacheRenderers; private List _oldMaterials; private List _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(); _cacheMaterials = new List(); _cacheRenderers = new List(); _oldMaterials = new List(); _cacheHideObjs = new List(); 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(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); } } } }