FututeWand初步

This commit is contained in:
SoulliesOfficial
2026-07-01 06:32:50 -04:00
parent ddd387ef35
commit 347237443f
89 changed files with 290771 additions and 1084 deletions

View File

@@ -72,11 +72,120 @@ namespace Cielonos.MainGame.Characters
}
/// <summary>
/// 瞬移/闪现至目标位置(支持高速移动过程)
/// 动态追踪折跃:在移动过程中实时追踪目标位置,确保降落时完美对齐且不产生重叠
/// </summary>
/// <param name="target">折跃追踪的目标敌人</param>
/// <param name="duration">移动时间(秒)。若为 0 则为即时瞬移</param>
/// <param name="stopDistance">目标表面前的停止缓冲距离(默认为 1.0f</param>
/// <param name="onComplete">完成回调</param>
public void Teleport(CharacterBase target, float duration, float stopDistance = 1.0f, Action onComplete = null)
{
if (target == null)
{
Teleport(owner.transform.position, duration, onComplete);
return;
}
// 1. 如果是即时瞬移duration <= 0
if (duration <= 0f)
{
Vector3 instantDest = GetSafePositionNearTarget(target, stopDistance);
if (NavMesh.SamplePosition(instantDest, out NavMeshHit hit, 5.0f, NavMesh.AllAreas))
{
instantDest = hit.position;
}
PerformMove(instantDest);
SmartTurnToTarget(target, 360f, true);
onComplete?.Invoke();
return;
}
// 2. 带有追踪的动态折跃位移
Vector3 startPos = owner.transform.position;
// 赋予无敌状态
owner.statusSm.AddStatus(StatusType.Invincible, duration);
// 锁定移动和旋转输入(使用高优先级 99 隔离普通移动控制)
canMove.Modify(false, 99);
canRotate.Modify(false, 99);
// 开启残影生成(位移开始时生成单个残影)
var afterImageGen = owner.GetComponent<AfterImageGenerator>();
if (afterImageGen != null)
{
afterImageGen.CreateAfterImageSnapshot();
}
// 获取并临时关闭物理/寻路组件
var agent = owner.GetComponent<NavMeshAgent>();
bool wasAgentActive = agent != null && agent.isActiveAndEnabled;
if (wasAgentActive) agent.enabled = false;
var cc = owner.collisionSc != null ? owner.collisionSc.characterController : null;
bool wasCcActive = cc != null && cc.enabled;
if (wasCcActive) cc.enabled = false;
var rb = owner.collisionSc != null ? owner.collisionSc.mainRigidbody : null;
bool wasRbKinematic = rb != null && rb.isKinematic;
if (rb != null) rb.isKinematic = true;
// 使用本地计时器,更新过程中的插值位移并实时朝向目标
float elapsed = 0f;
owner.selfTimeSm.AddLocalTimer(duration,
onComplete: () =>
{
// 确保移动完毕并最终强制对齐
Vector3 finalDest = GetSafePositionNearTarget(target, stopDistance);
if (NavMesh.SamplePosition(finalDest, out NavMeshHit hit, 5.0f, NavMesh.AllAreas))
{
finalDest = hit.position;
}
owner.transform.position = finalDest;
// 恢复组件状态
if (rb != null) rb.isKinematic = wasRbKinematic;
if (cc != null && wasCcActive) cc.enabled = true;
if (agent != null && wasAgentActive)
{
agent.enabled = true;
agent.Warp(finalDest);
}
// 解锁移动和旋转输入
canMove.Modify(true, 99);
canRotate.Modify(true, 99);
// 最终朝向目标
SmartTurnToTarget(target, 360f, true);
// 触发完成回调
onComplete?.Invoke();
},
onUpdate: () =>
{
elapsed += DeltaTime;
float t = Mathf.Clamp01(elapsed / duration);
// 实时获取当前目标最新位置对应的安全落点,实现平滑追踪
Vector3 currentDest = GetSafePositionNearTarget(target, stopDistance);
Vector3 currentPos = Vector3.Lerp(startPos, currentDest, t);
if (rb != null) rb.position = currentPos;
owner.transform.position = currentPos;
// 移动中保持看向目标
SmartTurnToTarget(target, 360f, true);
}
);
}
/// <summary>
/// 静态坐标折跃:瞬移/闪现至目标位置(支持高速移动过程,无追踪)
/// </summary>
/// <param name="destination">目标位置</param>
/// <param name="duration">移动时间(秒)。若为 0 则为即时瞬移</param>
/// <param name="onComplete">瞬移完成后(或即时瞬移时)的回调函数,可用于生成 VFX/音效</param>
/// <param name="onComplete">瞬移完成后(或即时瞬移时)的回调函数</param>
public void Teleport(Vector3 destination, float duration, Action onComplete = null)
{
// 1. 进行 NavMesh 采样验证(寻找最近的可行进点)