Unity实战案例全解析:RTS游戏的框选和阵型功能(3)生成范围检测框 +重置框选操作

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值