Beispiel #1
0
        //处理寻路
        private void HandleSeek(SeekPathCom seekPathCom, SpeedCom speedCom)
        {
            //请求寻路
            if (seekPathCom.ReqSeek)
            {
                Vector2Int curPos  = seekPathCom.CurrPos;
                Vector2Int tarPos  = seekPathCom.TargetPos;
                MapData    mapData = TempConfig.GetMapData(seekPathCom.MapPos);

                //List<Vector2Int> path = AstarHelp.FindPath(curPos, tarPos, mapData.ObstaclePos);
                //seekPathCom.MovePath = path;

                TaskHelp.AddTaskTwoParam(seekPathCom, mapData, ExcuteFindPath, FinishFindPath);
                seekPathCom.ReqSeek = false;
            }

            if (seekPathCom.CurrPos.Equals(seekPathCom.TargetPos))
            {
                return;
            }
            if (seekPathCom.MovePath == null || seekPathCom.MovePath.Count <= 0)
            {
                return;
            }

            MoveFollowPath(seekPathCom.Trans, seekPathCom.MovePath, ref seekPathCom.CurrPathIndex, speedCom.MaxSpeed, seekPathCom);
            //HandleSeekMove(seekPathCom, speedCom, viewCom);
        }
Beispiel #2
0
        //处理寻路移动
        private void HandleSeekMove(SeekPathCom seekPathCom, SpeedCom speedCom)
        {
            if (seekPathCom.MovePath == null || seekPathCom.MovePath.Count < 1)
            {
                return;
            }

            Vector2Int lastPoint;
            Vector2Int targrtPoint;

            //最后一个点
            if (seekPathCom.MovePath.Count == 1)
            {
                lastPoint   = seekPathCom.CurrPos;
                targrtPoint = seekPathCom.MovePath[0];
            }
            else
            {
                lastPoint   = seekPathCom.MovePath[0];
                targrtPoint = seekPathCom.MovePath[1];
            }


            //走到目标点---->换下一个点
            if (Vector2.Distance(new Vector2(seekPathCom.Trans.localPosition.x, seekPathCom.Trans.localPosition.y), targrtPoint) <= 0.01f)
            {
                //更新当前所处地图位置
                seekPathCom.CurrPos = targrtPoint;
                //更新目标点
                seekPathCom.MovePath.RemoveAt(0);

                //到达目标点
                if (seekPathCom.MovePath.Count < 1)
                {
                    seekPathCom.MovePath = null;
                    //ECSLocate.ECSLog.LogError("寻路结束》》》》目标点 : ", viewCom.Trans.localPosition);
                    //更新位置
                    seekPathCom.Trans.localPosition = new Vector3(targrtPoint.x, targrtPoint.y, 0);
                    return;
                }

                //最后一个点
                if (seekPathCom.MovePath.Count == 1)
                {
                    lastPoint   = seekPathCom.CurrPos;
                    targrtPoint = seekPathCom.MovePath[0];
                }
                else
                {
                    lastPoint   = seekPathCom.MovePath[0];
                    targrtPoint = seekPathCom.MovePath[1];
                }
            }

            //移动
            float   deltaDistance = speedCom.MaxSpeed * Definition.DeltaTime;
            Vector2 movePos       = CalMovePosition(lastPoint, targrtPoint, deltaDistance);

            seekPathCom.Trans.Translate(movePos);
        }
Beispiel #3
0
        public override bool OnMakeTrue(NodeData wData)
        {
            EntityWorkData workData    = wData as EntityWorkData;
            EnemyCom       enemyCom    = workData.MEntity.GetCom <EnemyCom>();
            SeekPathCom    seekPathCom = workData.MEntity.GetCom <SeekPathCom>();

            MapSensorData mapSensor = ECSLayerLocate.Info.GetWorldInfo <MapSensorData>(WorldInfoKey.MapInfo);

            bool value = MapHelp.CheckPointInArea(seekPathCom.CurrPos, enemyCom.GuardArea, mapSensor.PlayerMapPos);

            return(value);
        }
Beispiel #4
0
        protected override void HandleComs(List <BaseCom> comList)
        {
            stopwatch.Restart();

            SeekPathCom seekPathCom = GetCom <SeekPathCom>(comList[0]);
            SpeedCom    speedCom    = GetCom <SpeedCom>(comList[1]);

            HandleSeek(seekPathCom, speedCom);

            stopwatch.Stop();
            //Debug.Log("寻路系统一次轮询花费>>>>>>" + stopwatch.Elapsed.TotalMilliseconds);
        }
Beispiel #5
0
        //执行寻路
        private (SeekPathCom SeekPathCom, List <Vector2Int> Path) ExcuteFindPath(SeekPathCom seekPathCom, MapData mapData)
        {
            List <Vector2Int> path = null;

            if (seekPathCom.CanFly)
            {
                path = AstarHelp.FindPath(seekPathCom.CurrPos, seekPathCom.TargetPos, mapData.ObstaclePos);
            }
            else
            {
                path = AstarHelp.FindPath(seekPathCom.CurrPos, seekPathCom.TargetPos, mapData.ObstaclePos, mapData.RoadPos);
            }
            return(seekPathCom, path);
        }
Beispiel #6
0
        protected override void OnEnter(NodeData wData)
        {
            EntityWorkData workData = wData as EntityWorkData;
            //参数
            ParamData  param     = workData.GetReqParam((EntityReqId)workData.CurrReqId);
            Vector2Int targetPos = param.GetVect2Int();
            //对组件赋值
            SeekPathCom seekPathCom = workData.MEntity.GetCom <SeekPathCom>();

            if (!seekPathCom.TargetPos.Equals(targetPos))
            {
                seekPathCom.TargetPos = targetPos;
                seekPathCom.ReqSeek   = true;
            }
        }
Beispiel #7
0
        protected override int OnRunning(NodeData wData)
        {
            EntityWorkData workData    = wData as EntityWorkData;
            SeekPathCom    seekPathCom = workData.MEntity.GetCom <SeekPathCom>();
            EnemyCom       enemyCom    = workData.MEntity.GetCom <EnemyCom>();

            //没有达到目标点
            if (!seekPathCom.CurrPos.Equals(seekPathCom.TargetPos))
            {
                return(NodeState.EXECUTING);
            }

            if ((EntityReqId)workData.CurrReqId == EntityReqId.EnemyWander)
            {
                enemyCom.WanderIndex++;
                if (enemyCom.WanderIndex > enemyCom.WanderPath.Count - 1)
                {
                    enemyCom.WanderIndex = 0;
                }
                //ECSLocate.ECSLog.LogError("徘徊完成》》》》》》》》》》》》》");
            }
            workData.CurrReqId = 0;
            return(NodeState.FINISHED);
        }
Beispiel #8
0
        //路径移动
        public void MoveFollowPath(Transform obj, List <Vector2Int> path, ref int index, float speed, SeekPathCom seekPathCom)
        {
            if (index > path.Count - 1)
            {
                return;
            }
            obj.localPosition = Vector2.MoveTowards(obj.localPosition, path[index], speed * Time.deltaTime);
            float distance = Vector2.Distance(path[index], obj.localPosition);

            if (distance < 0.001f)
            {
                seekPathCom.CurrPos = path[index];
                index++;
                if (index == path.Count)
                {
                    obj.localPosition   = new Vector3(path[index - 1].x, path[index - 1].y, 0);
                    seekPathCom.CurrPos = path[index - 1];
                }
            }
        }