Unity AR实现截图拍照效果

在移动端开发中,很多应用和游戏都有一个常见的需求:截屏并保存到相册 。在 Unity 中实现这一功能虽然可以用原生代码,但我尝试之后,发现使用第三方插件可以大大简化开发,并且有更好的效果。本文将介绍如何使用 Unity 的 Gallery Screenshot 插件,轻松实现截图保存功能,兼容 Android 和 iOS 平台。

Unity 内置的 ScreenCapture.CaptureScreenshot() 只能保存到应用的沙盒路径,无法保存到安卓相册或iOS照片库。如果要保存到系统图库,需要调用各个平台的原生API,涉及到Android的 MediaStore、iOS的 Photos 框架,开发复杂度较高。

而 Gallery Screenshot 插件已经为我们封装好了这些原生操作,只需要简单调用接口即可完成截图并保存,极大地节省了开发时间。

二、插件安装与准备

1.获取插件

将Gallery Screenshot导入到unity的Assets/Plugins/中。

是下面这个,获取办法有很多。

2.权限配置

Android额外设置

1.打开 File -> Build Settings -> Android -> Player Settings

2.找到 Write Access,设置为:

External (SDCard)

这样才能将截图写入到外部存储,从而被系统图库识别。

3.同时建议在 AndroidManifest.xml 中加入必要权限:

XML 复制代码
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

注意:在 Android 13 及以上版本需适配 READ_MEDIA_IMAGES

三、插件使用方法

  1. 保存新的截图到相册

下面是关键脚本:

cs 复制代码
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.IO;

public class ScreenshotUIController : MonoBehaviour
{
    public RawImage previewImage;             // 用于显示截图
    public AudioClip shutterClip;             // 拖入你的 Camera-shutter 音频
    public Texture2D exampleTexture;          // 拖入 Example Image

    private AudioSource audioSource;          // 内部自动挂载的播放器
    private string latestScreenshotPath;

    void Start()
    {
        // 自动添加 AudioSource
        audioSource = gameObject.AddComponent<AudioSource>();
        audioSource.playOnAwake = false;
        audioSource.clip = shutterClip;

        // 如果设置了默认图像,就先显示
        if (exampleTexture != null && previewImage != null)
        {
            previewImage.texture = exampleTexture;
        }
    }

    public void TakeScreenshot()
    {
        StartCoroutine(CaptureAndShowScreenshot());
    }

    IEnumerator CaptureAndShowScreenshot()
    {
        yield return new WaitForEndOfFrame();

        string fileName = "MyScreenshot_" + System.DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".png";
        string path = Path.Combine(Application.persistentDataPath, fileName);

        Texture2D screenImage = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
        screenImage.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
        screenImage.Apply();

        byte[] imageBytes = screenImage.EncodeToPNG();
        File.WriteAllBytes(path, imageBytes);
        latestScreenshotPath = path;

        // 显示截图
        if (previewImage != null)
            previewImage.texture = screenImage;

        // 播放快门声音
        if (audioSource != null && shutterClip != null)
            audioSource.Play();

        // 注册到系统相册
        StartCoroutine(ScreenshotManager.SaveExisting(path, true));
    }
}

插件会自动在文件名后附加时间戳和编号,避免重复覆盖。

可以在 ScreenshotManager.cs 里自定义命名逻辑。

2.在unity中配置上音效等内容。

我最后实现了一个点击按钮进行拍照保存的效果

将脚本所挂的空物体拖入按钮On click中

相关推荐
め.17 分钟前
定点数运算库
算法·unity
知识分享小能手2 小时前
统计学学习教程,从入门到精通,参数估计 — 知识点详解与公式推导(10)
学习·机器学习·概率论
有Li2 小时前
EvoMDT:用于多癌种结构化临床决策的自进化多智能体系统文献速递/医学智能体前沿
人工智能·学习·分类·文献·医学生
Duo1J4 小时前
【UE】Slate 编辑器工具开发03 - 节点编辑器 (EdGraph)
ue5·编辑器·游戏引擎·ue4
郝学胜-神的一滴4 小时前
[简化版 GAMES 104] 现代游戏引擎 02:拆解现代游戏引擎5+1层级架构,吃透引擎底层核心逻辑
c++·unity·架构·游戏引擎·图形渲染·unreal engine·系统设计
sulikey5 小时前
个人Linux操作系统学习笔记11 - 环境变量
linux·笔记·学习
虹科数字化与AR5 小时前
医疗级数据防护:安宝特AR平台隐私合规方案
ar
治愈系贝壳5 小时前
ARM --- day 6 时钟
linux·arm开发·学习
FII工业富联科技服务5 小时前
从灯塔工厂到AI Factory新模式:AI正在重构制造业的四大核心能力
大数据·运维·人工智能·重构·ar·制造
minglie16 小时前
zynq高频小数据量PS闭环的三个实验-第0课:目的和目标
学习