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