前篇:Unity实战案例全解析:RTS游戏的框选和阵型功能(2) 生成选择框-CSDN博客
本案例来源于unity唐老狮,有兴趣的小伙伴可以去泰克在线观看该课程
我只是对重要功能进行分析和做出笔记分享,并未无师自通,吃水不忘打井人
本案例的实现流程图
本文实现效果
分析
生成范围检测的框自然要用到范围检测
unity保姆级教程之 范围检测Physics.Overlap_unity overlap-CSDN博客
如何确定这个框的大小尺寸?
首先来看一下范围检测生成框效果
看起来要从Center入手,来看上视图的平面图,要确定这个center的x-z平面位置
通过射线检测获取范围检测的中心点
是否可以得到鼠标的开始和结束位置,将二者的距离除以2不就是center了吗,至于Y深,可以自己设定
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo, 1000, 1 << LayerMask.NameToLayer("Ground"))){//范围检测用的中心点 (由于 摄像机 朝向 是世界坐标系正方向 没有旋转 所以我们可以这样做)Vector3 center = new Vector3((hitInfo.point.x + beginWorldPos.x) / 2, 1, (hitInfo.point.z + beginWorldPos.z) / 2);//范围检测 盒装的 长宽高的一半Vector3 halfExtents = new Vector3(Mathf.Abs(hitInfo.point.x - beginWorldPos.x) / 2, 1, Mathf.Abs(hitInfo.point.z - beginWorldPos.z) / 2);//得到 这个盒装范围内的 所有碰撞器Collider[] colliders = Physics.OverlapBox(center, halfExtents);
得到检测范围内所有的士兵
这时候就可以创建一个士兵的存储容器
//选择到的士兵对象 存储在该容器private List<SoldierObj> soldierObjs = new List<SoldierObj>();
再通过临时变量得到 SoldierObj obj,将每一个士兵的脚本信息加入到容器中
//soldierObjs.Count < 12 是 设置的 选择上限 最多只能选择12个士兵for (int i = 0; i < colliders.Length && soldierObjs.Count < 12; i++){SoldierObj obj = colliders[i].GetComponent<SoldierObj>();if (obj != null){obj.SetSelSelf(true);soldierObjs.Add(obj);}}
当下一次选择的时候 需要清除表
//清空选择for (int i = 0; i < soldierObjs.Count; i++)soldierObjs[i].SetSelSelf(false);soldierObjs.Clear();