54 lines
2.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
} |