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

news2024/12/27 1:28:42

前篇: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;
      });
  }

 


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2180923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

产品管理- 互联网产品(6):产品测试

可用性测试 招募有代表性用户作为测试代表参与者&#xff0c;评估某产品符合特定可用性及符合程度。以具有代表性的用户为测试样本。 测试中多关注用户表情与动作。多鼓励与测试的用户更多的操作以用户角度发现问题。同时要做好询问工作&#xff0c;耐心聆听用户的意见&#x…

CSS面试真题 part1

CSS面试真题 part1 1、说说你对盒子模型的理解2、谈谈你对BFC的理解3、什么是响应式设计&#xff1f;响应式设计的基本原理是什么&#xff1f;如何做&#xff1f;4、元素水平垂直居中的方法有哪些&#xff1f;如果元素不定宽高呢&#xff1f;5、如何实现两栏布局&#xff0c;右…

Java数组使用练习(完)

目录 1.数组的使用 1.1数组拷贝native 1.2二分查找 1.3数组元素的平均值 1.4数组元素的排序 1.5其他的常用的方法 1.6冒泡排序实现 1.7数组元素的逆置实现 1.8二维数组 2.关于数组的课后练习 2.1改变数组原有的元素的值 2.2奇数在前&#xff0c;偶数在后 2.3判断目…

Axure大屏可视化模板在不同领域中的实际应用案例

一、农业领域 案例背景&#xff1a; 智慧农业是当前农业发展的重要趋势&#xff0c;通过物联网、大数据等技术手段&#xff0c;实现农业生产的智能化管理。Axure大屏可视化模板在智慧农业平台的建设中发挥了重要作用。 实际应用&#xff1a; 农田环境监控&#xff1a;通过Axu…

TI DSP TMS320F280025 Note13:CPUtimer定时器原理分析与使用

