小功能⭐️Unity截屏功能的实现

简介: 小功能⭐️Unity截屏功能的实现

以下笔者整理了Unity的3种截屏功能,分享给大家:

  • 截全屏
  • 屏幕指定范围截屏
  • 指定相机截屏

🟥 截全屏

使用方法:

将下方脚本挂载到物体上,Skode_StartCapture为截图方法。action_End 委托方法为截图完后执行。

using UnityEngine;
using System.Collections;
using System.IO;
using System;
 
public class Skode_ScreenCapture_Full : MonoBehaviour
{
    [Tooltip("是否启用截图后将图片保存到下面路径的功能")]
    public bool saveUseable = false;
 
    [Tooltip("存储路径")]
    public string savePath = "/sdcard/Skode";
 
    public GameObject[] shouldHideObj;
 
    /// <summary>
    /// 截图后的sprite
    /// </summary>
    [HideInInspector]
    public Sprite sprite;
 
    public void Skode_StartCapture(Action action_End = null)
    {
        CaptureStart();
        StartCoroutine(OnScreenShot(action_End));
    }
 
    public IEnumerator OnScreenShot(Action action_End = null)
    {
        //命名图片  202002261416527077
        string currentTime = string.Format("{0:yyyyMMddHHmmssffff}", DateTime.Now);
 
        //截屏
        Texture2D texture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
        yield return new WaitForEndOfFrame();
        texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
        texture.Apply();
 
        sprite = Sprite.Create(texture,
            new Rect(0, 0, texture.width, texture.height),
            new Vector2(0.5f, 0.5f));
 
        if (saveUseable)
        {
            byte[] bytes = texture.EncodeToPNG();
 
            //若没路径 创建
            if (!Directory.Exists((savePath)))
            {
                Directory.CreateDirectory(savePath);
            }
            //保存路径
            string path_save = savePath + "/IMG_" + currentTime;
            //写入图片
            File.WriteAllBytes(path_save, bytes);
        }
 
        CaptureOver();
        action_End?.Invoke();
    }
 
    void CaptureStart()
    {
        if (shouldHideObj.Length > 0)
        {
            for (int i = 0; i < shouldHideObj.Length; i++)
            {
                shouldHideObj[i].SetActive(false);
            }
        }
    }
 
    void CaptureOver()
    {
        if (shouldHideObj.Length > 0)
        {
            for (int i = 0; i < shouldHideObj.Length; i++)
            {
                shouldHideObj[i].SetActive(true);
            }
        }
    }
}


🟧 屏幕指定范围截图

使用方法:

将下方脚本挂载到物体上,Skode_StartCapture为截图方法。action_End 委托方法为截图完后执行。

using System;
using System.Collections;
using System.IO;
using UnityEngine;
 
public class Skode_ScreenCapture_Rect : MonoBehaviour
{
    [Tooltip("是否启用截图后将图片保存到下面路径的功能")]
    public bool saveUseable = false;
 
    [Tooltip("存储路径")]
    public string savePath = "/sdcard/Skode";
 
    public GameObject[] shouldHideObj;
 
    /// <summary>
    /// 截图后的sprite
    /// </summary>
    [HideInInspector]
    public Sprite sprite;
 
    public void Skode_StartCapture(Rect mRect, Action action_End = null)
    {
        CaptureStart();
        StartCoroutine(CaptureByRect(mRect, action_End));
    }
 
    /// <summary>
    /// 根据一个Rect类型来截取指定范围的屏幕, 左下角为(0,0)
    /// 例:StartCoroutine(CaptureByRect(new Rect(100, 150, 1024, 768)));
    /// 从左下角的横坐标100,纵坐标150坐标开始截图,宽度1024,高度768
    /// </summary>
    public IEnumerator CaptureByRect(Rect mRect, Action action_End = null)
    {
        //等待渲染线程结束
        yield return new WaitForEndOfFrame();
 
        string currentTime = string.Format("{0:yyyyMMddHHmmssffff}", DateTime.Now);
 
        //初始化Texture2D, 大小可以根据需求更改
        Texture2D mTexture = new Texture2D((int)mRect.width, (int)mRect.height,
                                 TextureFormat.RGB24, false);
        //读取屏幕像素信息并存储为纹理数据
        mTexture.ReadPixels(mRect, 0, 0);
        //应用
        mTexture.Apply();
 
        sprite = Sprite.Create(mTexture,
    new Rect(0, 0, mTexture.width, mTexture.height),
    new Vector2(0.5f, 0.5f));
 
        if (saveUseable)
        {
            byte[] bytes = mTexture.EncodeToPNG();
 
            //若没路径 创建
            if (!Directory.Exists((savePath)))
            {
                Directory.CreateDirectory(savePath);
            }
            //保存路径
            string path_save = savePath + "/IMG_" + currentTime;
            //写入图片
            File.WriteAllBytes(path_save, bytes);
        }
 
        CaptureOver();
        action_End?.Invoke();
    }
 
