Пример #1
0
    private int m_nDeadInterval = 0; //进入状态时已经死亡的时间,用于死亡动作的播放时间偏移

    public void ClearState()
    {
        if (m_pFSM && m_pFSM.getEntityState() == EntityState.Dead)
        {
            OnLeave();
        }
    }
Пример #2
0
    private bool m_autoMoveNavModeFollow = false;        //自动寻路启用了转镜头跟随
    public void AutoMoveTo(Vector3 targetPos, bool isFloating, bool rotateCamera = true)
    {
        //已经在控制走路的就不寻路了
        if (m_pFSM.inputMoveDirection.sqrMagnitude > 0.001f)
        {
            return;
        }

        if (m_pFSM.getEntityState() == EntityState.Dead)
        {
            return;
        }

        //强制位移时不自动寻路
        if (m_pFSM.animatorCtrl.bDoingAttackMove || bForceMoving || bForceFlighting)
        {
            return;
        }

        //根据目标点寻路,获得寻路结果
        cmd_map_findpath pathData  = new cmd_map_findpath();
        cmd_map_findpath pathData2 = new cmd_map_findpath();

        pathData2.pathcnt = 0;
        float[] startPoint = new float[3];
        Vector3 startPos   = m_pFSM.transform.position;

        if (isFloating)
        {
            startPos = ProjectToFloor(startPos);
        }
        startPoint[0]  = startPos.x;
        startPoint[1]  = startPos.y;
        startPoint[2]  = startPos.z;
        pathData.start = startPoint;

        float[] endPoint = new float[3];
        endPoint[0]  = targetPos.x;
        endPoint[1]  = targetPos.y;
        endPoint[2]  = targetPos.z;
        pathData.end = endPoint;

        IntPtrHelper helper = new IntPtrHelper();
        IntPtr       ptr    = helper.toPtr <cmd_map_findpath>(ref pathData);

        if (!GameLogicAPI.findPath(ptr))
        {
            return;
        }

        if (m_pFSM.showLog)
        {
            Trace.Log("AutoMove From" + m_pFSM.transform.position.ToString() + " To " + targetPos.ToString());
        }

        pathData = IntPtrHelper.toData <cmd_map_findpath>(ptr);
        if (pathData.pathcnt > 0)
        {
            if (pathData.path.Length < (pathData.pathcnt - 1) * 3 ||
                pathData.path.Length < (pathData.pathcnt - 1) * 3 + 1 ||
                pathData.path.Length < (pathData.pathcnt - 1) * 3 + 2)
            {
                Debug.LogError("寻路长度不合法");
                return;
            }

            Vector3 lastPoint = new Vector3(pathData.path[(pathData.pathcnt - 1) * 3], pathData.path[(pathData.pathcnt - 1) * 3 + 1], pathData.path[(pathData.pathcnt - 1) * 3 + 2]);

            int pointLen = pathData.pathcnt;
            if (isFloating)
            {
                pointLen++;
            }
            //如果到不到终点,强行寻路多一遍。。。
            else if ((targetPos - lastPoint).sqrMagnitude > 0.1f)
            {
                startPos        = ProjectToFloor(lastPoint + (targetPos - lastPoint).normalized * 2.0f);
                startPoint[0]   = startPos.x;
                startPoint[1]   = startPos.y;
                startPoint[2]   = startPos.z;
                pathData2.start = startPoint;
                pathData2.end   = endPoint;

                IntPtrHelper helper2 = new IntPtrHelper();
                IntPtr       ptr2    = helper.toPtr <cmd_map_findpath>(ref pathData2);
                if (GameLogicAPI.findPath(ptr2))
                {
                    pathData2 = IntPtrHelper.toData <cmd_map_findpath>(ptr);

                    if (pathData2.path.Length < (pathData2.pathcnt - 1) * 3 ||
                        pathData2.path.Length < (pathData2.pathcnt - 1) * 3 + 1 ||
                        pathData2.path.Length < (pathData2.pathcnt - 1) * 3 + 2)
                    {
                        Debug.LogError("寻路长度不合法");
                        return;
                    }

                    pointLen += pathData2.pathcnt;
                }
            }
            autoMovePathPoint = new Vector3[pointLen];
            for (int i = 0; i < pathData.pathcnt; i++)
            {
                autoMovePathPoint[i] = new Vector3(pathData.path[i * 3], pathData.path[i * 3 + 1], pathData.path[i * 3 + 2]);
                if (m_pFSM.showLog)
                {
                    Trace.Log("Path Point" + autoMovePathPoint[i].ToString());
                }
            }
            for (int i = 0; i < pathData2.pathcnt; i++)
            {
                autoMovePathPoint[i + pathData.pathcnt] = new Vector3(pathData2.path[i * 3], pathData2.path[i * 3 + 1], pathData2.path[i * 3 + 2]);
                if (m_pFSM.showLog)
                {
                    Trace.Log("Path Point" + autoMovePathPoint[i + pathData.pathcnt].ToString());
                }
            }
            if (isFloating)
            {
                autoMovePathPoint[pointLen - 1] = targetPos;
            }

            autoMovePathPointIndex = 0;
            lastTurnPoint          = m_pFSM.transform.position;
            lastAutoMovePoint      = m_pFSM.transform.position;
            isAutoMoving           = true;
            autoMoveTarget         = targetPos;

            Vector3 deta = autoMovePathPoint[0] - m_pFSM.transform.position;
            if (deta.sqrMagnitude < 0.25f) //太近了就不要转向了。因为在跑动中连续点寻路有时候会后退一个路点
            {
                autoMovePathPoint[0] = m_pFSM.transform.position;
            }

            //if (showLog)
            //{
            //    Trace.Log("Tick=" + GameLogicAPI.getTickCount() + " autoMove from " + transform.position + " to " + autoMovePathPoint[0]);
            //}
        }

        if (rotateCamera && !m_autoMoveNavModeFollow)
        {
            Vector3 targetDir = targetPos - m_pFSM.transform.position;
            targetDir.Normalize();
            Vector3 cameraProjDir = Vector3.Cross(Initialize.mainCam.transform.right.normalized, m_pFSM.transform.up.normalized); //摄像机方向投影到人物平面上
            //需要在确定目标后,进行一个判断,如果位置方向与镜头方向的夹角小于45度,就不会进行转动镜头的操作,而是直接在现有镜头下寻路并到点进行攻击
            if (Vector3.Dot(targetDir, cameraProjDir) < 0.707)
            {
                SoldierCamera.MainInstance <SoldierCamera>().enterNavMode(CameraNavMode.Follow, null, Vector3.zero);
                m_autoMoveNavModeFollow = true;
            }
        }

        Vector3 distance = targetPos - m_pFSM.transform.position;

        if (distance.sqrMagnitude > 225.0f) //小于15的头顶不提示
        {
            enableAutoMoveEffect(true);
        }
    }