public override void ForceMove(cmd_force_move param) { Vector3 targetPos = new Vector3(param.fPosition_x, param.fPosition_y, param.fPosition_z); int moveTick = (int)param.fTime;//(int)(param.fTime * 1000); float fHeight = param.fHeight; if (bNotMove || moveTick <= 0) { return; } bIsForceMoving = true; m_nForceMoveStartTick = GameLogicAPI.getTickCount(); m_nForceMoveEndTick = m_nForceMoveStartTick + (uint)moveTick; m_ForceMovePos = targetPos; Vector3 moveDis = targetPos - transform.position; moveDis.y = 0;//-- m_fForceMoveSpeed = moveDis / ((float)moveTick / 1000.0f); m_fForceStartPos = transform.position; if (fHeight > 0.01f && moveTick > 0) { float Ag = 0; //重力加速度 float TotalTime = ((float)moveTick / 1000.0f); //抵达所需总时间 float RiseTime = 0; //上升使用时间 float RiseHeight = 0; //上升距离 if (targetPos.y > transform.position.y + fHeight) { //目标落点高于升高高度 RiseHeight = 0; } else { RiseHeight = fHeight; } float DropHeight = 0; //(下落距离) if (RiseHeight != 0) //向上抛并有下落过程 { DropHeight = transform.position.y + fHeight - targetPos.y; RiseTime = TotalTime - TotalTime / (Mathf.Sqrt(RiseHeight / DropHeight) + 1); Ag = 2.0f * RiseHeight / (RiseTime * RiseTime); m_fFlightV0 = Ag * RiseTime; // 初始速度向上(记录抛出时的垂直初速度) } else //无下落过程 { m_fFlightV0 = (targetPos.y - transform.position.y) / TotalTime; Ag = 0; } upAcc = Ag - currentGravity; downAcc = Ag - currentGravity; m_fFlightVel = m_fFlightV0;//垂直当前速度 m_uResidenceStopTick = 0; m_uResidenceTick = 0; m_fFlightHeight = DropHeight; m_flightStartPosition = transform.position; //if (m_bForceFlighting == false) //{ // m_flightEndPosition = transform.position; //} m_flightEndPosition = targetPos; m_fFlightTime = 0.0f; m_bForceFlighting = true; } else { m_fFlightHeight = 0.0f; } }
private bool m_bIgnoreSoliderController = false; //true是表示是被动的强制位移,无视SoliderController的StopMove之类的定身 public void ForceMove(cmd_force_move param) { Vector3 targetPos = new Vector3(param.fPosition_x, param.fPosition_y, param.fPosition_z); int moveTick = (int)param.fTime; //(int)(param.fTime * 1000); float fHeight = param.fHeight; m_tForceMoveTarget = null; m_bForceLockTarget = (param.nLockTarget == 1); m_fForceEndDistance = Mathf.Abs(param.fLocationDistance); if (param.uidTarget > 0) { U3D_Render.EntityView evDst = EntityFactory.getEntityViewByID(Convert.ToInt32(param.uidTarget)); if (evDst != null && evDst.gameObject) { m_tForceMoveTarget = evDst.gameObject.transform; } } if (m_pFSM.bNotMove || moveTick <= 0) { return; } m_bIgnoreSoliderController = (param.nPassive != 0); // 被动位移标识(0主动位移,不为0被动位移) if (m_pFSM.showLog) { Trace.Log(GameLogicAPI.getTickCount() + m_pFSM.gameObject.name + m_pFSM.transform.position + "ForceMove To" + targetPos.ToString() + "Tick=" + moveTick.ToString() + " Height=" + fHeight.ToString()); } bForceMoving = true; if (param.nMoveType == MOVE_TYPE.MOVE_CHARGE && param.fHeight > 1.0f) { param.fHeight = 0.0f; fHeight = 0.0f; if (!m_bDisableController) { m_bDisableController = true; Debug.Log("m_bDisableController = true;"); if (m_pFSM.getEntityState() != EntityState.Dead) { m_pFSM.enableCollider(false); } } } else { m_bDisableController = false; } m_nForceMoveStartTick = GameLogicAPI.getTickCount(); m_fForceStartPos = m_pFSM.transform.position; if (param.nLockTarget == 1 && m_tForceMoveTarget) { targetPos = m_tForceMoveTarget.position; } if (param.nLockTarget == 1 && m_tForceMoveTarget) { m_ForceMovePos = m_tForceMoveTarget.position; Vector3 moveDis = m_ForceMovePos - m_pFSM.transform.position; m_fForceMoveSpeed = moveDis.normalized * param.fSpeed; m_nForceMoveEndTick = m_nForceMoveStartTick + (uint)param.nLockTime; } else { m_ForceMovePos = targetPos; Vector3 moveDis = m_ForceMovePos - m_pFSM.transform.position; m_fForceMoveSpeed = moveDis / ((float)moveTick / 1000.0f); if (moveTick > param.fMaxTime) //(moveTick > param.fMaxTime*1000.0f) { moveTick = (int)param.fMaxTime; //(int)(param.fMaxTime * 1000.0f); } m_nForceMoveEndTick = m_nForceMoveStartTick + (uint)moveTick; } //Debug.Log(transform.name+"force targetid=" + param.uidTarget + "target=" + m_tForceMoveTarget + "nLockTarget=" + m_bForceLockTarget + "speed=" + param.fSpeed); //Debug.Log("m_ForceMovePos=" + m_ForceMovePos + "m_fForceMvoeSpeed=" + m_fForceMoveSpeed + "lockTime=" + param.nLockTime); if (fHeight > 0.01f && moveTick > 0) { //moveDis.y = 0; float flyTime = moveTick / 1000.0f / 2.0f; float g = 2.0f * fHeight / (flyTime * flyTime); m_fFlightV0 = Mathf.Sqrt(2.0f * fHeight * g); upAcc = g - m_pFSM.currentGravity; downAcc = g - m_pFSM.currentGravity; m_fFlightVel = m_fFlightV0; m_uResidenceStopTick = 0; m_uResidenceTick = 0; m_fFlightHeight = fHeight; m_flightStartPosition = m_pFSM.transform.position; if (bForceFlighting == false) { m_flightEndPosition = m_pFSM.transform.position; } //if (showLog) //{ // Debug.Log(transform.name + " Force Move m_flightEndPosition " + m_flightEndPosition); //} m_fFlightTime = 0.0f; bForceFlighting = true; //冲锋完成后向逻辑层回报一次同步,请根据需求取舍 //syncVelocity = Vector3.zero; //syncDetalTime = 0; //syncPosition = new Vector3((m_fForceStartPos.x + m_ForceMovePos.x) / 2.0f, m_fForceStartPos.y + fHeight, (m_fForceStartPos.z + m_ForceMovePos.z) / 2.0f); //m_CurStateHandler.Send_Sync_Position(); } else { m_fFlightHeight = 0.0f; } }