64 lines
2.4 KiB
C#
64 lines
2.4 KiB
C#
using System;
|
||
using Cielonos.MainGame.Characters;
|
||
using Sirenix.OdinInspector;
|
||
using SLSUtilities.FunctionalAnimation;
|
||
using UnityEngine;
|
||
|
||
namespace Cielonos.MainGame.FunctionalAnimation
|
||
{
|
||
[Serializable]
|
||
public class SetRootAdsorptionAdjustment : FuncAnimPayloadBase<bool>
|
||
{
|
||
[InfoBox("这个payload只能在运行时由代码调用,不能直接放在动画事件里使用")]
|
||
private CharacterBase executor => runtimeFuncAnim.executor;
|
||
private CharacterBase target;
|
||
private float enableMinDistance;
|
||
|
||
public SetRootAdsorptionAdjustment(CharacterBase target, float enableMinDistance)
|
||
{
|
||
this.eventName = "SetRootAdsorptionAdjustment";
|
||
this.target = target;
|
||
this.enableMinDistance = enableMinDistance;
|
||
}
|
||
|
||
public override bool Invoke()
|
||
{
|
||
return Adsorption();
|
||
}
|
||
|
||
bool Adsorption()
|
||
{
|
||
if (target == null || executor == null)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
Vector3 centerPointPosition = executor.flexibleCenterPoint.position;
|
||
Vector3 adsorptionVector;
|
||
|
||
/*if (target.collisionController.mainCollider.enabled)
|
||
{
|
||
adsorptionVector = target.collisionController.mainCollider.ClosestPoint(centerPointPosition) - centerPointPosition;
|
||
}
|
||
else*/
|
||
{
|
||
float targetRadius = target.collisionSc.useCharacterController
|
||
? target.collisionSc.characterController.radius
|
||
: target.collisionSc.mainColliderRadius;
|
||
Vector3 adsorptionDirection = (target.flexibleCenterPoint.position - centerPointPosition).normalized;
|
||
adsorptionVector = (target.flexibleCenterPoint.position - adsorptionDirection * targetRadius) - centerPointPosition;
|
||
adsorptionVector *= (adsorptionVector.magnitude - (enableMinDistance * 0.5f)) / adsorptionVector.magnitude;
|
||
}
|
||
|
||
adsorptionVector.y = 0;
|
||
|
||
if (adsorptionVector.magnitude <= enableMinDistance)
|
||
{
|
||
executor.animationSc.isDisablingMoveXZ = true;
|
||
return true; //已经在攻击范围内
|
||
}
|
||
|
||
return false; //在攻击范围之外,RootMotion生效
|
||
}
|
||
}
|
||
} |