红警框选功能

红警框选功能,我这里大概的思路就是用Unity里面的GL来实现,然后把士兵都放在一个链表集合里面,把士兵的坐标转化为屏幕坐标,然后判断是否在框选的范围内,如果在范围内,就进行移动。

(1)建一个材质,这个材质的颜色决定框选的颜色,然后材质的类型设置成UI/Default。

(2)写如下代码

using UnityEngine;
using System.Collections;

/// <summary>
/// GL画框, 该脚本一定要挂载在摄像机上面才可以的
/// </summary>
public class CameraGL : MonoBehaviour
{
    public Material mat;      //把第一步建的材质托在上面
    public bool shouldDrawRect;
    public Vector2 startPos;
    public FrameSelect fs;

    void OnPostRender()
    {
        if (shouldDrawRect)
        {
            Vector2 endPos = Input.mousePosition;
            GL.PushMatrix();
            mat.SetPass(0);
            GL.LoadPixelMatrix();
            GL.Begin(GL.QUADS);
            GL.Vertex(startPos);
            GL.Vertex(new Vector3(startPos.x, endPos.y, 0));
            GL.Vertex(endPos);
            GL.Vertex(new Vector3(endPos.x, startPos.y, 0));
            GL.End();
            GL.PopMatrix();

            fs.selectSoliders.Clear();
            foreach (Solider m in fs.allSoliders)
            {
                Vector3 pos = m.transform.position;
                Vector3 tempPos = Camera.main.WorldToScreenPoint(pos);  //把世界坐标转化为屏幕坐标
                Vector3 p1 = startPos;
                Vector3 p2 = endPos;
                if (startPos.x < endPos.x)
                {
                    p1.x = endPos.x;
                    p2.x = startPos.x;
                }
                if (startPos.y < endPos.y)
                {
                    p1.y = endPos.y;
                    p2.y = startPos.y;
                }
                if (tempPos.x > p2.x && tempPos.x < p1.x && tempPos.y > p2.y && tempPos.y < p1.y)
                {
                    m.select= true;
                    fs.selectSoliders.Add(m);
                }
            }
        }
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            shouldDrawRect = true;
            startPos = Input.mousePosition;
        }
        if (Input.GetMouseButtonUp(0))
        {
            shouldDrawRect = false;
        }
    }

}

3 代码框选控制

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;

/// <summary>
/// 框选控制
/// </summary>
public class FrameSelect : MonoBehaviour
{
    public List<Solider> allSoliders;

    public List<Solider> selectSoliders;

    void Awake()
    {
        selectSoliders = new List<Solider>();
    }

    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Escape))
        {
            foreach (Solider item in selectSoliders)
            {
                item.select = false;
            }
            selectSoliders.Clear();
        }
    }

}

4士兵类
using UnityEngine;
using System.Collections;

/// <summary>
/// 每一个士兵挂载的类
/// </summary>
public class Solider : MonoBehaviour
{
    [SerializeField]
    private bool _select;

    [SerializeField]
    private Color color;

    void Awake()
    {
        _select = false;
        color = GetComponent<MeshRenderer>().material.color;
    }

    public bool select
    {
        set
        {
            _select = value;
            if (_select)
            {
                GetComponent<MeshRenderer>().material.color = Color.green;
            }
            else
            {
                GetComponent<MeshRenderer>().material.color = color;
            }
        }
        get
        {
            return _select;
        }
    }
}

大概的就是这样,具体的工程文件,我打成了包在下面的地址上面,可以下载,我用的unity版本是5.1.2f的,如果版本低了会打不开,版本高的话可能存在问题

http://files.cnblogs.com/files/ZhiXing-Blogs/FrameSelect.rar

时间: 2024-10-10 07:53:20

红警框选功能的相关文章

jQuery实现复选框的全选、反选和不选功能

<!doctype html><html> <head> <meta charset="utf-8"> <title>jQuery实现复选框的全选.反选和不选功能</title> <script type="text/javascript" src="jquery-1.11.3.min.js"></script> </head> <s

