141 lines
5.7 KiB
C#
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);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|