zoukankan      html  css  js  c++  java
  • Unity3D中使用GL画拉选框(绘制多选框)

    问题分析:

    需要根据鼠标事件,摁下鼠标开始绘制选择框,抬起鼠标结束绘制。

    实现思路:

    该需求是屏幕画线,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表示起点和终点

     代码:

      1     /// <summary>
      2     /// 绘制选择框
      3     /// </summary>
      4     class Selectbox : MonoBehaviour
      5     {
      6         #region Fields & Attribute
      7 
      8         //画笔颜色
      9         private Color brushColor=Color.white;
     10 
     11         //画线的材质
     12         private Material drawMaterial;
     13 
     14         //开始绘制标志
     15         private bool isStartDraw=false;
     16 
     17         //开始和结束绘制点
     18         private Vector3 mouseStartPos, mouseEndPos;
     19 
     20         //设置选择区域的Color
     21         private Color selectionAreaColor = Color.green;
     22 
     23         //获取绘制状态(开始绘制标志)
     24         public bool IsStartDraw { get => isStartDraw; set => isStartDraw = value; }
     25 
     26         //绘制开始坐标
     27         public Vector3 MouseStartPos { get => mouseStartPos; set => mouseStartPos = value; }
     28 
     29         //绘制结束坐标
     30         public Vector3 MouseEndPos { get => mouseEndPos; set => mouseEndPos = value; }
     31 
     32         //设置画笔颜色
     33         public Color BrushColor { get => brushColor; set => brushColor = value; }
     34 
     35         //设置选择区域的Color
     36         public Color SelectionAreaColor { get => selectionAreaColor; set => selectionAreaColor = value; }
     37  
     38         #endregion
     39 
     40         #region Public Methods
     41 
     42         /// <summary>
     43         /// 绘制选择框构造函数
     44         /// </summary>
     45         public Selectbox()
     46         {
     47 
     48         }
     49 
     50         /// <summary>
     51         /// 初始化
     52         /// </summary>
     53         public void Awake()
     54         {
     55             drawMaterial = new Material(Shader.Find("UI/Default"));
     56             this.drawMaterial.hideFlags = HideFlags.HideAndDontSave;
     57             this.drawMaterial.shader.hideFlags = HideFlags.HideAndDontSave;
     58         }
     59 
     60         #endregion
     61 
     62         #region Private Methods
     63 
     64         /// <summary>
     65         /// 绘制逻辑
     66         /// </summary>
     67         private void OnGUI()
     68         {
     69             if (IsStartDraw)
     70             {
    //材质通道,0为默认。
    71 drawMaterial.SetPass(0); 72 GL.LoadOrtho(); 73 //设置用屏幕坐标绘图 74 GL.LoadPixelMatrix(); 75 DrawRect(); 76 DrawRectLine(); 77 } 78 } 79 80 /// <summary> 81 /// 绘制框选区 82 /// </summary> 83 private void DrawRect() 84 { 85 GL.Begin(GL.QUADS); 86 //设置颜色和透明度 87 GL.Color(selectionAreaColor); 88 if ((MouseStartPos.x > MouseEndPos.x && MouseStartPos.y > MouseEndPos.y) || (MouseStartPos.x < MouseEndPos.x && MouseStartPos.y < MouseEndPos.y)) 89 { 90 GL.Vertex3(MouseStartPos.x, MouseStartPos.y, 0); 91 GL.Vertex3(MouseStartPos.x, MouseEndPos.y, 0); 92 GL.Vertex3(MouseEndPos.x, MouseEndPos.y, 0); 93 GL.Vertex3(MouseEndPos.x, MouseStartPos.y, 0); 94 95 } 96 else 97 { 98 GL.Vertex3(MouseStartPos.x, MouseStartPos.y, 0); 99 GL.Vertex3(MouseEndPos.x, MouseStartPos.y, 0); 100 GL.Vertex3(MouseEndPos.x, MouseEndPos.y, 0); 101 GL.Vertex3(MouseStartPos.x, MouseEndPos.y, 0); 102 } 103 GL.End(); 104 } 105 106 /// <summary> 107 /// 绘制框选边框 108 /// </summary> 109 private void DrawRectLine() 110 { 111 GL.Begin(GL.LINES); 112 //设置方框的边框颜色 边框不透明 113 GL.Color(BrushColor); 114 GL.Vertex3(MouseStartPos.x, MouseStartPos.y, 0); 115 GL.Vertex3(MouseEndPos.x, MouseStartPos.y, 0); 116 GL.Vertex3(MouseEndPos.x, MouseStartPos.y, 0); 117 GL.Vertex3(MouseEndPos.x, MouseEndPos.y, 0); 118 GL.Vertex3(MouseEndPos.x, MouseEndPos.y, 0); 119 GL.Vertex3(MouseStartPos.x, MouseEndPos.y, 0); 120 GL.Vertex3(MouseStartPos.x, MouseEndPos.y, 0); 121 GL.Vertex3(MouseStartPos.x, MouseStartPos.y, 0); 122 GL.End(); 123 } 124 125 #endregion 126 }

    这个地方,在画面时,发现只有两个象限是正常的,其他两个象限都画不出来,原来是一三和二四象限中构建面(点)的顺序不同,相反。还有shader选默认的就好,有颜色即可。

     即这段。

    到这完成了就,欢迎指正。

  • 相关阅读:
    Android之TabHost使用(引用SDK例子文档)
    Android之在线词典
    校验插入指定结点是否导致编码循环的示例函数
    查表法按日期生成流水号的示例.sql
    备份数据库并提供下载的asp文件
    Metro风格XAML应用程序性能技巧
    导入文本文件时如何指定字段类型.sql
    宝塔形数据的处理.sql
    将某个目录上的Excel表,导入到数据库中.sql
    Using SqlDataReader’s new async methods in .Net 4.5 Beta
  • 原文地址:https://www.cnblogs.com/answer-yj/p/11578938.html
Copyright © 2011-2022 走看看