111 lines
3.9 KiB
C#
111 lines
3.9 KiB
C#
using Cielonos.MainGame.Characters;
|
|
using SLSUtilities.General;
|
|
using UnityEngine;
|
|
|
|
namespace Cielonos.MainGame
|
|
{
|
|
public class ForceSubmodule : AttackAreaSubmoduleBase
|
|
{
|
|
public bool isCustomForce => !isRepulsion && !isSuction;
|
|
public Vector3 customForce;
|
|
|
|
public bool isRepulsion, isSuction;
|
|
public float strengthXZ;
|
|
public float strengthY;
|
|
public Vector3 finalForce;
|
|
|
|
public bool isDynamicForce;
|
|
public float dynamicStrength;
|
|
|
|
public bool isLaunch; // 是否为无视抗性的击飞
|
|
public float stasisDuration; // 击中后的滞空时长(仅击飞有效)
|
|
|
|
/// <summary>
|
|
/// 施加自定义力
|
|
/// </summary>
|
|
public ForceSubmodule(AttackAreaBase attackArea, float dynamicStrength) : base(attackArea)
|
|
{
|
|
this.isDynamicForce = true;
|
|
this.isRepulsion = false;
|
|
this.isSuction = false;
|
|
this.dynamicStrength = dynamicStrength;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 施加自定义力
|
|
/// </summary>
|
|
public ForceSubmodule(AttackAreaBase attackArea, Vector3 customForce) : base(attackArea)
|
|
{
|
|
this.isDynamicForce = false;
|
|
this.customForce = customForce;
|
|
this.isRepulsion = false;
|
|
this.isSuction = false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 施加斥力或吸力
|
|
/// </summary>
|
|
public ForceSubmodule(AttackAreaBase attackArea, float strengthXZ, bool isRepulsion, float strengthY = 0) : base(attackArea)
|
|
{
|
|
this.isDynamicForce = false;
|
|
this.strengthXZ = strengthXZ;
|
|
this.isRepulsion = isRepulsion;
|
|
this.isSuction = !isRepulsion;
|
|
this.strengthY = strengthY;
|
|
}
|
|
|
|
public ForceSubmodule(AttackAreaBase attackArea, float strengthXZ, bool isRepulsion, bool isLaunch,
|
|
float strengthY = 0, float stasisDuration = 0f) : base(attackArea)
|
|
{
|
|
this.isDynamicForce = false;
|
|
this.strengthXZ = strengthXZ;
|
|
this.isRepulsion = isRepulsion;
|
|
this.isSuction = !isRepulsion;
|
|
this.strengthY = strengthY;
|
|
this.isLaunch = isLaunch;
|
|
this.stasisDuration = stasisDuration;
|
|
}
|
|
|
|
public Vector3 GetFinalForce(CharacterBase target)
|
|
{
|
|
if (isRepulsion)
|
|
{
|
|
Vector3 repulsionDirection = (target.centerPoint.position - attackArea.topParent.position).Flatten().normalized;
|
|
finalForce = repulsionDirection * strengthXZ + Vector3.up * strengthY;
|
|
}
|
|
else if (isSuction)
|
|
{
|
|
Vector3 suctionDirection = (attackArea.topParent.position - target.centerPoint.position).Flatten().normalized;
|
|
finalForce = suctionDirection * strengthXZ + Vector3.up * strengthY;
|
|
}
|
|
else if(isDynamicForce)
|
|
{
|
|
Vector3 projectileDirection = attackArea.topParent.forward;
|
|
finalForce = projectileDirection * dynamicStrength;
|
|
}
|
|
else
|
|
{
|
|
finalForce = customForce;
|
|
}
|
|
|
|
return finalForce;
|
|
}
|
|
|
|
|
|
public void ApplyForce(CharacterBase target)
|
|
{
|
|
Vector3 force = GetFinalForce(target);
|
|
|
|
if (target.movementSc is AutomataLandMovementSubcontroller automataSc)
|
|
{
|
|
automataSc.ApplyHitImpact(force, isLaunch, isLaunch ? stasisDuration : 0f);
|
|
}
|
|
else
|
|
{
|
|
// 玩家或其他非自动单元处理
|
|
target.movementSc.additionalForceSm.AddForce(force, isLaunch);
|
|
if(force.y > 0) target.movementSc.gravitationalMovement = Vector3.zero;
|
|
}
|
|
}
|
|
}
|
|
} |