Unity中的截图方法(包括全屏截图、区域截图、Camera截图和摄像头截图)

本文详细介绍了Unity中四种截图方法:全屏截图、区域截图、Camera截图和摄像头截图。全屏截图可通过Application.CaptureScreenshot(已废弃)和ScreenCapture.CaptureScreenshot实现;区域截图利用Texture2D.ReadPixels读取特定视口像素;Camera截图借助RenderTexture和Camera.targetTexture完成;摄像头截图则涉及WebCamTexture.GetPixels。每种方法都包含关键代码示例,适用于不同场景的截图需求。


之前项目中需要用到截图功能,经过查找找到3种方式,这里做一个记录。

Application.CaptureScreenshot

Application类下的CaptureScreenshot方法,截取的是某一帧时整个游戏的画面,或者说是全屏截图吧。
以下是两个重载的函数。其中filename参数为截图后保存下来的文件名;superSize参数为增加分辨率的因数:

//
// 摘要:
//     Captures a screenshot at path filename as a PNG file.
//
// 参数:
//   filename:
//     Pathname to save the screenshot file to.
//
//   superSize:
//     Factor by which to increase resolution.
[Obsolete("Application.CaptureScreenshot is obsolete. Use ScreenCapture.CaptureScreenshot instead (UnityUpgradable) -> [UnityEngine] UnityEngine.ScreenCapture.CaptureScreenshot(*)", true)]
public static void CaptureScreenshot(string filename);
//
// 摘要:
//     Captures a screenshot at path filename as a PNG file.
//
// 参数:
//   filename:
//     Pathname to save the screenshot file to.
//
//   superSize:
//     Factor by which to increase resolution.
[Obsolete("Application.CaptureScreenshot is obsolete. Use ScreenCapture.CaptureScreenshot instead (UnityUpgradable) -> [UnityEngine] UnityEngine.ScreenCapture.CaptureScreenshot(*)", true)]
public static void CaptureScreenshot(string filename, int superSize);

通过上面的代码也可以看出,在新版的Unity中该函数被废弃了。新的系统函数类是ScreenCapture

ScreenCapture

以下为系统类ScreenCapture

//
// 摘要:
//     Functionality to take Screenshots.
[NativeHeader("Modules/ScreenCapture/Public/CaptureScreenshot.h")]
public static class ScreenCapture
{
   
   
    public static void CaptureScreenshot(string filename);
    //
    // 摘要:
    //     Captures a screenshot at path filename as a PNG file.
    //
    // 参数:
    //   filename:
    //     Pathname to save the screenshot file to.
    //
    //   superSize:
    //     Factor by which to increase resolution.
    //
    //   stereoCaptureMode:
    //     Specifies the eye texture to capture when stereo rendering is enabled.
    public static void CaptureScreenshot(string filename, int superSize);
    public static void CaptureScreenshot(string filename, StereoScreenCaptureMode stereoCaptureMode);
    public static Texture2D CaptureScreenshotAsTexture
### 实现 Unity 中截取整个电脑屏幕 为了实现在 Unity 中截取整个电脑屏幕的功能,可以采用多种方式来处理不同显示器的截图需求。考虑到多屏环境下的复杂性以及可能出现的问题,下面提供一种较为通用的方法。 #### 方法一:利用 `ScreenCapture.CaptureScreenshot` Unity 提供了一个简单易用的方法——`ScreenCapture.CaptureScreenshot()` 来捕获当前活动窗口的内容并保存为文件。然而对于全屏捕捉而言,这可能不够灵活,尤其是在涉及多个显示屏的情况下[^1]。 ```csharp using UnityEngine; public class ScreenShot : MonoBehaviour { public string filePath; void Capture() { // 调用此方法会自动将图片保存至项目根目录下或指定路径 ScreenCapture.CaptureScreenshot(filePath); } } ``` 但是这种方法仅限于抓取游戏视窗内的画面,并不适用于跨多个监视器的情况。 #### 方法二:通过读取像素数据构建纹理 针对多屏情况,可以通过遍历所有可用显示设备(`Display.displays`),分别获取各屏幕尺寸信息,再基于这些信息创建对应大小的 RenderTexture 对象用于存储每一屏的画面内容。之后借助 `ReadPixels` 函数逐个采集各个 Display 的图像数据,最后合成一张完整的桌面截图[^2]。 ```csharp using System.Collections.Generic; using UnityEngine; public class MultiMonitorScreenshot : MonoBehaviour { private List<RenderTexture> renderTextures = new List<RenderTexture>(); private Texture2D finalImage; void Start() { foreach (var display in Display.displays) { int width = Mathf.RoundToInt(display.renderingWidth * display.relativeRenderingScale); int height = Mathf.RoundToInt(display.renderingHeight * display.relativeRenderingScale); RenderTexture rt = new RenderTexture(width, height, 24); Camera cam = CreateCameraForDisplay(display, rt); renderTextures.Add(rt); StartCoroutine(WaitAndCapture(cam)); } StartCoroutine(MergeImages()); } IEnumerator WaitAndCapture(Camera camera) { yield return null; // 等待下一帧以确保相机已经准备好 camera.Render(); RenderTexture.active = camera.targetTexture; Texture2D screenshot = new Texture2D(camera.targetTexture.width, camera.targetTexture.height); screenshot.ReadPixels(new Rect(0, 0, camera.targetTexture.width, camera.targetTexture.height), 0, 0); screenshot.Apply(); byte[] bytes = screenshot.EncodeToPNG(); File.WriteAllBytes(Application.dataPath + "/../Screenshots/" + "screenshot.png", bytes); } IEnumerator MergeImages() { while(renderTextures.Count != Display.displays.Length){ yield return null; } // 合并逻辑... Debug.Log("All screenshots captured."); } Camera CreateCameraForDisplay(Display targetDisplay, RenderTexture texture) { GameObject go = new GameObject($"Cam_{targetDisplay.name}"); Camera cam = go.AddComponent<Camera>(); cam.backgroundColor = Color.clear; cam.cullingMask = ~LayerMask.GetMask("Ignore Raycast"); cam.depthTextureMode = DepthTextureMode.None; cam.enabled = false; cam.targetTexture = texture; cam.rect = new Rect(targetDisplay.relativeRect.x / Screen.currentResolution.width, targetDisplay.relativeRect.y / Screen.currentResolution.height, targetDisplay.relativeRect.width / Screen.currentResolution.width, targetDisplay.relativeRect.height / Screen.currentResolution.height); return cam; } } ``` 上述代码片段展示了如何为每一个连接着计算机系统的外部显示器分配独立的摄像机组件,并将其输出定向到特定分辨率的 RenderTexture 上;随后,在合适的时机触发 ReadPixels 操作完成实际的数据提取工作。需要注意的是,这里假设所有的摄像头都处于同一场景内并且不会相互干扰。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天富儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值