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 ...
随机推荐
- Django框架(十四)—— Django分页组件
目录 Django分页组件 一.分页器 二.分页器的使用 三.案例 1.模板层 2.视图层 Django分页组件 一.分页器 数据量大的话,可以分页获取,查看 例如:图书管理中,如果有成千上万本书,要 ...
- shell编程:字符串练习题string.sh
string.sh脚本 #!/bin/bash # string="Bigdata process framework is Hadoop,Hadoop is an open source ...
- linux/unix下setuid/seteuid/setreuid/setresuid
其中setresuid()具有最清晰的语法: setresuid()被执行的条件有: ①当前进程的euid是root ②三个参数,每一个等于原来某个id中的一个 如果满足以上条件的任意一个,setre ...
- LLppdd has a dream!
LLppdd has a dream Time Limit: 3 s Memory Limit: 256 MB 题目背景 LLppdd经过他充满坎坷的初三后,他的成绩也充满了坎坷. 临近中考了,他希望 ...
- kernel: possible SYN flooding on port 80. Sending cookies
1. sysctl -w net.ipv4.tcp_syncookies=1 #启用使用syncookiessysctl -w net.ipv4.tcp_synack_retries=1 #降低syn ...
- #ifdef 宏定义一个main编译客户端服务端2套代码
#include <iostream> using namespace std; #include "ProWrapper.h" #include "Serv ...
- 【BZOJ5093】图的价值
题面 Description "简单无向图"是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简 ...
- 设置overflow:auto无效的解决办法
做项目中经常要用到滚动条,有时候给div设置overflow无效. 遇到这样的问题,只需要在 F12 Elements面板检查一下要设置overflow的元素的宽高是否大于父级元素宽高. (overf ...
- 编码格式分类: 前后端传递数据的编码格式contentType
urlencoded:form表单和ajax提交数据的默认编码格式 form-data:传文件 application/json:json格式数据 >>> 前后端分离 urlenco ...
- 八年技术加持,性能提升10倍,阿里云HBase 2.0首发商用
摘要: 早在2010年开始,阿里巴巴集团开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储,HBase在几代阿里专家的不懈努力下,已经表现得运行更稳定.性能更高效 ...