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 ...
随机推荐
- 巧妙的使用jmeter来发送json格式数据
1. header-manager 修改content-type值. 如果不修改该值, 则默认会是urlencode的数据格式(例如a=5&b=6). 修改为json后,会告诉服务器,发送的数 ...
- 使用mybatis进行一对多嵌套查询时出错:输出结果:Country{id=2, name='美国', minister=[null]}
即Minister类作为Country类的关联属性. 查询的输出结果是:Country{id=2, name='美国', minister=[null]} <!--mapper.xml内容--& ...
- zookeeper的监听
统一配置管理.统一命名服务.分布式锁.集群管理
- PHP 工厂模式浅析
//抽象出一个人的接口interface Person{ public function showInfo();}//继承于人的学生类class Student implements Person{ ...
- OpenCV学习笔记 笔记汇总
转载来源:https://www.cnblogs.com/tonyc/p/6407318.html 今后开始学习OpenCV 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址:http ...
- c# 通过地址下载流然后保存文件到本地
1.下载文件并保存文件到本地 private void GetFileFromNetUrl(string url) { try { System.Net.WebRequest req = System ...
- rest_framework框架实现之(认证)
一认证 我们可以想想,我们要访问一个页面,需不需要对其进行认证,希望进入页面的时候看到哪些内容,一般是根据用户的不同而不同 首先,我们先设计一个表,如何知道对方通过了验证,我们可以考虑给其加一个tok ...
- git上传本地项目带Github上
创建好线上版本库以后就可以在本地进行上传 1.选择好文件夹右击Git Bash Here 2.先创建本地版本库 git init 3.git add README.md 4.git commit -m ...
- Windows win32 API 类库 硬件
// 硬件 Win32_Processor, // CPU 处理器 Win32_PhysicalMemory, // 物理内存条 Win32_Keyboard, // 键盘 Win32_Pointin ...
- Dart编程实例 - 第一个Dart程序
Dart编程实例 - 第一个Dart程序 main() { print("Hello World!"); } 本文转自:http://codingdict.com/article/ ...