//处理寻路 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); }
//处理寻路移动 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); }
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); }
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); }
//执行寻路 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); }
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; } }
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); }
//路径移动 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]; } } }