unity 框选自由截屏
2014-12-02 14:39
666 查看
先上图看一下,第一张是截出来的图,第二张,运行图。
借鉴别人代码,组合而成的。。。
废话不说了,代码中的注释还算详细
这段去掉,或者GL.Color( new Color(rColor.r,rColor.g,rColor.b,0.1f) );
的值改成0全透明
借鉴别人代码,组合而成的。。。
废话不说了,代码中的注释还算详细
using UnityEngine; using System.Collections; using System.IO; public class draw : MonoBehaviour { public Color rColor = Color.green; private Vector3 start = Vector3.zero; private Vector3 end = Vector3.zero; private Material rMat = null; private bool drawFlag = false; private Rect rect; private Texture2D cutImage; // Use this for initialization void Start () { rMat = 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 }" + "} } }" );//生成画线的材质 rMat.hideFlags = HideFlags.HideAndDontSave; rMat.shader.hideFlags = HideFlags.HideAndDontSave; } // Update is called once per frame void Update () { if(Input.GetMouseButtonDown(0)){ drawFlag = true;//如果鼠标左键按下 设置开始画线标志 start = Input.mousePosition;//记录按下位置 end = Input.mousePosition;//鼠标当前位置 }else if (Input.GetMouseButtonUp(0)){ drawFlag = false;//如果鼠标左键放开 结束画线 } if (Input.GetKeyDown (KeyCode.P)) { StartCoroutine(CutImage()); } } //绘制框选 void OnPostRender() {//画线这种操作推荐在OnPostRender()里进行 而不是直接放在Update,所以需要标志来开启 if(drawFlag){ end = Input.mousePosition;//鼠标当前位置 } GL.PushMatrix();//保存摄像机变换矩阵 if (! rMat) return; rMat.SetPass( 0 ); GL.LoadPixelMatrix();//设置用屏幕坐标绘图 GL.Begin(GL.QUADS); GL.Color( new Color(rColor.r,rColor.g,rColor.b,0.1f) );//设置颜色和透明度,方框内部透明 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(rColor);//设置方框的边框颜色 边框不透明 GL.Vertex3( start.x,start.y,0); GL.Vertex3( end.x,start.y,0); GL.Vertex3( end.x,start.y,0); GL.Vertex3( end.x,end.y,0 ); GL.Vertex3( end.x,end.y,0 ); GL.Vertex3( start.x,end.y,0 ); GL.Vertex3( start.x,end.y,0 ); GL.Vertex3(start.x,start.y,0); GL.End(); GL.PopMatrix();//恢复摄像机投影矩阵 } IEnumerator CutImage() { string date = System.DateTime.Now.ToString("yyyyMMddHHmmss"); //图片大小 cutImage = new Texture2D((int)(end.x - start.x), (int)(start.y - end.y), TextureFormat.RGB24, true); //坐标左下角为0 rect = new Rect((int)start.x, Screen.height - (int)(Screen.height - end.y), (int)(end.x - start.x), (int)(start.y - end.y)); yield return new WaitForEndOfFrame(); cutImage.ReadPixels(rect, 0, 0, true); cutImage.Apply(); yield return cutImage; byte[] byt = cutImage.EncodeToPNG(); //保存截图 File.WriteAllBytes(Application.streamingAssetsPath + "/CutImage" +date + ".png", byt); } }需要说明一下的是,框选的时候填充的有颜色,这样截图的时候,填充的颜色也带进去了。可以把
<span style="white-space:pre"> </span>GL.LoadPixelMatrix();//设置用屏幕坐标绘图 GL.Begin(GL.QUADS); GL.Color( new Color(rColor.r,rColor.g,rColor.b,0.1f) );//设置颜色和透明度,方框内部透明 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.Color( new Color(rColor.r,rColor.g,rColor.b,0.1f) );
的值改成0全透明
相关文章推荐
- unity 框选自由截屏
- Unity中三种截屏方法
- Unity 相机 2D视角 与3D 视角 自由动态 切换
- unity 针对相机视角截屏并保存
- unity 针对UGUI控件截屏
- Unity使用RenderTexture进行截屏
- unity一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
- unity中截屏的第三种方法
- Unity截屏,Raycast射线,绕某条边旋转
- Unity鼠标自由查看3D物体之直接旋转物体
- Unity中通过纹理截屏将图片保存到本地
- unity shader 实现自由放大缩小效果
- Unity中三种截屏方法
- unity之截屏方法
- [Unity实战]框选效果
- unity 截屏并保存
- Unity 鼠标事件 GUI GUILayerOut Input Application(截屏,getMouseDown,getKeyCode) 射线
- 用unity来写 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
- Unity 获取截屏 并且呼起微信分享
- Unity 框选效果