2025-12-23 19:47:06 -05:00
|
|
|
|
using System;
|
2025-11-25 08:19:33 -05:00
|
|
|
|
using Cielonos.MainGame.Characters;
|
|
|
|
|
|
using Sirenix.OdinInspector;
|
|
|
|
|
|
using SLSUtilities.FunctionalAnimation;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Cielonos.MainGame.FunctionalAnimation
|
|
|
|
|
|
{
|
2026-02-13 09:22:11 -05:00
|
|
|
|
public class SetRootAdsorptionAdjustment
|
2025-11-25 08:19:33 -05:00
|
|
|
|
{
|
2026-02-13 09:22:11 -05:00
|
|
|
|
[Serializable]
|
|
|
|
|
|
public class Once : FuncAnimPayloadBase<bool>
|
2025-11-25 08:19:33 -05:00
|
|
|
|
{
|
2026-02-13 09:22:11 -05:00
|
|
|
|
[InfoBox("这个payload只能在运行时由代码调用,不能直接放在动画事件里使用")]
|
|
|
|
|
|
private CharacterBase target;
|
|
|
|
|
|
private float enableMinDistance;
|
|
|
|
|
|
|
|
|
|
|
|
public Once(CharacterBase target, float enableMinDistance)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.eventName = "SetRootAdsorptionAdjustment_Once";
|
|
|
|
|
|
this.target = target;
|
|
|
|
|
|
this.enableMinDistance = enableMinDistance;
|
|
|
|
|
|
}
|
2025-11-25 08:19:33 -05:00
|
|
|
|
|
2026-02-13 09:22:11 -05:00
|
|
|
|
public override bool Invoke()
|
|
|
|
|
|
{
|
|
|
|
|
|
return Adsorption(target, character, enableMinDistance);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[Serializable]
|
|
|
|
|
|
public class Keep : FuncAnimPayloadBase
|
2025-11-25 08:19:33 -05:00
|
|
|
|
{
|
2026-02-13 09:22:11 -05:00
|
|
|
|
[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);
|
|
|
|
|
|
}
|
2025-11-25 08:19:33 -05:00
|
|
|
|
}
|
2026-02-13 09:22:11 -05:00
|
|
|
|
|
|
|
|
|
|
private static bool Adsorption(CharacterBase target, CharacterBase character, float enableMinDistance)
|
2025-11-25 08:19:33 -05:00
|
|
|
|
{
|
2026-01-17 11:35:49 -05:00
|
|
|
|
if (target == null || character == null)
|
2025-12-08 05:27:53 -05:00
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2026-02-13 09:22:11 -05:00
|
|
|
|
|
|
|
|
|
|
Vector3 centerPointPosition = character.centerPoint.position;
|
2025-11-25 08:19:33 -05:00
|
|
|
|
Vector3 adsorptionVector;
|
2026-02-13 09:22:11 -05:00
|
|
|
|
|
2025-11-25 08:19:33 -05:00
|
|
|
|
/*if (target.collisionController.mainCollider.enabled)
|
|
|
|
|
|
{
|
|
|
|
|
|
adsorptionVector = target.collisionController.mainCollider.ClosestPoint(centerPointPosition) - centerPointPosition;
|
|
|
|
|
|
}
|
|
|
|
|
|
else*/
|
|
|
|
|
|
{
|
2025-12-08 05:27:53 -05:00
|
|
|
|
float targetRadius = target.collisionSc.useCharacterController
|
|
|
|
|
|
? target.collisionSc.characterController.radius
|
|
|
|
|
|
: target.collisionSc.mainColliderRadius;
|
2026-02-13 09:22:11 -05:00
|
|
|
|
Vector3 adsorptionDirection = (target.centerPoint.position - centerPointPosition).normalized;
|
|
|
|
|
|
adsorptionVector = (target.centerPoint.position - adsorptionDirection * targetRadius) - centerPointPosition;
|
2025-11-25 08:19:33 -05:00
|
|
|
|
adsorptionVector *= (adsorptionVector.magnitude - (enableMinDistance * 0.5f)) / adsorptionVector.magnitude;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
adsorptionVector.y = 0;
|
2026-03-20 12:07:44 -04:00
|
|
|
|
|
2025-11-25 08:19:33 -05:00
|
|
|
|
if (adsorptionVector.magnitude <= enableMinDistance)
|
|
|
|
|
|
{
|
2026-01-17 11:35:49 -05:00
|
|
|
|
character.animationSc.isDisablingMoveXZ = true;
|
2025-11-25 08:19:33 -05:00
|
|
|
|
return true; //已经在攻击范围内
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-13 09:22:11 -05:00
|
|
|
|
character.animationSc.isDisablingMoveXZ = false;
|
2025-11-25 08:19:33 -05:00
|
|
|
|
return false; //在攻击范围之外,RootMotion生效
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|