抛竿动画

This commit is contained in:
2026-03-22 11:12:59 +08:00
parent ba5da38dde
commit c70eb8ca86
10 changed files with 54471 additions and 39144 deletions

View File

@@ -9,12 +9,7 @@ namespace NBF
public float ChargedProgress;
[Header("抛竿参数")]
[SerializeField] private float throwUpAngle = 25f; // 向上抛出的角度(度)
[SerializeField] private float throwDuration = 1.5f; // 抛竿飞行时间
[SerializeField] private float minThrowPower = 15f;
[SerializeField] private float maxThrowPower = 60f;
private LureThrowTrajectory _trajectoryController;
[SerializeField] private float throwUpAngle = 0.7f; // 向上抛出的角度系数,越大抛得越高
protected override void OnEnter()
{
@@ -29,17 +24,9 @@ namespace NBF
Debug.Log($"PlayerThrow ChargedProgress={ChargedProgress}");
_nextState = false;
// Stage = Phase.Waiting;
// 初始化轨迹控制器
_trajectoryController?.Dispose();
_trajectoryController = new LureThrowTrajectory();
_trajectoryController.SetPowerRange(minThrowPower, maxThrowPower);
}
protected override void OnExit()
{
// 清理轨迹控制器
_trajectoryController?.Kill();
// _owner.Gears.Reel?.Unlock();
}
protected override void OnUpdate()
@@ -47,6 +34,7 @@ namespace NBF
CheckStateTimeout(10);
if (_nextState)
{
// return (uint)PlayerState.Fishing;
_nextState = false;
Player.ChangeState(PlayerState.Fishing);
}
@@ -64,76 +52,25 @@ namespace NBF
UnTakeLine();
PlayerView.Unity.ModelAsset.PlayerAnimator.PrepareThrow = false;
PlayerView.Unity.ModelAsset.PlayerAnimator.StartThrow = false;
var rod = GetRod();
if (rod != null && rod.Line != null && rod.Line.Lure != null)
{
var lureTransform = rod.Line.Lure.transform;
var lureRigidbody = rod.Line.Lure.RBody;
// 使用 ChargedProgress 作为力度系数 (0-1)
float throwForce = 20f + ChargedProgress * 100f;
// 计算抛竿起点(竿尖位置)
Vector3 startPos = rod.Asset.lineConnector.position;
// 水平向前 + 向上抛出,形成抛物线轨迹
Vector3 throwDirection = PlayerView.Unity.FppLook.transform.forward;// + Vector3.up * throwUpAngle;
// 计算抛竿方向(基于角色朝向 + 向上角度)
float radians = throwUpAngle * Mathf.Deg2Rad;
Vector3 forward = PlayerView.Unity.transform.forward;
Vector3 throwDirection = forward * Mathf.Cos(radians) + Vector3.up * Mathf.Sin(radians);
// 构建抛竿输入参数
var throwInput = new ThrowInput
{
power = ChargedProgress,
lureWeight = 10f, // TODO: 从钓饵配置获取
lineDiameter = 0.2f, // TODO: 从线配置获取
windDirection = Vector3.zero,
windStrength = 0f
};
// 计算轨迹
var trajectory = _trajectoryController.CalculateTrajectory(throwInput, startPos, throwDirection);
// 简化轨迹(优化性能)
trajectory = _trajectoryController.SimplifyTrajectory(trajectory, 0.15f);
// 计算飞行时间(基于轨迹长度)
float duration = _trajectoryController.CalculateDuration(trajectory, 0.8f + ChargedProgress * 0.5f);
// 先将Lure瞬移到起点
lureTransform.position = startPos;
// 执行轨迹动画
_trajectoryController.ExecuteThrow(
lureTransform,
lureRigidbody,
trajectory,
duration,
() =>
{
// 动画完成,切换状态
_nextState = true;
}
);
Debug.Log($"抛竿轨迹: 点位数={trajectory.Count}, 飞行时间={duration:F2}s, 落点={trajectory[^1]}");
rod.Line.Lure.RBody.AddForce(throwDirection.normalized * throwForce, ForceMode.VelocityChange);
}
}
public void OnRodThrownEnd()
{
Debug.LogError("OnRodThrownEnd");
// 状态切换现在由轨迹动画完成回调处理
_nextState = true;
}
#endregion
}
// 扩展 LureThrowTrajectory 添加 SetPowerRange 方法
public partial class LureThrowTrajectory
{
public void SetPowerRange(float min, float max)
{
_minThrowPower = min;
_maxThrowPower = max;
}
}
}