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