Exemplo n.º 1
0
        private long DoCheckPoint_()
        {
            long curTime = TimeUtility.GetElapsedTimeUs();
            long ret     = curTime - m_LastSnapshotTime;

            m_LastSnapshotTime = curTime;
            return(ret);
        }
        private void PathToTarget(UserInfo user, AiPathData data, Vector3 pathTargetPos, long deltaTime)
        {
            UserAiStateInfo info = user.GetAiStateInfo();

            if (null != data)
            {
                data.UpdateTime += deltaTime;
                Vector3 srcPos        = user.GetMovementStateInfo().GetPosition3D();
                float   dir           = user.GetMovementStateInfo().GetMoveDir();
                bool    findObstacle  = false;
                bool    havePathPoint = data.HavePathPoint;
                if (havePathPoint)
                {//沿路点列表移动的逻辑
                    Vector3 targetPos = data.CurPathPoint;
                    if (!data.IsReached(srcPos))
                    {//向指定路点移动(避让移动过程)
                        user.GetMovementStateInfo().TargetPosition = targetPos;
                        float angle = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z));
                        if (!Geometry.IsSameDouble(angle, user.GetMovementStateInfo().GetMoveDir()))
                        {
                            user.GetMovementStateInfo().SetFaceDir(angle);
                            user.GetMovementStateInfo().SetMoveDir(angle);
                            user.GetMovementStateInfo().IsMoving = true;
                            NotifyUserMove(user);
                        }
                    }
                    else
                    {//改变路点或结束沿路点移动
                        data.UseNextPathPoint();
                        if (data.HavePathPoint)
                        {
                            targetPos = data.CurPathPoint;
                            user.GetMovementStateInfo().TargetPosition = targetPos;
                            float angle = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z));
                            user.GetMovementStateInfo().SetFaceDir(angle);
                            user.GetMovementStateInfo().SetMoveDir(angle);
                            user.GetMovementStateInfo().IsMoving = true;
                            NotifyUserMove(user);
                        }
                        else
                        {
                            data.Clear();
                        }
                    }
                }
                if (!user.UnityPathFinding)
                {
                    if (!havePathPoint || findObstacle)
                    {//获得路点过程(寻路)
                        data.Clear();
                        Vector3 targetPos = pathTargetPos;
                        if (Geometry.DistanceSquare(srcPos, targetPos) > 400)
                        {
                            targetPos = user.SpatialSystem.CalcNearstReachablePoint(srcPos, targetPos, 20);
                        }
                        bool canGo = true;

                        /*
                         * if (!user.SpatialSystem.GetCellMapView(user.AvoidanceRadius).CanPass(targetPos)) {
                         * if (!AiLogicUtility.GetWalkablePosition(user.SpatialSystem.GetCellMapView(user.AvoidanceRadius), targetPos, srcPos, ref targetPos))
                         *  canGo = false;
                         * }*/
                        if (canGo)
                        {
                            List <Vector3> posList = null;
                            if (user.SpatialSystem.CanPass(user.SpaceObject, targetPos))
                            {
                                posList = new List <Vector3>();
                                posList.Add(srcPos);
                                posList.Add(targetPos);
                            }
                            else
                            {
                                long stTime = TimeUtility.GetElapsedTimeUs();
                                posList = user.SpatialSystem.FindPath(srcPos, targetPos, user.AvoidanceRadius);
                                long endTime  = TimeUtility.GetElapsedTimeUs();
                                long calcTime = endTime - stTime;
                                if (calcTime > 1000)
                                {
                                    // LogSystem.Warn("pvp FindPath consume {0} us,user:{1} from:{2} to:{3} radius:{4} pos:{5}", calcTime, user.GetId(), srcPos.ToString(), targetPos.ToString(), user.AvoidanceRadius, user.GetMovementStateInfo().GetPosition3D().ToString());
                                }
                            }
                            if (posList.Count >= 2)
                            {
                                data.SetPathPoints(posList[0], posList, 1);
                                targetPos = data.CurPathPoint;
                                user.GetMovementStateInfo().TargetPosition = targetPos;
                                float angle = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z));
                                user.GetMovementStateInfo().SetFaceDir(angle);
                                user.GetMovementStateInfo().SetMoveDir(angle);
                                user.GetMovementStateInfo().IsMoving = true;
                                NotifyUserMove(user);
                            }
                            else
                            {
                                user.GetMovementStateInfo().IsMoving = false;
                                NotifyUserMove(user);
                            }
                        }
                        else
                        {
                            user.GetMovementStateInfo().IsMoving = false;
                            NotifyUserMove(user);
                        }
                    }
                }
                else
                {
                    if (!havePathPoint || findObstacle)
                    {
                        user.GetMovementStateInfo().IsMoving = false;
                        NotifyUserMove(user);
                    }
                }
            }
        }
Exemplo n.º 3
0
 private long End_()
 {
     m_EndTime = TimeUtility.GetElapsedTimeUs();
     return(m_EndTime - m_StartTime);
 }
Exemplo n.º 4
0
 private void Start_()
 {
     m_LastSnapshotTime = TimeUtility.GetElapsedTimeUs();
     m_StartTime        = m_LastSnapshotTime;
 }