TMS320F280025 CPUtimer定时器原理分析与使用 ` 文章目录 TMS320F280025 CPUtimer定时器原理分析与使用框图分析定时器中断定时器使用CPUtimers.cCPUtimers.h框图分析 定时器框图如图所示 定时器有一个预分频模块和一个定时/计数模块, 其中预分频模块包括一个 16 位的定时器分…

基于单片机的家用安防报警系统设计

本设计基于STM32F103单片机作为系统主控核心&#xff0c;通过DS18B20温度传感器和MQ烟雾传感器对家庭环境的温度和烟雾浓度进行检测实现火灾预警的设计要求&#xff0c;当检测数据异常时激发报警提示。系统采用红外传感器对家庭环境中是否有盗贼进入实现检测&#xff0c;当出现…

单臂路由详解

目录 单臂路由概念 单臂路由实验 路由器配置 交换机配置 实验验证 基于Eth-Trunk的单臂路由 路由器配置 交换机配置 实验验证 单臂路由概念 单臂路由技术能让路由器的一个物理接口对应不同VLAN数据的实质是把物理接口分成若干个子接口&#xff0c;这些子接口通过封装…

前端算法合集-1(含面试题)

(这是我面试一家中厂公司的二面算法题) 数组去重并按出现次数排序 题目描述: 给定一个包含重复元素的数组&#xff0c;请你编写一个函数对数组进行去重&#xff0c;并按元素出现的次数从高到低排序。如果次数相同&#xff0c;则按元素值从小到大排序。 let arr [2, 11,10, 1…

windows配置C++编译环境和VScode C++配置(保姆级教程)

1.安装MinGW-w64 MinGW-w64是一个开源的编译器套件,适用于Windows平台,支持32位和64位应用程序的开发。它包含了GCC编译器、GDB调试器以及其他必要的工具,是C++开发者在Windows环境下进行开发的重要工具。 我找到了一个下载比较快的链接:https://gitcode.com/open-source-…

表格控件QTableWidget

下面说一下表格的常用方法 行列数目、行表头、列表头 行表头&#xff1a;就是表格控件的第一行&#xff0c;用于设置每一列的标题 列表头&#xff1a;就是表格控件的第一列&#xff0c;用于设置每一行的标题&#xff0c;通常缺省则默认显示行号 设置和获取行列的数目 在添…

【CKA】一、基于角色的访问控制-RBAC

1、基于角色的访问控制-RBAC 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 这道题就三条命令&#xff0c;建议直接背熟就行。 也可以查看帮助 kubectl create clusterrole -h kubectl create serviceaccount -h kubectl create rolebinding -h 注意&#xff1a; 1、资…

Prisma 基本使用

以下内容官方文档都有&#xff0c;特此记录便于快速查阅文档。 Prisma CLI 作为开发依赖项安装到项目中 npm install prisma --save-devPrisma 配合 ts 很强大&#xff0c;所有我们可以结合 ts 一起使用&#xff1a; npm install typescript ts-node types/node --save-dev n…

对于“言而有信”之己见

大凡古文爱好者&#xff0c;都知晓《论语》中的“仁、义、礼、智、信”这五大做人的常理。 网络图片 儒家对于“言而有信”的认识十分理性&#xff0c;尤其是其中的“信”字&#xff0c;对于当今社会成堆“老赖”&#xff0c;简直就是直接打在他们脸上的大巴掌。​ 古人对于“…

强化学习-python案例

强化学习是一种机器学习方法&#xff0c;旨在通过与环境的交互来学习最优策略。它的核心概念是智能体&#xff08;agent&#xff09;在环境中采取动作&#xff0c;从而获得奖励或惩罚。智能体的目标是最大化长期奖励&#xff0c;通过试错的方式不断改进其决策策略。 在强化学习…

传统操作系统和分布式操作系统的区别

分布式操作系统和传统操作系统之间的区别&#xff0c;根植于它们各自的设计哲学和目标。要理解这些差异&#xff0c;需要从操作系统的基本定义、结构、功能以及它们在不同计算环境中的表现进行分析。每种系统都试图解决特定的计算挑战&#xff0c;因此在不同的使用场景下具有各…

互斥量mutex、锁、条件变量和信号量相关原语(函数)----很全

线程相关知识可以看这里: 线程控制原语(函数)的介绍-CSDN博客 进程组、会话、守护进程和线程的概念-CSDN博客 1.同步概念 所谓同步&#xff0c;即同时起步&#xff0c;协调一致。不同的对象&#xff0c;对“同步”的理解方式略有不同。如&#xff0c;设备同步&#xff0c;是…

前端——js补充

一、数学对象 1.随机数 // 0-1 console.log(Math.random()); // 0-9 console.log(Math.random() * 9); // 6-13 console.log(Math.random() * (13 - 6) 6); //n-m Math.random() * (m - n) n 2.取整 // 向下取整 console.log(Math.floor(1.9));//1 // 向上取整 console.log(…

解决端口被占用

当你被你的编译器提醒&#xff0c; 当前端口被占用&#xff0c; 但明明你的服务什么的都没有启用&#xff0c;这时有三种解决办法&#xff1a; 1 。 重启 。 重启解决80%的问题 2 。 修改你的端口号 。 3 。 去windows命令行中查看&#xff0c;端口占用情况 第一步 &#xf…

OpenStack Yoga版安装笔记(十五)Horizon安装

1、官方文档 OpenStack Installation Guidehttps://docs.openstack.org/install-guide/ 本次安装是在Ubuntu 22.04上进行&#xff0c;基本按照OpenStack Installation Guide顺序执行&#xff0c;主要内容包括&#xff1a; 环境安装 &#xff08;已完成&#xff09;OpenStack…

[卸载] 软件彻底卸载工具的下载及详细安装使用过程(附有下载文件)

一般软件安装的有问题&#xff0c;或者想重新安装其他版本就需要将原来的版本删除干净&#xff0c;但常常删不干净&#xff0c;本文分享一个软件彻底卸载工具&#xff0c;完成彻底卸载软件的工作 下载链接在文末 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文…