Files
Cielonos/Assets/Scripts/MainGame/AttackArea/Submodules/TractionSubmodule.cs

52 lines
1.8 KiB
C#
Raw Normal View History

2026-07-18 03:16:20 -04:00
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;
}
}
}
}
}