[Unity3D]使用Unity在屏幕上话一个框

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

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

[Unity3D]使用Unity在屏幕上话一个框_第1张图片


代码:

(使用过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();//还原
    }
}


你可能感兴趣的:(unity3d,画框)