using System; using Cielonos.MainGame.Characters; using Sirenix.OdinInspector; using SLSUtilities.FunctionalAnimation; using UnityEngine; namespace Cielonos.MainGame.FunctionalAnimation { [Serializable] public class SetRootAdsorptionAdjustment : FuncAnimPayloadBase { [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生效 } } }