Files
Cielonos/Assets/Scripts/MainGame/Characters/Base/Submodules/AdditionalForceSubmodule.cs
SoulliesOfficial f26f9fd374 爆更
2026-03-20 12:07:44 -04:00

54 lines
2.2 KiB
C#

using SLSUtilities.General;
using UnityEngine;
namespace Cielonos.MainGame.Characters
{
public class AdditionalForceSubmodule : SubmoduleBase<MovementSubcontrollerBase>
{
private CharacterBase character => owner.owner;
public LerpVector3 additionalForceXZ;
public LerpFloat additionalForceY;
public AdditionalForceSubmodule(MovementSubcontrollerBase movementSc) : base(movementSc)
{
additionalForceXZ = new LerpVector3(Vector3.zero, 1f);
additionalForceY = new LerpFloat(0f, 1f);
}
public void AddForce(Vector3 force, bool ignoreResistance = false)
{
float multiplier = 1f;
// 如果是“击退”类攻击(不忽略抗性)
if (!ignoreResistance)
{
float resistance = character.attributeSm["ImpactResistance"];
multiplier = Mathf.Clamp01(1f - (resistance / 100f));
}
additionalForceXZ.currentValue += force.Flatten() * multiplier;
additionalForceY.currentValue += force.y * multiplier;
}
public void Update(float stability)
{
// 这里的 LerpVector3 应该是自定义的类。
// 建议确保衰减速度受 stability 影响,阻力大的怪不仅飞不远,停下的也快。
float decaySpeed = stability;
float xzMagnitude = additionalForceXZ.currentValue.magnitude;
xzMagnitude -= decaySpeed * character.selfTimeSm.DeltaTime;
xzMagnitude = Mathf.Max(xzMagnitude, 0);
additionalForceXZ.currentValue = additionalForceXZ.currentValue.normalized * xzMagnitude;
/*additionalForceXZ.Update(decaySpeed * character.selfTimeSm.DeltaTime);*/
if(additionalForceXZ.currentValue.magnitude < 0.01f)
{
additionalForceXZ.currentValue = Vector3.zero;
}
additionalForceY.Update(decaySpeed * character.selfTimeSm.DeltaTime);
if(additionalForceY.currentValue < 0.01f)
{
additionalForceY.currentValue = 0;
}
}
}
}