unity之截屏功能

Wesley13
• 阅读 911
1.全屏截图

  方法一:在unity的API中,unity给我们提供了一个现成的API  :  Application.CaptureScreenshot(imagename)。

但是这个API虽然简单,在PC、mac运用没有多大的影响,但是如果是在移动平台上使用的话就显得相当的吃力,因为它会消耗我们很大的CUP,所以在移动端使用它截屏的时候会发现很长一段的卡顿现象。但是不得不说使用起来非常的方便,但是在我们使用这个API截图后的截图在不同的平台它的存放路径是有差别的。

下面是各个平台的截图存放路径:   

unity之截屏功能 unity之截屏功能

 Application.CaptureScreenshot(screencapture.png)

            if(Application.platform==RuntimePlatform.Android || Application.platform==RuntimePlatform.IPhonePlayer)  

                 imagePath=Application.persistentDataPath;  

            else if(Application.platform==RuntimePlatform.WindowsPlayer)  

                 imagePath=Application.dataPath;  

           else if(Application.platform==RuntimePlatform.WindowsEditor)

            {  

                 imagePath=Application.dataPath;  

                 imagePath= imagePath.Replace("/Assets",null);  

             }   

            imagePath = imagePath + "/screencapture.png";

Screenshot

        方法二:如果你想要你的游戏中显示你截图的缩略图,那么这种方法不是一个好方法,因为你要用 WWW去加载你刚才的截图,这会消耗你一部分的时间。   

点击鼠标左键,实现截图,并且将所截图片保存到本地Assets目录下的StreamingAssets文件夹下面。 

unity之截屏功能 unity之截屏功能

using UnityEngine;
using System.Collections;

public class TakeScreenShot : MonoBehaviour 
{
    void Update () 
    {
        //点击鼠标左键
        if (Input.GetMouseButtonDown (0)) 
        {
            //开启协程方法
            StartCoroutine (MyCaptureScreen ());
        }
    }
    //我的截屏方法
    IEnumerator MyCaptureScreen()
    {
        //等待所有的摄像机和GUI被渲染完成。
        yield return new WaitForEndOfFrame ();
        //创建一个空纹理(图片大小为屏幕的宽高)
        Texture2D tex = new Texture2D (Screen.width,Screen.height);
        //只能在帧渲染完毕之后调用(从屏幕左下角开始绘制,绘制大小为屏幕的宽高,宽高的偏移量都为0)
        tex.ReadPixels (new Rect (0,0,Screen.width,Screen.height),0,0);
        //图片应用(此时图片已经绘制完成)
        tex.Apply ();
        //将图片装换成jpg的二进制格式,保存在byte数组中(计算机是以二进制的方式存储数据)
        byte[] result = tex.EncodeToJPG ();
        //文件保存,创建一个新文件,在其中写入指定的字节数组(要写入的文件的路径,要写入文件的字节。)
        System.IO.File.WriteAllBytes (Application.streamingAssetsPath+"/1.JPG",result);
    }
}

TakeScreenShot

2截取自己想要的部分

unity之截屏功能 unity之截屏功能

using UnityEngine;
using System.Collections;
using System.IO;//引入IO流
public class NewBehaviourScript : MonoBehaviour 
{
    //定义一个存储截屏图片的路径
    string filePath;
    void Start () 
    {
        //图片存储在StreamingAssets文件夹内。
        filePath = Application.streamingAssetsPath + "/1.png";
    }
    Rect rect;
    //截屏开始的位置
    Vector3 s_pos;
    //截屏结束的位置
    Vector3 e_pos;
    //是否绘制
    bool isDraw;
    void  Update()
    {
        //按下鼠标左键时,记录当前鼠标的位置为开始截屏时的位置
        if(Input.GetMouseButtonDown(0))
        {
            s_pos = Input.mousePosition;
        }
        //鼠标处于按下状态时
        if(Input.GetMouseButton(0))
        {
            e_pos = Input.mousePosition;
             //可以开始绘制
            isDraw = true;
        }
        //抬起鼠标左键时,记录当前鼠标的位置为结束截屏时的位置
        if(Input.GetMouseButtonUp(0))
        {
            //结束绘制
            isDraw = false;
            e_pos = Input.mousePosition;
            //获取到截屏框起始点的位置,和宽高。
            rect = new Rect(Mathf.Min(s_pos.x,e_pos.x),Mathf.Min(s_pos.y,e_pos.y),Mathf.Abs(s_pos.x-e_pos.x),Mathf.Abs(s_pos.y - e_pos.y));
            //开启绘制的协程方法
            StartCoroutine(Capsture(filePath, rect));
        }
     }
    IEnumerator Capsture(string filePath, Rect rect)
    {
        yield return new WaitForEndOfFrame();
        //创建纹理(纹理贴图的大小和截屏的大小相同)
        Texture2D tex = new Texture2D((int)rect.width, (int)rect.height);
        //读取像素点
        tex.ReadPixels(rect, 0, 0) ;
        //将像素点应用到纹理上,绘制图片
        tex.Apply();
        //将图片装换成jpg的二进制格式,保存在byte数组中(计算机是以二进制的方式存储数据)
        byte[] result =tex.EncodeToPNG();
        //文件夹(如果StreamAssets文件夹不存在,在Assets文件下创建该文件夹)
        if(!Directory.Exists(Application.streamingAssetsPath))
        {
             Directory.CreateDirectory(Application.streamingAssetsPath);
        }
        //将截屏图片存储到本地
        File.WriteAllBytes(filePath, result);
    }
    //在这里要用GL实现绘制截屏的矩形框
    //1.GL的回调函数
    //2.定义一个材质Material
    public Material lineMaterial;

    void OnPostRender() 
    {
        if(!isDraw) return;
        print (s_pos);

        Vector3 sPos = Camera.main.ScreenToWorldPoint(s_pos + new Vector3(0, 0, 10));
        Vector3 ePos = Camera.main.ScreenToWorldPoint(e_pos + new Vector3(0, 0, 10));

        print(string.Format("GL.....{0},  {1}", sPos, ePos));
        // Set your materials Done
        GL.PushMatrix();
        // yourMaterial.SetPass( );
        lineMaterial.SetPass(0);//告诉GL使用该材质绘制
        // Draw your stuff
        //始终在最前面绘制
        GL.invertCulling = true;
        GL.Begin(GL.LINES);//开始绘制

        //GL.Vertex(sPos);
        //GL.Vertex(ePos);
        //如果想要绘制,矩形,将下面代码启动
        GL.Vertex(sPos);
        GL.Vertex(new Vector3(ePos.x, sPos.y, 0));


        GL.Vertex(new Vector3(ePos.x, sPos.y, 0));
        GL.Vertex(ePos);

        GL.Vertex(ePos);
        GL.Vertex(new Vector3(sPos.x, ePos.y, 0));

        GL.Vertex(new Vector3(sPos.x, ePos.y, 0));
        GL.Vertex(sPos);
        GL.End();//结束绘制

        GL.PopMatrix();
    }
}

NewBehaviourScript

 点击查看原文

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
unity将 -u4E00 这种 编码 转汉字 方法
 unity中直接使用 JsonMapper.ToJson(对象),取到的字符串,里面汉字可能是\\u4E00类似这种其实也不用转,服务器会通过类似fastjson发序列化的方式,将json转对象,获取对象的值就是中文但是有时服务器要求将传参中字符串中类似\\u4E00这种转汉字,就需要下面 publ
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这