CheckedListBoxControl 实现复选框的单选与多选功能

由于工作需要,需要实现复选框的单选与多选功能,找了好多资料都不是很全,经过两天苦苦的挖挖挖,终于完成啦O(∩_∩)O哈哈~ 用DEV控件中的CheckedListBoxControl控件,当然VS中的复选框组合控件应该按照下面方法也可以实现该功能,可以试下(⊙o⊙)哦 代码来啦O(∩_∩)O哈哈~ 1 //首先触发SelectedIndexChanged事件,然后再触发ItemCheck事件 2 3 //存储选中的复选框的值 4 string strGXY=string.Empty; 5 pri

JavaScript实现全选选项框的功能和鼠标划入出现下拉框的功能--JavaScript实例集锦(初学)

有一些论坛,文章后台编辑都会出现选择框的操作. 1.实现选项框全选和取消全选的功能: 代码实现: <!DOCTYPE html> <html> <head> <title>全选功能</title> <script type="text/javascript"> window.onload=function(){ var oBtn=document.getElementById('btn'); var aInput=

如何使用CAD编辑器中的框选缩放功能?

如何使用CAD编辑器中的框选缩放功能?现在随着人们生活水平的不断提高,越来越多的人们开始对住房有了更多的要求,所有随着CAD行业的发展,也有越来越多的小伙伴们开始加入到CAD这个行业中来,日常的工作就是编辑出各种CAD图纸,但是在编辑CAD图纸的时候,也会遇到许许多多的问题,那就是如何使用CAD编辑器中的框选缩放功能?具体要怎么来进行操作?下面就利用迅捷CAD编辑器标准版来教教大家具体操作步骤,下面我们就一起来看看具体操作方法吧! 步骤一:首先电脑中没有下载安装CAD编辑器的小伙伴们,还是需要在

leaflet地图全图以及框选截图导出功能(附源码下载)

前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet 的插件库,非常有用 内容概览 leaflet地图截图导出功能源代码demo下载 效果图如下: 本篇主要参考截图插件domtoimage:https://github.com/tsayen/dom-to-image地图全图导出直接用上面的domtoimage插件,然后矩形框选截图导出也是在domtoi

jQuery实现的全选、反选和不选功能

适用于网页多选后需要进行批量操作的场景(如批量删除等).如有问题希望大家可以指正.谢谢~~ HTML 我们的页面上有一个歌曲列表,列出多行歌曲名称,并匹配复选框供用户选择,并且在列表下方有一排操作按钮 <ul id="list"> <li><label><input type="checkbox" value="1"> 1.时间都去哪儿了</label></li> <l

JS全选功能代码优化

最近在看javascript MVC那本书,也感觉到自己写的代码也并不优雅,所以一直在想 用另一种模式来编写JS代码,所以针对之前的简单的JS全选功能来做个简单的demo,使用目前现在的编码方式来重新编码,当然以后会一直用这种方式来编写自己的代码.下面是如下代码: JS所有代码: /** * JS全选 * @class Checkall * @param {Object} cfg * @param {Element|selector} [cfg.container] 限定全选的容器 * @par

jquery 拖拽,框选的一点积累

拖拽draggable,框选 selectable,按ctrl多选,临近辅助对齐,从工具栏拖工具  等,和jqueryui的selectable不同,是在一个父div里框选子div(类似框选文件),一些功能不是很细致,仅供参考. <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&qu

QComboBox实现复选功能

需求: 下拉列表有复选功能 不可编辑 显示所有选中项 关于QComboBox的复选功能有几种方案: QStandardItemModel + QStandardItem QListWidget + QListWidgetItem Model/View + QItemDelegate 当然,还有其它更好的方式,这里就不再过多介绍了,下面介绍一种比较简单的: QListWidget + QListWidgetItem + QCheckBox pListWidget = new QListWidget