找回密码
 立即注册
搜索
EasyAR 教程 Unity 查看内容

EasyAR 开发技巧----截屏

AlbertLee 2017-9-5 15:29

EasyAR 开发中常用的截屏功能

截屏操作也是开发AR APP 常用的一个功能,与录屏功能一样,都是保留我们看到的精彩的AR瞬间以便于分享到朋友圈。这篇文章主要介绍3种常见的截屏方法供大家参考。

Step 1:开发准备

在 HelloAR 这个项目的基础上进行开发,我们在官网上下载unity的HelloAR案例导入unity中。


打开HelloAR scene,填写好Key,然后我们布局UI,我们还用上次录屏功能的那张图片。布局框架如图:


我们建立一个空的"GameObject" ,整个布局如下图:


Step 2:第一种截屏方法

我们在新建的"GameObject" 下面新建一个脚本"GameCon".对于第一种实现截屏功能,我们使用unity 最传统也是最简单的方法:CaptureScreenshot()

    public void Capture()
    {
        Application.CaptureScreenshot ("ScreenShot.png",0);
    }


将该方法与Button 绑定,点击按钮后,将应用画面保存下来,图片名字为“ScreenShot.png”。它会直接保存在我们项目的文件夹里,电脑上可以轻松查看到,在移动端上(比如Android 平台),保存路径是:/sdcard/Android/data/你的app打包信息比如我的就是/sdcard/Android/data/com.mars.jieping:在files文件夹下就可以找到保存的图片,当然你也可以自定义保存路径。

PS:知道图片的路径特别重要,尤其是对后续分享功能的实现。



这种方法实现起来特别简单,仅仅一行代码就可以解决,但它的缺点也够明显,它默认的是全屏截屏,也就是你的UI层也会被保存下来,用户体验不是很好。

Step 3:截屏插件

第二种方法我们使用一种截屏插件:GalleryScreenshot这是一款流行的截屏插件,尤其是Android /ios 平台上的集成截屏功能特别友好,好多AR开发上都会用到它。


链接: https://pan.baidu.com/s/1mih0SQW 密码: 1csb

下载好后,导入到unity中.我们发现这里面最重要的脚本是"GalleryScreenshotExample.cs"。它是实现截屏的关键,原始脚本是通过OnGUI来实现的,我们简单修改下,让截屏的方法与我们的Button 绑定。


public void Capture()
    {
        StartCoroutine (ScreenshotManager.Save ("MyScreenshot""MyApp"true));
    }

在移动端测试后,会发现它会直接将我们的图片保存到相册里,非常方便,但缺点仍是全屏截图。


Step 4:较完美的截屏方法

前两种方法虽然代码实现比较简单,但是体验不会太好,第三种是一种比较好的截屏解决方案,将UI的camera 层提取出来,这样就可以保存我们ARCamera 所“看到的画面”。

我们在前面的那个脚本"GameCon" 继续实现。新建一个方法:
void CaptureCamera(Camera camera, Rect rect) 
    {
        
        RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);

        camera.targetTexture = rt;
        camera.Render();

        RenderTexture.active = rt;
        Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24,false);
        screenShot.ReadPixels(rect, 00);
        screenShot.Apply();

        camera.targetTexture = null;

        RenderTexture.active = null
        GameObject.Destroy(rt);
        byte[] bytes = screenShot.EncodeToPNG();
        string filename = Application.dataPath + "/Screenshot.png";
        System.IO.File.WriteAllBytes(filename, bytes);
    }

需要传入两个参数:
1.需要截屏的那个camera 层

2.屏幕大小

首先我们在开头定义一个Camera:
public Camera camera;

我们再建一个方法调用:

public void Capture2()
    {
        CaptureCamera (camera,new RectScreen.width*0fScreen.height*0fScreen.width*1fScreen.height*1f));

    }

然后在unity里将我们的ARCamera 赋值:


测试后,会发现我们的UI界面不见了,这样的体验是最好的。当然,截屏的方法不止这些,大家有什么好的解决方案可以在评论区留言!

我们用EasyAR 实现了在AR开发中最常见的两个功能:


因此在后续的技术分享中我们将实现Share (分享到社交平台)的功能。

鲜花
鲜花 (1)
握手
握手
雷人
雷人
路过
路过
鸡蛋
鸡蛋

刚表态过的朋友 (1 人)

分享至 : QQ空间
收藏
  • sky10086 2017-10-13 14:33
    第三种,放到手机里没反映啊老大。。。不知道截没截图成功,翻了相册是没有额
  • AlbertLee 2017-9-12 10:02
    magic1666: 第三种截屏后找不到图片  不知道是不是没截屏  还有分享的教程什么时候出啊
    没图片???在程序的文件夹中也没找到吗?  关于分享的教程很快就会出啦。
  • magic1666 2017-9-12 09:41
    第三种截屏后找不到图片  不知道是不是没截屏  还有分享的教程什么时候出啊
  • AlbertLee 2017-9-8 09:41
    kun0830: 文中的网盘链接又失效了
    谢谢反馈,已经更新了链接
  • kun0830 2017-9-7 21:08
    文中的网盘链接又失效了
  • kun0830 2017-9-7 16:50
    我在安卓平板使用easyar时会出现不清晰的问题,是不是哪里可以设置分辨率,请问有什么解决办法吗?

查看全部评论>>