您好,欢迎来到Unity之家!   unity.jb51.net 
  • 首 页
  • 你问我答
  • 当前位置:首页 > 程序开发 > 代码编程 >
    使用Unity在屏幕上话一个框
    时间:2015-05-13 10:31 来源:Unity之家 作者:unity.jb51.net 浏览:收藏 挑错 推荐 打印


    Unity3D使用的图形引擎是DirectX,OpenGL和自带的APi(Wii)

    我们这里使用OpenGL的渲染方式


    使用Unity在屏幕上话一个框


    代码:

    (使用过OpenGl的应该相对容易理解

    另外:代码中使用Shader是因为矩形框中部的透明部分需要)

    using UnityEngine;
    using System.Collections;
    
    public class DrawRect : MonoBehaviour {
    
        private Vector2 mMouseStart, mMouseEnd;
        private bool mBDrawMouseRect;
    
        private Material rectMat = null;//画线的材质 不设定系统会用当前材质画线 结果不可控
    
        void Start()
        {
    
            mBDrawMouseRect = false;
    
            rectMat = new Material("Shader \"Lines/Colored Blended\" {" +
                "SubShader { Pass { " +
                "    Blend SrcAlpha OneMinusSrcAlpha " +
                "    ZWrite Off Cull Off Fog { Mode Off } " +
                "    BindChannels {" +
                "      Bind \"vertex\", vertex Bind \"color\", color }" +
                "} } }");//生成画线的材质
            rectMat.hideFlags = HideFlags.HideAndDontSave;
            rectMat.shader.hideFlags = HideFlags.HideAndDontSave;
        }
    
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            //按下鼠标左键
            {
                Vector3 mousePosition = Input.mousePosition;
                mMouseStart = new Vector2(mousePosition.x, mousePosition.y);
            }
    
            if (Input.GetMouseButton(0))
            //持续按下鼠标左键
            {
                mBDrawMouseRect = true;
                Vector3 mousePosition = Input.mousePosition;
                mMouseEnd = new Vector2(mousePosition.x, mousePosition.y);
            }
    
            if (Input.GetMouseButtonUp(0))
            {
                mBDrawMouseRect = false;
            }
        }
    
        void OnGUI()
        {
            if (mBDrawMouseRect)
                Draw(mMouseStart, mMouseEnd);
        }
    
        //渲染2D框
        void Draw(Vector2 start, Vector2 end)
        {
            rectMat.SetPass(0);
    
            GL.PushMatrix();//保存摄像机变换矩阵
    
            Color clr = Color.green;
            clr.a = 0.1f;
    
            GL.LoadPixelMatrix();//设置用屏幕坐标绘图
            //透明框
            GL.Begin(GL.QUADS);
            GL.Color(clr);
            GL.Vertex3(start.x, start.y, 0);
            GL.Vertex3(end.x, start.y, 0);
            GL.Vertex3(end.x, end.y, 0);
            GL.Vertex3(start.x, end.y, 0);
            GL.End();
    
            //线
            //上
            GL.Begin(GL.LINES);
            GL.Color(Color.green);
            GL.Vertex3(start.x, start.y, 0);
            GL.Vertex3(end.x, start.y, 0);
            GL.End();
    
            //下
            GL.Begin(GL.LINES);
            GL.Color(Color.green);
            GL.Vertex3(start.x, end.y, 0);
            GL.Vertex3(end.x, end.y, 0);
            GL.End();
    
            //左
            GL.Begin(GL.LINES);
            GL.Color(Color.green);
            GL.Vertex3(start.x, start.y, 0);
            GL.Vertex3(start.x, end.y, 0);
            GL.End();
    
            //右
            GL.Begin(GL.LINES);
            GL.Color(Color.green);
            GL.Vertex3(end.x, start.y, 0);
            GL.Vertex3(end.x, end.y, 0);
            GL.End();
    
            GL.PopMatrix();//还原
        }
    }


    (责任编辑:脚印)
    免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。
    标签:Unity之家