using SLSUtilities.General; using UnityEngine; namespace Cielonos.MainGame.Characters { public class AdditionalForceSubmodule : SubmoduleBase { 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; } } } }