Unity3D中画拉选框(绘制多选框)
问题分析:
需要根据鼠标事件,摁下鼠标开始绘制选择框,抬起鼠标结束绘制。
实现思路:
该需求是屏幕画线,Unity内置了GL类 封装了OpenGL,可以通过GL类来实现一些简单的画图操作,这里也是使用GL实现。
分析:
代码中有这样一个回调是属于屏幕渲染的,需要在API里了解一下public void OnRenderObject(),以及OnGUI都可以实现,了解下Unity的生命周期执行顺序中,屏幕渲染会在GameLogic后会执行其中有几个屏幕渲染回调API来了解一下:

注意:
GL.Push 和 GL.Pop 之间写GL代码
GL.Begin 和 GL.End 之间写画线逻辑Begin和End 之间的两个Vector3表示起点和终点
代码:
/// <summary>
/// 绘制选择框
/// </summary>
class Selectbox : MonoBehaviour
{
#region Fields & Attribute //画笔颜色
private Color brushColor=Color.white; //画线的材质
private Material drawMaterial; //开始绘制标志
private bool isStartDraw=false; //开始和结束绘制点
private Vector3 mouseStartPos, mouseEndPos; //设置选择区域的Color
private Color selectionAreaColor = Color.green; //获取绘制状态(开始绘制标志)
public bool IsStartDraw { get => isStartDraw; set => isStartDraw = value; } //绘制开始坐标
public Vector3 MouseStartPos { get => mouseStartPos; set => mouseStartPos = value; } //绘制结束坐标
public Vector3 MouseEndPos { get => mouseEndPos; set => mouseEndPos = value; } //设置画笔颜色
public Color BrushColor { get => brushColor; set => brushColor = value; } //设置选择区域的Color
public Color SelectionAreaColor { get => selectionAreaColor; set => selectionAreaColor = value; } #endregion #region Public Methods /// <summary>
/// 绘制选择框构造函数
/// </summary>
public Selectbox()
{ } /// <summary>
/// 初始化
/// </summary>
public void Awake()
{
drawMaterial = new Material(Shader.Find("UI/Default"));
this.drawMaterial.hideFlags = HideFlags.HideAndDontSave;
this.drawMaterial.shader.hideFlags = HideFlags.HideAndDontSave;
} #endregion #region Private Methods /// <summary>
/// 绘制逻辑
/// </summary>
private void OnGUI()
{
if (IsStartDraw)
{
//材质通道,0为默认。
drawMaterial.SetPass();
GL.LoadOrtho();
//设置用屏幕坐标绘图
GL.LoadPixelMatrix();
DrawRect();
DrawRectLine();
}
} /// <summary>
/// 绘制框选区
/// </summary>
private void DrawRect()
{
GL.Begin(GL.QUADS);
//设置颜色和透明度
GL.Color(selectionAreaColor);
if ((MouseStartPos.x > MouseEndPos.x && MouseStartPos.y > MouseEndPos.y) || (MouseStartPos.x < MouseEndPos.x && MouseStartPos.y < MouseEndPos.y))
{
GL.Vertex3(MouseStartPos.x, MouseStartPos.y, );
GL.Vertex3(MouseStartPos.x, MouseEndPos.y, );
GL.Vertex3(MouseEndPos.x, MouseEndPos.y, );
GL.Vertex3(MouseEndPos.x, MouseStartPos.y, ); }
else
{
GL.Vertex3(MouseStartPos.x, MouseStartPos.y, );
GL.Vertex3(MouseEndPos.x, MouseStartPos.y, );
GL.Vertex3(MouseEndPos.x, MouseEndPos.y, );
GL.Vertex3(MouseStartPos.x, MouseEndPos.y, );
}
GL.End();
} /// <summary>
/// 绘制框选边框
/// </summary>
private void DrawRectLine()
{
GL.Begin(GL.LINES);
//设置方框的边框颜色 边框不透明
GL.Color(BrushColor);
GL.Vertex3(MouseStartPos.x, MouseStartPos.y, );
GL.Vertex3(MouseEndPos.x, MouseStartPos.y, );
GL.Vertex3(MouseEndPos.x, MouseStartPos.y, );
GL.Vertex3(MouseEndPos.x, MouseEndPos.y, );
GL.Vertex3(MouseEndPos.x, MouseEndPos.y, );
GL.Vertex3(MouseStartPos.x, MouseEndPos.y, );
GL.Vertex3(MouseStartPos.x, MouseEndPos.y, );
GL.Vertex3(MouseStartPos.x, MouseStartPos.y, );
GL.End();
} #endregion
}
这个地方,在画面时,发现只有两个象限是正常的,其他两个象限都画不出来,原来是一三和二四象限中构建面(点)的顺序不同,相反。还有shader选默认的就好,有颜色即可。

