private int m_nDeadInterval = 0; //进入状态时已经死亡的时间,用于死亡动作的播放时间偏移 public void ClearState() { if (m_pFSM && m_pFSM.getEntityState() == EntityState.Dead) { OnLeave(); } }
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); } }