热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

小怪绕圈围堵英雄

一开始的思想是:在英雄周围形成一个半径为r的圆圈,并设定向下即设定target.transform.forward为0度角的向量和每45度角有一个可以占

一开始的思想是:在英雄周围形成一个半径为r的圆圈,并设定向下即设定target.transform.forward为0度角的向量和每45度角有一个可以占的位置,用小怪的位置点与英雄的位置点做一条向量,这条向量与0度角向量之间产生一个夹角,判断这个夹角与哪个可以占的位置最近就把它设为一开始的目标去寻路:

public void FindDestination(float angle,Transform target)//敌人停留位置算法
    {
        r += (cout1 /8) * 15;//8个小怪一个圈,若超过8个就半径加大
        cout1++;//统计当前小怪的数目
        for (int i = 0; i         {
            if (angle <0)
            {
                angle += 360;
            }
            FlagI = (int)(angle / (360 / n));//标识停留的位置范围   //n表示一个圈设几个点
            FlagL = (FlagI - i) * (360 / n);//取值范围的左边界
            FlagR = (FlagI + 1 + i) * (360 / n);//取值范围的右边界
            if (FlagL <0)
            {
                FlagL += 360;
            }
            if (FlagR <0)
            {
                FlagR += 360;
            }
            if (FlagR > 360)
            {
                FlagR -= 360;
            }
            if (FlagL > 360)
            {
                FlagL -= 360;
            }
            if ((FlagR-angle )<(angle-FlagL))//往右走
            {
                if (flag[FlagR + r ] == false)
                {
                x1 = target.transform.position.x+ r * Mathf.Cos(Convert.ToSingle(FlagR  * Mathf.PI / 180));//计算坐标x的增量
                z1 = target.transform.position.z+r * Mathf.Sin(Convert.ToSingle(FlagR * Mathf.PI / 180));//计算坐标x的增量
                 flag[FlagR + r ] = true;
                 dest = new Vector3(x1, target.transform.position.y, z1);//目标位置
                 break;
                    }
                }
                else if (flag[FlagL + r ] == false)
                {
                   x1 = target.transform.position.x+r * Mathf.Cos(Convert.ToSingle(FlagL * Mathf.PI / 180));//计算坐标x的增量
                   z1 = target.transform.position.z+ r * Mathf.Sin(Convert.ToSingle(FlagL * Mathf.PI / 180));//计算坐标x的增量
                   flag[FlagL + r] = true;
                    dest = new Vector3(x1, target.transform.position.y, z1);//目标位置
                    break;
                }
            }
            else if((FlagR - angle) >=(angle - FlagL))//往左走
            {
                //Debug.Log("flar:" + FlagR);
                if (flag[FlagL + r ] == false)
                {
                   x1 = target.transform.position.x+r * Mathf.Cos(Convert.ToSingle(FlagL * Mathf.PI / 180));//计算坐标x的增量
                   z1 = target.transform.position.z+ r * Mathf.Sin(Convert.ToSingle(FlagL * Mathf.PI / 180));//计算坐标x的增量
                   flag[FlagL + r] = true;
                    dest = new Vector3(x1, target.transform.position.y, z1);//目标位置
                    break;
                    }
                }
                
                else if (flag[FlagR + r ] == false)
                {
                 x1 = target.transform.position.x+ r * Mathf.Cos(Convert.ToSingle(FlagR * Mathf.PI / 180));//计算坐标x的增量
                 z1 = target.transform.position.z+r * Mathf.Sin(Convert.ToSingle(FlagR * Mathf.PI / 180));//计算坐标x的增量
                 flag[FlagR+r] = true;
                  dest = new Vector3(x1, target.transform.position.y, z1);//目标位置
                  break;
                }
            }
          }
       this.target = target;
       this.dest = dest;

    }

一开始产生一个小怪就算与英雄之间的距离,之后通过从小到大的排序结果对FindDestination()函数 进行调用

for (int i = 0; i         {
            //初始化敌人
            goHero = GameObject.Instantiate(HeroObj);
            //敌人放入数组里面
            AllHero.Add(goHero);
            //敌人的位置
            goHero.transform.position = GetNextPosition();
            //假设目标点6-5
              this.agent=GameObject.FindGameObjectWithTag("agent").GetComponent();//.GetComponent();
                                GameObject[] players = GameObject.FindGameObjectsWithTag("enemy");//找到tag为player的英雄                                                              // targetPosition = new Vector3[2];                                                                       //判断怪物与玩家的距离来选择目标
            foreach (GameObject player in players)//找到目标点
            {
                if (Vector3.Distance(player.GetComponent().position, goHero.transform.position)                 {
                    distance = Vector3.Distance(player.GetComponent().position, goHero.transform.position);
                    target = player.transform;//定义player就是目标玩家
                }
            }
            
            //存储敌人index与对应的目标
            list2[i] =target;
            number0 = list2[i].transform.forward;
            //目标点的位置
            targetPoSition = new Vector3(list2[i].position.x, list2[i].position.y, list2[i].position.z);
            //敌人的位置 Verctor3 hero
            //目标点与敌人的夹角
            hero = AllHero[i].GetComponent();
            angle = Vector3.Angle(number0, hero.transform.position);
            //目标点与敌人的方向
            float dir = (Vector3.Dot(Vector3.up, Vector3.Cross(number0, targetPoSition - hero.transform.position)) <0 ? -1 : 1);
            angle *= dir;
            //Debug.Log("angle:"+angle);
            if (angle <0)
            {
                angle += 360;
            }
            list3[i] = angle;
            //target目标所在位置
            v1 = new Vector3(list2[i].transform.position.x, list2[i].transform.position.y, list2[i].transform.position.z);
        v = new Vector3(list2[i].transform.position.x + hero.r * Mathf.Cos(Convert.ToSingle(angle * Mathf.PI / 180)), list2[i].transform.position.y, list2[i].transform.position.z + hero.r * Mathf.Sin(Convert.ToSingle(angle * Mathf.PI / 180)));
            //6-5 存储敌人的index和距离
            list[i]= Vector3.Distance(new Vector3(goHero.transform.position.x, goHero.transform.position.y, goHero.transform.position.z),v);
        }
       
        //6-5 通过距离从小到大排序
        Dictionary dic1Asc = list.OrderBy(p => p.Value).ToDictionary(o => o.Key, p => p.Value);
        foreach (KeyValuePair k in dic1Asc)
        {
            hero = AllHero[k.Key].GetComponent();
            hero.FindDestination(list3[k.Key], list2[k.Key]);

        }




推荐阅读
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了如何对PHP二维数组进行排序以及如何获取最大值。同时还提到了在数据分析系统中使用排序的实例,以及如何统计角色等级和创建角色总数。 ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • PHP引用的概念和用法详解
    本文详细介绍了PHP中引用的概念和用法。引用是指不同的变量名访问同一个变量内容,类似于Unix文件系统中的hardlink。文章从引用的定义、作用、语法和注意事项等方面进行了解释和示例。同时还介绍了对未定义变量使用引用的情况,以及在函数和new运算符中使用引用的注意事项。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有