改进了一下,中间的河流,做成第五区域,桥两端 分上下 两个点。

具体做法如下图

先设置10个空对象,按照固定位置排好,L代表左 R 代表右 M代表中,D下U上,都是英文首字母。 比如桥左上端,就是 LUM 左上中,因为桥是中间 。桥右下 就是 RDM 右下中。

这段代表就是把  10个节点的坐标 都保存起来,用单例,这样以后获取就不要 找来找去。

 GroundVector = new Transform[10];GameObject GroundVectors = GameObject.FindGameObjectWithTag("GroundVector");List<Vector2> list = new List<Vector2>();for (int i = 0; i < 10; i++){GroundVector[i] = GroundVectors.transform.GetChild(i);list.Add(GroundVector[i].position);}GModel.getInstance.Cv.OnSetSenceVector(list);}

除了 保存 坐标,单例里面还有2个方法

1  获得区域

2 寻路

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CalculationVector
{public Vector2 LU;//左上public Vector2 RU;//右上public Vector2 LD;//左下public Vector2 RD;//右下public Vector2 LUM;//左上中public Vector2 RUM;//右上中public Vector2 LDM;//左下中public Vector2 RDM;//右下中public Vector2 UM;//上中public Vector2 DM;//下中public float Offset;//偏移量public int region;//区域//设置场景各个坐标public void OnSetSenceVector(List<Vector2> list){LU = list[0];RU = list[1];LD = list[2];RD = list[3];UM = list[4];DM = list[5];LUM = list[6];RUM = list[7];LDM = list[8];RDM = list[9];}//五大 区域private int OnSetRegion(Vector2 vec){if (LUM.x < vec.x && vec.x < DM.x)// 1,3 5区域
        {if (LD.y < vec.y && vec.y < LDM.y)//1 区域
            {region = 1;}else if (LDM.y < vec.y && vec.y < LUM.y)  //5区域
            {region = 5;}else{region = 3;}}else                    //2,4  5区域
        {if (RD.y < vec.y && vec.y < RDM.y)//2 区域
            {region = 2;}else if (RDM.y < vec.y && vec.y < RUM.y)  //5区域
            {region = 5;}else{region = 4;}}return region;}// 区域对应 路线public List<Vector2> OnRoute(Vector2 v, int oneself)//判断自己还是对方 0,1 (1是自己)
    {int region = OnSetRegion(v);List<Vector2> list = new List<Vector2>();switch (region){case 1:if (oneself == 1){if (v.y < LD.y)//如果压底部
                    {list.Add(LD);list.Add(LDM);list.Add(LUM);list.Add(LU);list.Add(UM);}else{list.Add(LDM);list.Add(LUM);list.Add(LU);list.Add(UM);}}else{if (v.y < LD.y)//如果压底部
                    {list.Add(DM);}else{list.Add(LD);list.Add(DM);}}break;case 2:if (oneself == 1){if (v.y < RD.y)//如果压底部
                    {list.Add(RD);list.Add(RDM);list.Add(RUM);list.Add(RU);list.Add(UM);}else{list.Add(RDM);list.Add(RUM);list.Add(RU);list.Add(UM);}}else{if (v.y < RD.y)//如果压底部
                    {list.Add(DM);}else{list.Add(RD);list.Add(DM);}}break;case 3:if (oneself == 1){if (v.y > LU.y)//如果压底部
                    {list.Add(UM);}else{list.Add(LU);list.Add(UM);}}else{if (v.y > LU.y)//如果压底部
                    {list.Add(LU);list.Add(LUM);list.Add(LDM);list.Add(LD);list.Add(DM);}else{list.Add(LUM);list.Add(LDM);list.Add(LD);list.Add(DM);}}break;case 4:if (oneself == 1){if (v.y > RU.y)//如果压底部
                    {list.Add(DM);}else{list.Add(RU);list.Add(DM);}}else{if (v.y > RU.y)//如果压底部
                    {list.Add(RU);list.Add(RUM);list.Add(RDM);list.Add(RD);list.Add(DM);}else{list.Add(RUM);list.Add(RDM);list.Add(RD);list.Add(DM);}}break;case 5:if (oneself == 1){if (v.x < DM.x){list.Add(LUM);list.Add(LU);list.Add(UM);}else{list.Add(RUM);list.Add(RU);list.Add(UM);}}else{if (v.x < DM.x){list.Add(LDM);list.Add(LD);list.Add(UM);}else{list.Add(RDM);list.Add(RD);list.Add(UM);}}break;default: break;}return list;}
}

View Code

这样,用户在逻辑帧 就能随时 调用 寻路路径。速度杠杠的。

另外,如果检测 敌人,要跟踪,那么必须要 a*寻路。

为了性能,考虑2个问题。

1.格子 少一点,我觉得11 * 7 就可。1-3毫秒就能寻到,不影响性能。

2. 规定 A*  一帧使用数量,也就是说,如果当前帧有100个要用 A*寻路,那么程序假设规定最大一帧只能20个,寻路的贴上以寻,没寻的,等下一帧寻路。

好处,当然是不会卡,虽然大家会担心另外80个会不会  因为这帧不寻路 迟钝,但 逻辑帧 只要保证1秒 5帧以上,那么 这个迟钝 用户是 看不出来的,毕竟没有可能一次100个都要用a*寻路

