Files
Cielonos/Assets/Scripts/MainGame/Characters/Base/Submodules/AdditionalForceSubmodule.cs

54 lines
2.2 KiB
C#
Raw Normal View History

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