    void CaptureStart()
    {
        if (shouldHideObj.Length > 0)
        {
            for (int i = 0; i < shouldHideObj.Length; i++)
            {
                shouldHideObj[i].SetActive(false);
            }
        }
    }
 
    void CaptureOver()
    {
        if (shouldHideObj.Length > 0)
        {
            for (int i = 0; i < shouldHideObj.Length; i++)
            {
                shouldHideObj[i].SetActive(true);
            }
        }
    }
}


🟨 指定相机截图

使用方法:

将下方脚本挂载到物体上,Skode_StartCapture为截图方法。action_End 委托方法为截图完后执行。

using System;
using System.Collections;
using System.IO;
using UnityEngine;
 
public class Skode_ScreenCapture_Rect : MonoBehaviour
{
    [Tooltip("是否启用截图后将图片保存到下面路径的功能")]
    public bool saveUseable = false;
 
    [Tooltip("存储路径")]
    public string savePath = "/sdcard/Skode";
 
    public GameObject[] shouldHideObj;
 
    /// <summary>
    /// 截图后的sprite
    /// </summary>
    [HideInInspector]
    public Sprite sprite;
 
    public void Skode_StartCapture(Rect mRect, Action action_End = null)
    {
        CaptureStart();
        StartCoroutine(CaptureByRect(mRect, action_End));
    }
 
    /// <summary>
    /// 根据一个Rect类型来截取指定范围的屏幕, 左下角为(0,0)
    /// 例:StartCoroutine(CaptureByRect(new Rect(100, 150, 1024, 768)));
    /// 从左下角的横坐标100,纵坐标150坐标开始截图,宽度1024,高度768
    /// </summary>
    public IEnumerator CaptureByRect(Rect mRect, Action action_End = null)
    {
        //等待渲染线程结束
        yield return new WaitForEndOfFrame();
 
        string currentTime = string.Format("{0:yyyyMMddHHmmssffff}", DateTime.Now);
 
        //初始化Texture2D, 大小可以根据需求更改
        Texture2D mTexture = new Texture2D((int)mRect.width, (int)mRect.height,
                                 TextureFormat.RGB24, false);
        //读取屏幕像素信息并存储为纹理数据
        mTexture.ReadPixels(mRect, 0, 0);
        //应用
        mTexture.Apply();
 
        sprite = Sprite.Create(mTexture,
    new Rect(0, 0, mTexture.width, mTexture.height),
    new Vector2(0.5f, 0.5f));
 
        if (saveUseable)
        {
            byte[] bytes = mTexture.EncodeToPNG();
 
            //若没路径 创建
            if (!Directory.Exists((savePath)))
            {
                Directory.CreateDirectory(savePath);
            }
            //保存路径
            string path_save = savePath + "/IMG_" + currentTime;
            //写入图片
            File.WriteAllBytes(path_save, bytes);
        }
 
        CaptureOver();
        action_End?.Invoke();
    }
 
    void CaptureStart()
    {
        if (shouldHideObj.Length > 0)
        {
            for (int i = 0; i < shouldHideObj.Length; i++)
            {
                shouldHideObj[i].SetActive(false);
            }
        }
    }
 
    void CaptureOver()
    {
        if (shouldHideObj.Length > 0)
        {
            for (int i = 0; i < shouldHideObj.Length; i++)
            {
                shouldHideObj[i].SetActive(true);
            }
        }
    }
}


相关文章
|
3月前
|
定位技术 C# 图形学
从零开始的unity3d入门教程(二)----基本功能讲解
这是一篇Unity3D入门教程,详细介绍了Unity界面操作、游戏物体创建修改、场景搭建、玩家控制、音效添加以及游戏测试和导出的全过程。
从零开始的unity3d入门教程(二)----基本功能讲解
|
3月前
|
图形学
小功能⭐️Unity获取场景中所有物体
小功能⭐️Unity获取场景中所有物体
小功能⭐️Unity获取场景中所有物体
|
3月前
|
图形学
小功能⭐️Unity UnityEvent实现代码的选择
小功能⭐️Unity UnityEvent实现代码的选择
|
3月前
|
机器学习/深度学习 图形学 Windows
小功能⭐️unity3d KeyCode各键值说明
小功能⭐️unity3d KeyCode各键值说明
|
3月前
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
3月前
|
图形学
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
|
3月前
|
图形学
小功能⭐️Unity中Texture2D、Sprite、Texture、RenderTexture、image、byte的转换
小功能⭐️Unity中Texture2D、Sprite、Texture、RenderTexture、image、byte的转换
|
3月前
|
图形学
|
3月前
|
图形学
小功能⭐️解决Unity无法对一个物体上的所有材质球进行更改
小功能⭐️解决Unity无法对一个物体上的所有材质球进行更改
|
2月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
200 0