即这段。
到这完成了就,欢迎指正。
Unity3D中画拉选框(绘制多选框)的更多相关文章
- jquery选中将select下拉框中一项后赋值给text文本框
jquery选中将select下拉框中一项后赋值给text文本框,出现无法将第一个下拉框的value赋值给文本框 因为select默认选中第一项..在选择第一项时,便导致无法激发onchange事件. ...
- Unity3D中灵活绘制进度条
有时我们需要在Unity3D中绘制进度条,如: 或 如果使用4.6版本以下的unity绘制环形的进度条可能需要费点劲.我搜到的大多数方法都是用NGUI插件,但有时只是 ...
- 关于easyui combobox下拉框实现多选框的实现
好长时间没有更博了,一是因为最近真的比较忙,二是因为自己是真的偷懒了,哈哈 好啦,这篇博客主要是总结一些关于easyui combobox下拉框实现多选框的实现,包括前台界面的展示,和后台对数据的获取 ...
- 使用jQuery为文本框、单选框、多选框、下拉框、下拉多选框设值及返回值的处理
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- vue.js实现单选框、复选框和下拉框
Vue.js可以很方便的实现数据双向绑定,所以在处理表单,人机交互方面具有很大的优势.下边以单选框.复选框和下拉框为例介绍他们在HTML和Vue.js中的具体实现方式. 一.单选框 在传统的HTM ...
- html基本标签表单实现交互原理,单选框,复选框,下拉框介绍
表单是什么?表单是前端和服务器做交互的一种机制,表单收集用户输入信息,之后发送或者提交给服务器.用户在输入的信息称之为内容,内容的文本分为普通和密码型,用户通过单选框.复选框.下拉框(也就是下拉菜单) ...
- Selenium3自动化测试【28】单选框、复选框、下拉选择框
Html页面中的单选按钮.复选框.下拉框均可通过WebDriver实现操做.本节结合案例一起来看看WebDriver如何操做这些控件. 同步视频知识与系列知识内容,可关注:[公众号]:柒哥测试:[WX ...
- 下拉框——把一个select框中选中内容移到另一个select框中遇到的问题
在使用jQuery实现把一个select框中选中内容移到另一个select框中功能时遇到了一个问题,就是点击按钮时内容可以到另一个select框中,但是到了另一个select框中的内容却很快闪退回原来 ...
- jQuery对下拉框、单选框、多选框的处理
下拉框: //得到下拉菜单的选中项的文本(注意中间有空格) var cc1 = $(".formc select[@name='country'] option[@selected]&quo ...
随机推荐
- Java并发编程教程
Java是一种多线程编程语言,我们可以使用Java来开发多线程程序. 多线程程序包含两个或多个可同时运行的部分,每个部分可以同时处理不同的任务,从而能更好地利用可用资源,特别是当您的计算机有多个CPU ...
- 基于MFC的Media Player播放器的制作(2---导入第三方库和介绍第三方库)
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 这一节我们介绍如何导入类库,和介绍类库的一功能和介绍MFC的一些主要的模块部分.下面是如何导入类库.第一步我们选中 Media Playe ...
- PHP正则表达式中的反斜线
PHP反斜线再正则表达式中的使用 <?php $str = 'hello\world'; $pattern = '/hello\\\\world/'; preg_match($pattern,$ ...
- python基础之基础数据类型1
int 整形 数字用于计算和比较 python3没有long,python2有整形和长整型 十进制二进制转换方法 bin(10进制) ==二进制 0b(二进制) int("二进制" ...
- 【牛客网-剑指offer】斐波拉契数列
题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 知识点: 一列数:从1开始,前两项为1,从第三项开始每一项等于前两项之和 ...
- ie 图片拉伸
终于发现只要设置img为 height:auto,width:auto,就不会出现这种情况了 img { height: auto; width: auto; }
- 【leetcode】939. Minimum Area Rectangle
题目如下: Given a set of points in the xy-plane, determine the minimum area of a rectangle formed from t ...
- foreach循环的跳出
由于foreach循环中不像for循环可以直接通过return或break来终止当前循环,不过这里可以借助try...catch...来完成var arr = [1,2,3,4,5,6,7,8,9,1 ...
- php高版本安装ecshop错误解决方法
1.Strict Standards: Non-static method cls_image::gd_version() should not be called statically in F:\ ...
- redis-config.properties属性资源文件
redis.host=192.168.200.128redis.port=6379redis.pass=redis.database=0redis.maxIdle=300redis.maxWait=3 ...