public override void ForceFlight(cmd_effect_Flight param) { if (bNotMove) { return; } if (bIsForceMoving && m_bForceFlighting == false) { Trace.Log("在进行其他强制移动,不浮空"); return; } if (param.nFlight == 0) { //此参数为0时,停止浮空,开始下落 uint tick = GameLogicAPI.getTickCount(); if (m_bForceFlighting && m_uResidenceStopTick > tick) { m_uResidenceStopTick = tick; } return; } if (m_bForceFlighting == true) { //已经在浮空状态,第二次浮空 if ((m_fFlightVel > 0 && param.fHeight <= m_fFlightHeight) || //在上升状态,最终升空高度比fHeight要求的高 (transform.position.y - m_flightEndPosition.y > param.fHeight)) //在下降状态,但已经比fHeight要求的高 { //不会比目前状态升的更高,不需要重新上升,所以忽略 return; } else { upAcc = param.nGoUpAcceleration; downAcc = param.nDropAcceleration; float acc = currentGravity + upAcc; float newHeight = param.fHeight - (transform.position.y - m_flightEndPosition.y); m_fFlightV0 = Mathf.Sqrt(2.0f * newHeight * acc); m_fFlightVel = m_fFlightV0; m_uResidenceStopTick = 0; m_uResidenceTick = (uint)param.nResidenceTime; m_fFlightHeight = param.fHeight; m_flightStartPosition = transform.position; //m_flightEndPosition不变 m_fFlightTime = 0.0f; } } else { upAcc = param.nGoUpAcceleration; downAcc = param.nDropAcceleration; float acc = currentGravity + upAcc; m_fFlightV0 = Mathf.Sqrt(2.0f * param.fHeight * acc); m_bForceFlighting = true; m_fFlightVel = m_fFlightV0; m_uResidenceStopTick = 0; m_uResidenceTick = (uint)param.nResidenceTime; m_fFlightHeight = param.fHeight; m_flightStartPosition = transform.position; m_flightEndPosition = transform.position; m_fFlightTime = 0.0f; } m_nForceMoveStartTick = GameLogicAPI.getTickCount(); m_nForceMoveEndTick = 0; m_ForceMovePos = transform.position; m_fForceMoveSpeed = Vector3.zero; m_fForceStartPos = transform.position; }
public void ForceFlight(cmd_effect_Flight param) { if (m_pFSM.bNotMove) { return; } if (m_pFSM.showLog) { Trace.Log(GameLogicAPI.getTickCount().ToString() + "ForceFlight" + param.nFlight + ". height" + param.fHeight + " upAcc" + param.nGoUpAcceleration.ToString() + " downAcc" + param.nDropAcceleration.ToString()); } if (bForceMoving && bForceFlighting == false) { Trace.Log("在进行其他强制移动,不浮空"); return; } if (param.nFlight == 0) { //此参数为0时,停止浮空,开始下落 uint tick = GameLogicAPI.getTickCount(); if (bForceFlighting) { if (m_fFlightVel > 0.0f) { m_fFlightVel = 0.0f; } if (m_uResidenceStopTick > tick) { m_uResidenceStopTick = tick; } } return; } if (bForceFlighting == true) { //已经在浮空状态,第二次浮空 if ((m_fFlightVel > 0 && param.fHeight <= m_fFlightHeight) || //在上升状态,最终升空高度比fHeight要求的高 (m_pFSM.transform.position.y - m_flightEndPosition.y > param.fHeight)) //在下降状态,但已经比fHeight要求的高 { //不会比目前状态升的更高,不需要重新上升,所以忽略 return; } else { upAcc = param.nGoUpAcceleration; downAcc = param.nDropAcceleration; float acc = m_pFSM.currentGravity + upAcc; float newHeight = param.fHeight - (m_pFSM.transform.position.y - m_flightEndPosition.y); m_fFlightV0 = Mathf.Sqrt(2.0f * newHeight * acc); m_fFlightVel = m_fFlightV0; m_uResidenceStopTick = 0; m_uResidenceTick = (uint)param.nResidenceTime; m_fFlightHeight = param.fHeight; m_flightStartPosition = m_pFSM.transform.position; //m_flightEndPosition不变 m_fFlightTime = 0.0f; isGounded = true; } } else { upAcc = param.nGoUpAcceleration; downAcc = param.nDropAcceleration; float acc = m_pFSM.currentGravity + upAcc; m_fFlightV0 = Mathf.Sqrt(2.0f * param.fHeight * acc); bForceFlighting = true; m_fFlightVel = m_fFlightV0; m_uResidenceStopTick = 0; m_uResidenceTick = (uint)param.nResidenceTime; m_fFlightHeight = param.fHeight; m_flightStartPosition = m_pFSM.transform.position; m_flightEndPosition = m_pFSM.transform.position; m_fFlightTime = 0.0f; isGounded = true; } m_nForceMoveStartTick = GameLogicAPI.getTickCount(); m_nForceMoveEndTick = 0; m_ForceMovePos = m_pFSM.transform.position; m_fForceMoveSpeed = Vector3.zero; m_fForceStartPos = m_pFSM.transform.position; //冲锋完成后向逻辑层回报一次同步,请根据需求取舍 //syncVelocity = Vector3.zero; //syncDetalTime = 0; //syncPosition = m_flightStartPosition + new Vector3(0, m_fFlightHeight, 0); //m_CurStateHandler.Send_Sync_Position(); }