您的位置:首页 > 移动开发 > Unity3D

unity 框选自由截屏

2014-12-02 14:39 666 查看
先上图看一下,第一张是截出来的图,第二张,运行图。





借鉴别人代码,组合而成的。。。

废话不说了,代码中的注释还算详细

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全透明
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息