Пример #1
0
    // 进入状态
    public bool OnEnter(IntPtr lParam)
    {
        m_lastSyncTick = 0;
        tr             = m_pFSM.transform;
        cmd_Entity_Change_State_WallWalking param = IntPtrHelper.toData <cmd_Entity_Change_State_WallWalking>(lParam);

        m_pFSM.enableCollider(false);
        m_pFSM.transform.eulerAngles = new Vector3(m_pFSM.transform.eulerAngles.x, param.faceDirection_y, m_pFSM.transform.eulerAngles.z);

        Vector3 faceDir = m_pFSM.transform.forward;

        faceDir.Normalize();

        float posY = m_pFSM.transform.position.y;

        Vector3 wallCornerAPos = new Vector3(param.wallCornerAPos_x, posY, param.wallCornerAPos_z);
        Vector3 wallCornerBPos = new Vector3(param.wallCornerBPos_x, posY, param.wallCornerBPos_z);
        Vector3 wallCornerCPos = new Vector3(param.wallCornerCPos_x, posY, param.wallCornerCPos_z);
        Vector3 wallCornerDPos = new Vector3(param.wallCornerDPos_x, posY, param.wallCornerDPos_z);


        //Debug.Log("wall pos=" + wallCornerAPos.ToString() + wallCornerBPos.ToString() + wallCornerCPos.ToString() + wallCornerDPos.ToString());

        //区域点输出规则:
        //飞檐走壁为一个cube,所以区域点为4个顶点的矩形
        //取最短的边开始,顺时针或逆时针方向输出
        //因此,AB CD为短边,BC为长边
        Vector3 wallStartPos = (wallCornerAPos + wallCornerBPos) / 2.0f;
        Vector3 wallEndPos   = (wallCornerCPos + wallCornerDPos) / 2.0f;
        float   wallWidth    = (wallCornerBPos - wallCornerAPos).magnitude;
        float   wallLength   = (wallCornerCPos - wallCornerBPos).magnitude;

        return(startWalkPos(wallStartPos, wallEndPos, wallWidth, wallLength, param.walkHeight, faceDir));
    }
Пример #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;
        }
    }