Example #1
0
    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;
        }
    }
Example #2
0
    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;
        }
    }