更多优化:可以把桥 左右 做成 5,6区域。如果同区域 跟踪,可以走直线,不a*。这也是 一个优化思路。

当然,这个思路仅仅是针对  皇室战争 地图,如果同一个区域  不是 规则形状,需要绕,那么 这个只能走a*

转载于:https://www.cnblogs.com/big-zhou/p/11505628.html

皇室战争 路线行走 (二)相关推荐

  1. 皇室战争 路线行走 (三)

    修改了下之前的区域, 10个区域,这样更加清晰.后台修改了 跳帧 public static void Confrontation(){while (true){Thread.Sleep(500);O ...

  2. 皇室战争Android和苹果,皇室战争怎么开新号玩?ios和安卓设备开小号图文教程[多图]...

    皇室战争新号如何替换老帐号?估计很多玩家正在寻找操作步骤吧!不用着急,下面是友情手机站小麦整理出来的ios和安卓设备开小号图文教程,希望可以帮到大家. iOS玩小号的方法:利用2台设备 1.首先需要用 ...

  3. 皇室战争android换到苹果嘛,皇室战争怎么切换账号 苹果端和安卓端切换账号方法介绍...

    皇室战争怎么切换账号 苹果端: 一般情况下切换账号,只要点击ios系统[设置]进入界面可以看到[Game Center]. 1.点击进入,先注销掉所登录Apple ID账号. 2.打开Game Cen ...

  4. 【Unity】实现类似皇室战争使用“火球”将敌人“炸开”效果

    今天做了一个皇室战争使用"火球"攻击敌人的效果,当然是简易版的.也是跟上一篇博文有联系. 玩过皇室战争的人都知道这张卡片,当火球爆炸的时候会将敌人"炸开",也就 ...

  5. 《皇室战争》体验报告:游戏时长被无限拉长

    <皇室战争>体验报告 http://www.gameres.com/678457.html by伊达政宗 2016.8.26 ↑ 笔者不久前才开出的传奇卡电磁炮 前言: 今年上半年的早一些 ...

  6. 皇室战争服务器维护是干什么的,皇室战争每日任务汇总!看看每天都要做什么...

    皇室战争每日任务汇总!看看每天都要做什么!随着每日任务系统即将推出,这里为大家整理了目前会出现的全部每日任务,部分任务还是比较麻烦的,不过整体来说还是福利大于困难的!下面就让我们一起来看看都有哪些任务 ...

  7. 皇室战争服务器维护是干什么的,皇室战争冷知识 玩了这么久你究竟学到了什么...

    今天有寂寞空虚冷的不愿具名的玩家问小编,玩了这么久的皇室战争你学到了什么?小编其实一开始是拒绝回答这个问题的(因为我也不知道学到了什么),不过后来询问了几个高玩之后,才发现自己真的是才疏学浅,对他们的 ...

  8. 皇室战争:暗夜女巫重做,去掉亡语机制后,她凉的可能会更快

    <皇室战争>新赛季还有一周时间才能开启,大家知道,新赛季到来的同时,久违的平衡性调整也会出现,毕竟这个赛季不平衡的事情太多了,所有玩家都很期待. 虽然CR官方的平衡性调整方案还没出来,但玩 ...

  9. 皇室战争:渔夫化身“战场搅屎棍”,见人就拉,选卡很关键

    <皇室战争>在结束了"卡牌3选1"的锦标赛后,就立马开启了"渔夫之威"的活动.对于这类娱乐性质的挑战赛,玩家们的兴趣还是很高的,毕竟每天都在枯燥地上 ...

最新文章

  1. asp上传错误:此键已与该集合的一个元素关联
  2. JSP根据状态动态改变数据表格按钮
  3. activiti前端画图转化_记Activiti入门使用-2 流程绘制、导入及开始一个流程
  4. 「最有用」的特殊大数据:一文看懂文本信息系统的概念框架及功能
  5. HTML5 云知梦自觉,记录知识 点
  6. 微博办公李国庆:急招副总裁,提请股权激励,希望俞渝同意
  7. 一文了解元宇宙最新发展
  8. day25 面向对象继承 多态
  9. Lucene入门与使用(一) [转]
  10. Java ArrayList的Array,Array的ArrayList
  11. 做添加页面判断用户是否全部填写输入框
  12. python mpi4py 读取json_mpi4py 点到点通信总结
  13. 2020年日历电子版(打印版)_2020年日历表超清晰A4打印版下载
  14. 震惊!CSDN免费送会员,手慢无!
  15. 【分享】使用快递鸟接入圆通电子面单详解
  16. dp和px,那些不得不吐槽的故事——Android平台图片文字元素单位浅析
  17. 圆桌实录 | 为什么不约而同选择了大 Kernel
  18. Protobuf 介绍与实战21:如何生成一维数组、二维数组(repeated数组类型介绍)
  19. Gym 100015 F Fighting for Triangles 博弈,状压dp
  20. Solr Facet

热门文章

  1. TFTP Server 搭建嵌入式
  2. 计算机账务处理流程图,账务处理流程图
  3. 根据电话号码获取联系人实例
  4. 查找——图文翔解HashTree(哈希树)
  5. Ubuntu16.04虚拟机配置模拟路由器
  6. html+css+js实现自动敲文字效果
  7. Go 语言GC原理概述
  8. JAVA生成grib文件_wgrib读grib数据
  9. jquery 搜索框的功能实现
  10. 谨防假经济危机“做空”劳动者权益