如何在Unity中截图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Unity中截图相关的知识,希望对你有一定的参考价值。

参考技术A 据我所知,可以用下面的方法:
1 内置方法(简单有效,但是貌似不能够自定义存储路径等等):
Application.CaptureScreenshot ("Screenshot.png");
2 自己写一个方法读点(用的是类似流的思路还算比较灵活,但是存大图会卡,推荐图像类型慎重选择)

IEnumerator OnScreenCapture ()

yield return new WaitForEndOfFrame();//等待这一帧画完了才能截图
try

int width = Screen.width;
int height = Screen.height;
Texture2D tex = new Texture2D ( width, height, TextureFormat.RGB24, false);//新建一张图
tex.ReadPixels (new Rect (0, 0, width, height), 0, 0, true);//从屏幕开始读点
byte[] imagebytes = tex.EncodeToJPG ();//用的是JPG(这种比较小)
//使用它压缩实时产生的纹理,压缩过的纹理使用更少的显存并可以更快的被渲染
//通过true为highQuality参数将抖动压缩期间源纹理,这有助于减少压缩伪像
//因为压缩后的图像不作为纹理使用,只是一张用于展示的图
//但稍微慢一些这个小功能暂时貌似还用不到
tex.Compress (false);
tex.Apply();
Texture2D mScreenShotImgae = tex;
File.WriteAllBytes ( @"E:\Screenshot.png", imagebytes);


catch (System.Exception e)

Debug.Log ("ScreenCaptrueError:" + e);


本回答被提问者采纳

Unity摄像机画面制作全景图片|截图制作全景图

Unity摄像机画面制作全景图片

目录

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

效果展示

unity的场景

生成的图片

Unity编辑器中使用脚本部分

[MenuItem("生成图片/CreatPic")]
    public static void A()
    
        Camera cam = Camera.main;
		//可修改数值   new RenderTexture(4096, 4096, 32);
        RenderTexture cubemap = new RenderTexture(2048, 2048, 16);
        cubemap.dimension = TextureDimension.Cube;
        cam.RenderToCubemap(cubemap, 63, Camera.MonoOrStereoscopicEye.Mono);
		//可修改数值 new RenderTexture(4096, 4096, 32);
        RenderTexture equirect = new RenderTexture(1920, 1080, 8);
        cubemap.ConvertToEquirect(equirect, Camera.MonoOrStereoscopicEye.Mono);

        RenderTexture.active = equirect;
        Texture2D tex = new Texture2D(equirect.width, equirect.height, TextureFormat.ARGB32, false, true);
        tex.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0);
        RenderTexture.active = null;
        GL.Clear(true, true, Color.black);
        tex.Apply();
        byte[] bytes = tex.EncodeToTGA();
        CreateDirectroryOfFile(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop) + "\\\\全景图\\\\)");
        System.IO.File.WriteAllBytes(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop)
            + "\\\\全景图\\\\" + System.DateTime.Now.Ticks + ".tga", bytes);

    

    public static void CreateDirectroryOfFile(string filePath)
    
        Debug.Log($"CreateDirectrory filePath[folder_path],");
        if (!string.IsNullOrEmpty(filePath))
        
            string dir_name = Path.GetDirectoryName(filePath);
            if (!Directory.Exists(dir_name))
            
                Debug.Log($"No Exists dir_name[dir_name],");
                Directory.CreateDirectory(dir_name);
            
            else
            
                Debug.Log($"Exists dir_name[dir_name],");
            
        
    

Unity编辑器中使用方法

我们的脚本部分写完左上角的菜单栏中会出现生成图片四个字

打开这个选项我们可以看到CreatPic
然后我们点击后就可以执行完毕
会自动在我们的桌面创建文件夹然后把图片存储进去

Unity动态存储图片脚本部分

 Camera cam;
    RenderTexture cubemap;
    RenderTexture equirect;
    [Header("生成次数  true为连续生成")][SerializeField] private bool ison;
    void Start()
    
        cam = Camera.main;
        cubemap = new RenderTexture(4096, 4096, 32);
        cubemap.dimension = TextureDimension.Cube;
        equirect = new RenderTexture(4096, 2048, 32);
        StartCoroutine(B());
    

    // Update is called once per frame
    void Update()
    
        if (ison)
        
            StartCoroutine(B());
        
    

    IEnumerator B()
    
        if (ison)
        
            while (true)
            
                Creat();
                yield return new WaitForSecondsRealtime(0.04F);
            
        
        else
        
            Creat();
        


        yield return null;
    


    public void Creat()
    
        cam.RenderToCubemap(cubemap, 63, Camera.MonoOrStereoscopicEye.Mono);
        cubemap.ConvertToEquirect(equirect, Camera.MonoOrStereoscopicEye.Mono);
        RenderTexture.active = equirect;
        Texture2D tex = new Texture2D(equirect.width, equirect.height, TextureFormat.ARGB32, false, true);
        tex.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0);
        RenderTexture.active = null;
        GL.Clear(true, true, Color.black);
        tex.Apply();
        byte[] bytes = tex.EncodeToTGA();
        CreateDirectroryOfFile(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop) + "\\\\全景图\\\\)");

        System.IO.File.WriteAllBytes(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop)
            + "\\\\全景图\\\\" + System.DateTime.Now.Ticks + ".tga", bytes);
    
    public static void CreateDirectroryOfFile(string filePath)
    
        Debug.Log($"CreateDirectrory filePath[folder_path],");
        if (!string.IsNullOrEmpty(filePath))
        
            string dir_name = Path.GetDirectoryName(filePath);
            if (!Directory.Exists(dir_name))
            
                Debug.Log($"No Exists dir_name[dir_name],");
                Directory.CreateDirectory(dir_name);
            
            else
            
                Debug.Log($"Exists dir_name[dir_name],");
            
        
    

Unity动态存储图片使用方法

动态存储的方法 很简单 随便放置一个空物体然后把我们的脚本放置上去就可以了

其中注意我们的脚本上会有一个bool值 此值的作用为True的时候会连续存储图片

以上是关于如何在Unity中截图的主要内容,如果未能解决你的问题,请参考以下文章

如何在编辑器中为 Unity 中的旋转平台脚本添加列表

如何创建透明 Unity 窗口 + OS 的屏幕截图

Unity抓取相机截图/抓取屏幕截图

检测用户何时在 Unity 中截屏

Unity摄像机画面制作全景图片|截图制作全景图

unity 导入android apk没成功,下面有截图,这个该怎么处理?