Files
test/Assets/PerfectWorld/Scripts/Vfx/CGfxParabolicMove.cs
T
2026-03-02 17:14:59 +07:00

82 lines
2.7 KiB
C#

using UnityEngine;
namespace BrewMonster
{
/// <summary>
/// Parabolic trajectory movement with gravity.
/// Mirrors C++ CGfxParabolicMove exactly (A3DSkillGfxEvent2.cpp:54-92).
/// 抛物线轨迹移动(带重力),完全镜像C++ CGfxParabolicMove。
/// </summary>
public class CGfxParabolicMove : CGfxMoveBase
{
protected Vector3 m_vOrgPos;
protected Vector3 m_vHorzVel;
protected float m_fVertVel;
protected float m_fTotalTime;
protected float m_fCurTime;
protected float m_fSpeed;
private const float _fly_speed = 20.0f / 1000.0f; // units per ms, same as C++
private const float _gravity = 9.8e-6f; // gravity constant, same as C++
public CGfxParabolicMove(GfxMoveMode mode) : base(mode) { }
/// <summary>
/// Initialize parabolic trajectory from host to target.
/// 初始化从施法者到目标的抛物线轨迹。
/// </summary>
public override void StartMove(Vector3 vHost, Vector3 vTarget)
{
if (m_bArea)
{
CalcRange((vTarget - vHost).normalized);
m_vOrgPos = m_vPos = vHost + GetRandOff();
}
else
{
m_vOrgPos = m_vPos = vHost;
}
m_vHorzVel = vTarget - m_vPos;
float fVert = m_vHorzVel.y;
m_vHorzVel.y = 0;
float fDist = Normalize(ref m_vHorzVel);
float fMax = _fly_speed * m_dwMaxFlyTime;
if (fMax >= fDist)
{
m_fSpeed = _fly_speed;
}
else
{
m_fSpeed = fDist / m_dwMaxFlyTime;
}
m_fTotalTime = fDist / m_fSpeed;
m_vHorzVel *= m_fSpeed;
m_fVertVel = fVert / m_fTotalTime + 0.5f * _gravity * m_fTotalTime;
m_vMoveDir = (m_vHorzVel + m_fVertVel * Vector3.up).normalized;
m_fCurTime = 0;
}
/// <summary>
/// Tick parabolic movement. Returns true when target is reached.
/// 更新抛物线移动。当到达目标时返回true。
/// </summary>
public override bool TickMove(uint dwDeltaTime, Vector3 vHostPos, Vector3 vTargetPos)
{
m_fCurTime += dwDeltaTime;
if (m_fCurTime >= m_fTotalTime)
{
return true;
}
float fVertVel = m_fVertVel - _gravity * m_fCurTime;
float fVertDist = 0.5f * (fVertVel + m_fVertVel) * m_fCurTime;
m_vPos = m_vOrgPos + m_fCurTime * m_vHorzVel + fVertDist * Vector3.up;
m_vMoveDir = (m_vHorzVel + fVertVel * Vector3.up).normalized;
return false;
}
}
}