using System; using Cielonos.MainGame.Characters; using Sirenix.OdinInspector; using SLSUtilities.FunctionalAnimation; using UnityEngine; namespace Cielonos.MainGame.FunctionalAnimation { public class SetRootAdsorptionAdjustment { [Serializable] public class Once : FuncAnimPayloadBase { [InfoBox("这个payload只能在运行时由代码调用,不能直接放在动画事件里使用")] private CharacterBase target; private float enableMinDistance; public Once(CharacterBase target, float enableMinDistance) { this.eventName = "SetRootAdsorptionAdjustment_Once"; this.target = target; this.enableMinDistance = enableMinDistance; } public override bool Invoke() { return Adsorption(target, character, enableMinDistance); } } [Serializable] public class Keep : FuncAnimPayloadBase { [InfoBox("这个payload只能在运行时由代码调用,不能直接放在动画事件里使用")] private CharacterBase target; private float enableMinDistance; public Keep(CharacterBase target, float enableMinDistance) { this.eventName = "SetRootAdsorptionAdjustment_Keep"; this.target = target; this.enableMinDistance = enableMinDistance; } public override void Invoke() { Adsorption(target, character, enableMinDistance); } } private static bool Adsorption(CharacterBase target, CharacterBase character, float enableMinDistance) { if (target == null || character == null) { return false; } Vector3 centerPointPosition = character.centerPoint.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.centerPoint.position - centerPointPosition).normalized; adsorptionVector = (target.centerPoint.position - adsorptionDirection * targetRadius) - centerPointPosition; adsorptionVector *= (adsorptionVector.magnitude - (enableMinDistance * 0.5f)) / adsorptionVector.magnitude; } adsorptionVector.y = 0; if (adsorptionVector.magnitude <= enableMinDistance) { character.animationSc.isDisablingMoveXZ = true; return true; //已经在攻击范围内 } character.animationSc.isDisablingMoveXZ = false; return false; //在攻击范围之外,RootMotion生效 } } }