unity 框选自由截屏

先上图看一下,第一张是截出来的图,第二张,运行图。


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

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

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全透明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity是一个跨平台的游戏开发引擎,提供了丰富的功能和工具,其中包括了任意框选截图的功能。 在Unity中,我们可以通过编写脚本来实现任意框选截图。首先,我们需要创建一个脚本,命名为ScreenshotScript,然后将其添加到一个主摄像机或者具有Render Texture的游戏对象上。 在脚本中,我们首先需要定义一个用于存储截图位置和大小的矩形变量,命名为screenshotRect。在Update函数中,我们可以通过鼠标点击和拖拽的方式来改变这个矩形的位置和大小。可以通过Input.mousePosition来获取鼠标位置,并通过鼠标按下和抬起的事件来确定截图开始和结束的位置。 一旦我们确定了截图位置和大小,我们就可以使用屏幕截图函数ScreenCapture.CaptureScreenshot进行截图。该函数将当前帧的渲染结果保存为一张图片,并且可以指定保存路径和文件名。在我们的例子中,我们可以使用Application.dataPath + "/Screenshots/screenshot.png"作为保存路径。 最后,我们还可以在截图完成后,使用一些特效来优化或增强图片。例如可以使用Texture2D.LoadImage将截图加载为一个Texture2D对象,然后使用Texture2D的一些函数调整图片的亮度、对比度、模糊度等效果。 总而言之,Unity提供了任意框选截图的功能,我们可以利用脚本来实现这一功能。通过定义矩形变量来确定截图位置和大小,然后使用ScreenCapture.CaptureScreenshot函数进行截图,并可以对截图进行后期处理。这样,我们就可以在游戏开发中方便、灵活地实现任意框选截图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值