using Cielonos.MainGame.Characters; using UnityEngine; using SLSUtilities.General; namespace Cielonos.MainGame { public partial class AttackAreaBase { public class TractionSubmodule : AttackAreaSubmoduleBase { public float pullSpeed; public float deadZone; public TractionSubmodule(AttackAreaBase owner, float pullSpeed, float deadZone) : base(owner) { this.pullSpeed = pullSpeed; this.deadZone = deadZone; } public void ApplyTraction(CharacterBase target) { float deltaTime = attackArea.DeltaTime; if (deltaTime == 0) return; Vector3 center = attackArea.topParent.position; Vector3 targetPos = target.CenterPoint.position; Vector3 direction = (center - targetPos).Flatten(); float distance = direction.magnitude; if (distance > 0.01f) { float force = pullSpeed; // 死区阻尼,防止经过中心时鬼畜 if (distance < deadZone) { force = Mathf.Lerp(0, pullSpeed, distance / deadZone); } // 考虑角色的抗打断(ImpactResistance) float resistance = target.attributeSm[CharacterAttribute.ImpactResistance]; float multiplier = Mathf.Clamp01(1f - (resistance / 100f)); force *= multiplier * multiplier; // 二次方,抗性越高,拉力衰减越快 Vector3 velocity = direction.normalized * force * deltaTime; target.movementSc.externalForceVelocity += velocity; } } } } }