首页 > 其他分享 >Unity实战案例全解析:RTS游戏的框选和阵型功能(5)阵型功能 优化一

Unity实战案例全解析:RTS游戏的框选和阵型功能(5)阵型功能 优化一

时间:2024-09-30 21:48:13浏览次数:10  
标签:朝向 阵型 transform Unity RTS soldierObjs return 排序

前篇:Unity实战案例全解析:RTS游戏的框选和阵型功能(4)阵型功能-CSDN博客

本案例来源于unity唐老狮,有兴趣的小伙伴可以去泰克在线观看该课程

我只是对重要功能进行分析和做出笔记分享,并未无师自通,吃水不忘打井人

本案例的实现流程图 

兵种排序 

 首先

在一个阵型中,我们希望远程兵可以在近战兵后面,所以就需要区分不同兵种类

枚举变量很合适

public enum SoldierType
{
    Hero,       //英雄
    Warrior,    //战士
    Archer,     //猎人
    Magician,   //魔法师
    Loong,      //龙
}

其次

定义其在容器中的顺序,因为布局的时候是按照容器中的顺序拿出来一个一个排列的
因为士兵容器是List,所以List方法里面的Sort就很合适

soldierObjs.Sort((a, b) => {
    if (a < b)
        return -1;
    else if (a > b)
        return 1;
    else
        return 0;
});

然后

现在士兵的移动行为并不完善,当整体移动的时候会出现这种情况

而我实际想要的是,这样队伍会有限寻找最近的点去匹配

所以还需要规定一个角度和距离的问题,实现起来并不难所以直接看代码吧

  //判断队伍新朝向和队伍老朝向之间的夹角
  //新朝向:(hitInfo.point - soldierObjs[0].transform.position).normalized
  //老朝向:soldierObjs[0].transform.forward 我们把之前的第一个士兵的面朝向作为了 阵型老朝向
  //两个朝向之间的夹角大于60度 我们就对士兵列表重新进行排序
  if( Vector3.Angle((hitInfo.point - soldierObjs[0].transform.position).normalized, soldierObjs[0].transform.forward) > 60 )
  {
      //满足条件后 重新进行士兵的排序
      //优先 兵种排序
      //其次 才是 距离排序
      soldierObjs.Sort((a, b) => {
          //优先兵种排序
          if (a.type < b.type)
              return -1;
          else if (a.type == b.type)
          {
              //只有兵种相同时 才会以离目标点距离进行排序
              if (Vector3.Distance(a.transform.position, hitInfo.point) <= 
                  Vector3.Distance(b.transform.position, hitInfo.point))
                  return -1;
              else
                  return 1;
          }
          else
              return 1;
      });
  }

 

 


 

标签:朝向,阵型,transform,Unity,RTS,soldierObjs,return,排序
From: https://blog.csdn.net/2301_77947509/article/details/142664189

相关文章

  • unity编辑器绘制扇形
    使用UnityEditor.Handles.DrawSolidArc usingUnityEngine;usingUnityEditor;publicclassDrawSectorHandles:MonoBehaviour{publicfloatradius=5f;//扇形半径publicfloatangle=90f;//扇形角度publicColorarcColor=Color.red;/......
  • Unity编辑器扩展-基于UniTask的Http请求和下载
    publicclassHttpHelper{publicstaticasyncUniTask<(bool,string)>RequestGetUrlAsync(stringurl,booldebug=false){Debug.Log($"reqgeturl:{url}");UnityWebRequestreq=null;......
  • 【Echarts地图开发全流程加全套代码】
    前言本篇分享近期做的项目echarts相关地图开发的相关细节和避坑细节!!一、地图Json文件echarts地图采用官网的type类型map进行配置开发ApacheEChartsApacheECharts,一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。https://echarts.a......
  • django基于ECharts的毕业生招聘信息可视化分析系统(源码+vue+可视化大屏展示+爬虫分析
    收藏关注不迷路!!......
  • 【春秋招必看】Unity相关笔试面试题(内有完整答案)第八期
    欢迎来到光光的奇妙冒险,我是你们的煎饼光子老师。今天是我们的第八期笔试面试题总结。C#部分:1、如果我们想为Unity中的Transform类添加一个自定义的方法,应该如何处理?答案:通过C#的拓展方法相关知识点进行添加2、请说出using关键字的两个作用答案:1.引入命名空间2.安全......
  • Unity获取当前脚本所在位置的全路径
    前言我们在开发插件或一些模板代码时,总会出现当如果文件夹被移动导致我们所需要的一些配置模板或配置路径错误。为了避免这种情况,我们就需要在我们的插件代码中进行一个路径修正,具体的修正逻辑就由使用者进行自定义了,而我们只需要获取到当前的全部再进行修改即可。 ///<summ......
  • 【Unity】(2D)物体拖拽
    在2D场景中,实现将框中的物体拖拽之符合条件的物体中;应用场景:排序、物品栏、背包等;成果展示Demo中实现的效果是画面中存在4个图片,需要按照喜好程度对图片进行排序,将上面的1-2-3-4序号拖拽至对应的图片旁边。Scene部分其中Target中存放4张猫咪图片,对应的Content中的1-2-3-4是......
  • unity常见的两种简单易上手的移动方式
    第一,使用transform的translate进行移动。使用方法:对象.transform.translate(方向向量*normalized*Time.deltaTime*speed);normalized是将这个方向向量归一化,即模长等于1,这是为了控制速度等于后面的speed,如果不加也能够实现移动,但是速度不便于控制。Time.deltaTime是每一......
  • 基于Python+flask+MySQL+HTML的全国范围水质分析预测系统,可视化用echarts,预测算法随机
    1绪论近年来,水质监测系统的进步显著,这在全球环保意识不断提升的背景下尤为明显。大量资源被投入到水质监测技术的研发和应用中,以不断优化监测效能。水资源的保护及健康环境的维护,这种趋势旨在提升人们生活质量,确保优质的生活条件。通过持续不懈的努力,我们得以实现对水质的及......
  • Unity导入xLua流程
    xLua文档xLua下载Releases中带版本号的zip压缩包,解压到Assets,形成目录:Plugins/XLua/XLuaSample1.csusingUnityEngine;usingXLua;publicclassXLuaSample1:MonoBehaviour{voidStart(){LuaEnvenv=new();env.DoString("print('hello......