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

news/2024/12/21 22:20:26/

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

 


 


http://www.ppmy.cn/news/1533812.html

相关文章

当MySQL中无法使用with关键词时该怎么办?

当MySQL中无法使用with关键词时该怎么办&#xff1f; withc1 as (SELECT count(*) FROM database.table1),c2 as (SELECT count(*) FROM database.table2),c3 as (SELECT count(*) FROM database.table3),c4 as (SELECT count(*) FROM database.table4),c5 as (SELECT count(*…

适用于 Windows 10 的最佳 PDF 编辑器列表,可帮助更改 PDF 文件。

PDF 是一种流行的、多功能且安全的文件格式&#xff0c;用于在线共享文档。但是&#xff0c;如果没有合适的应用程序&#xff0c;查看和编辑 PDF 文件可能会变得复杂。 幸运的是&#xff0c;有很多 PDF 编辑器可以帮助您更正重要文档上的错误、填写表格、为合同添加签名、更改…

Pikachu-xss防范措施 - href输出 js输出

总体原则&#xff1a; 输入做过滤&#xff0c;输出做转义 过滤&#xff1a;根据业务需要进行过滤&#xff0c;如&#xff1a;输入点要求输入手机号&#xff0c;则只允许输入手机号格式的数字&#xff1b; 转义&#xff1a;所有输出到前端的数据&#xff0c;都根据输出点进行转…

先进制造aps专题二十六 基于强化学习的人工智能ai生产排程aps模型简介

基于强化学习的人工智能ai生产排程模型简介 人工智能ai能不能做生产排程&#xff1f; 答案是肯定的。 ai的算法分两类&#xff0c;一类是学习&#xff0c;一类是搜索。 而生产排程问题&#xff0c;它是一个搜索问题&#xff0c;本质上&#xff0c;它和下围棋是一样的 我们…

CSS——文字闪烁效果

CSS——文字闪烁效果 今天来完成一个文字闪烁的动态效果&#xff0c;具体呈现效果如下&#xff1a; 文字闪烁动态效果 实现步骤 基础的样式 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"vi…

leetcode_238:除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂…

第十章---关闭同步流及注意事项及详细分析cin.ignore();

1.关闭同步流及注意事项 1.关闭同步流&#xff1a;ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); ios::sync_with_stdio(0); 这条语句的目的是告诉C的IO库&#xff0c;不要将C的iostream对象&#xff08;如cin, cout, cerr等&#xff09;与C的stdio库&#xff08;如st…

ScatterAdd算子实现简介

Ascend C 算子实现简介&#xff1a;ScatterAdd 算子 本文主要对 ScatterAdd 算子进行简要介绍。 ScatterAdd 用于在给定的索引位置上增加一个指定的值。它的用法类似于 ScatterUpdate 操作&#xff0c;但不同的是&#xff0c;ScatterUpdate 是在指定索引位置上直接覆盖原来的…