Files
JJBB/Assets/Project/Script/Player/Impact/Impact_MatProByHealth.cs
2024-08-23 15:49:34 +08:00

71 lines
2.7 KiB
C#
Raw Permalink 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 Games.LogicObj;
using GCGame.Table;
using Module.Log;
using UnityEngine;
/// <summary>
/// 模型材质属性随生命值修改
/// Effect.txt 表格扩展参数说明
/// Param1 EffectParam.txt中id值 身体材质属性相关配置
/// Param2 EffectParam.txt中id值 右武器材质属性相关配置
/// Param3 EffectParam.txt中id值 左武器材质属性相关配置
/// Param4 EffectParam.txt中id值 动画曲线id
///
/// EffectParams 参考ChangeMatPro
/// </summary>
public class Impact_MatProByHealth : ImpactEffectBase
{
private ChangeMatPro _materialPropertyMod;
private AnimationCurve _animationCurve;
private Obj_Character _character;
private float? _lastRatio;
public override EffectLogic.EffectType ImpactEffectType
{
get { return EffectLogic.EffectType.TYPE_MATPROBYHEALTH; }
}
// Hack重用ChangeMatPro类型。直接添加SetRatio的接口不走Update流程来控制当前实际效果
public override void StartEffect()
{
base.StartEffect();
if (objCharacter != null && Data != null)
{
var character = objCharacter as Obj_Character;
if (character == null)
LogModule.ErrorLog(string.Format("试图为非角色Obj {0}添加{1}类型的Impact", objCharacter.name, ImpactEffectType));
else
{
_character = character;
var paramid = Data.GetParamValuebyIndex(bodyPart);
var param = TableManager.GetEffectParamByID(paramid, 0);
if (param != null && _materialPropertyMod == null)
{
var animationId = Data.GetParamValuebyIndex(3);
_animationCurve = CommonUtility.GetAnimationCurveById(animationId);
_materialPropertyMod = new ChangeMatPro(objCharacter, BodyToModelPart(bodyPart), param);
_materialPropertyMod.Start(param, float.PositiveInfinity);
}
}
}
}
public override void StopEffect()
{
base.StopEffect();
if (_materialPropertyMod != null)
_materialPropertyMod.StopEffect();
}
protected override void UpdateInherited()
{
if (_character != null && _character.BaseAttr != null && _materialPropertyMod != null)
{
var ratio = (float)_character.BaseAttr.HP / _character.BaseAttr.MaxHP;
ratio = Mathf.Clamp01(ratio);
ratio = _animationCurve.Evaluate(ratio);
if (ratio != _lastRatio)
{
_lastRatio = ratio;
_materialPropertyMod.SetRatio(ratio);
}
}
}
}