ue3d如何在 Unity 中截图

如何在 Unity 中截图

分类:

有些时候我们需要在 Unity 中捕获屏幕的原因有许多,可能希望拍照高质量的游戏截图,也许想将游戏画面录制为一段视频又或许想保存当时游戏战绩中的屏幕截图,共享至朋友圈。

那么在本文中,将了解在 Unity 中捕获屏幕的不同方法,根据不同内容我们可以选择使用哪一种。

如何在Unity中捕获屏幕

一般来说,Unity中有三种不同的截屏方法

  • 使用 Screen Capture 类获取游戏视图屏幕截图
  • 将相机的视图渲染为渲染纹理并将其保存到文件中
  • 或者使用 Unity Recorder 拍摄高质量的屏幕截图或视频

运用哪种办法取决于要测验一些什么,由于每个选项都有自己的长处和缺点。

例如,Screen Capture 类是从脚本中截取屏幕截图的较为简单办法,可用于答应玩家捕获他们能够看到的任何内容。

或许,假如想隐藏 UI、过滤某些图层或截取通明背景的屏幕截图,最好的选择可能是将相机的视图烘焙为纹理并将结果保存到文件中。

可是,假如测验在编辑器中为短片捕获高质量的屏幕截图或游戏画面,或许假如运用 Unity 进行 3D 动画或烘焙,例如 Unity Recorder,到目前为止,这是最好的办法。

那么这里我们首先使用 Screen Capture 类进行截屏的方法。

使用Screen Capture类在Unity中截屏

在 Unity 中截屏的最简单方法之一是使用 Screen Capture 类中的 Capture Screenshot 功能。

//按下按钮时保存屏幕截图
public KeyCode screenShotButton;
void Update()
{
    if (Input.GetKeyDown(screenShotButton))
    {
        ScreenCapture.CaptureScreenshot("screenshot.png");
        Debug.Log("A screenshot was taken!");
    }
}

这将在编辑器中工作时将当前游戏视图保存为项目文件夹的根目录中的 PNG 文件,或者在独立播放器中运行游戏时将其保存在应用程序的数据文件夹中。

这将包含任何 UI 元素,例如十字准线或 HUD 面板,而图画的尺度将与游戏视图的尺度相同。

这意味着,如果在编辑器中使用捕获屏幕截图功能,更改游戏视图视口的形状将导致捕获屏幕时的宽高比不同。

截取超大屏幕截图

使用 Screen Capture 类截取屏幕截图时,可以选择通过传入 supersize 值来增加分辨率,该值是一个整数整数,将乘以游戏视图的分辨率,从而产生相当不错的图像。

例如:

// 将分辨率提高 4 倍
ScreenCapture.CaptureScreenshot("screenshot.png", 4);

这对于为页面截取高质量的屏幕截图非常有用,因为增加的分辨率通常会带来更好的整体图像和更平滑的边缘。

但是,捕获较大的图像需要更长的时间,因此不仅会在保存图像时游戏卡顿,而且某些后期处理效果会变得非常夸张,从而导致模糊图片。

因此,虽然 Supersize 值可用于获取更高质量的屏幕截图,但它并不是一个完美的方法,并且可能会遇到一些肉眼看上去非常严重的伪影,当然具体取决于游戏中的后期处理。

捕获的屏幕截图保存在哪里?

默认情况下,在编辑器中工作并在播放模式下截屏时,图像将保存到项目文件夹的根目录中。

将无法在 Unity 的项目窗口中看到该文件,但可以使用 Win 的资源管理器从项目目录访问它:

ue3d - 如何在 Unity 中截图

在独立播放器中截取屏幕截图时,构建游戏后,图像将保存在应用程序的数据文件夹 Application Data Path 中,或者在 iOS 和 Android 上,保存在 Persistent Data Path 中。

应用程序数据路径通常与安装的游戏文件存在于同一位置,而持久数据路径通常保持独立,并且在游戏更新时不会被覆盖。

可以将目录更改为自定义路径,例如自己的桌面,例如:

ScreenCapture.CaptureScreenshot("/Users/i3dtt/Desktop/screenshot.png");

然而,虽然这可能是获取自己的屏幕截图的便捷方式,但将文件保存在玩家的个人文件夹中通常不是一个好主意。

在大多数情况下,除非想为玩家提供一种在游戏外拜访屏幕截图的方法,否则或许需要做的就是使用默认路径。

但是,即使想保持文件路径相同,也可能需要在文件名中添加一个动态元素,例如计数器或日期和时间,以便在保存新屏幕截图时不会覆盖以前的屏幕截图。

例如:

ScreenCapture.CaptureScreenshot("screenshot " + System.DateTime.Now.ToString("MM-dd-yy (HH-mm-ss)") + ".png");

在此示例中,将系统日期和时间添加到文件途径中,以便每个文件名都是仅有的,并以特定模式格式化以避免保存时犯错。

ue3d - 如何在 Unity 中截图

修复无法存储屏幕截图的错误

如果尝试在文件名中保存带有日期和时间值的屏幕截图,但在 Unity 中收到 无法存储屏幕截图 错误的提示,则很可能是因为尚未格式化系统的日期和时间价值。

默认情况下,系统时间返回的值包含冒号,不能包含在文件名中。要修复它,只需使用 To String 函数格式化不带冒号的时间值。

例如:

string currentTime = System.DateTime.Now.ToString("MM-dd-yy (HH-mm-ss)");

等待帧结束

保存屏幕截图或以任何方式使用可见游戏图像时,通常最好确保当前帧已完成渲染,然后再尝试对其进行任何操作。

通常这涉及将 Capture Screenshot 函数 移动到 Coroutine 中,因为与在渲染之前调用的 Update 不同,这将允许等到帧结束后再执行该函数。

例如:

// 在帧末尾捕获屏幕截图。
public KeyCode screenShotButton;
void Update()
{
    if (Input.GetKeyDown(screenShotButton))
    {
        StartCoroutine(TakeScreenShot());
    }
}
IEnumerator TakeScreenShot()
{
    yield return new WaitForEndOfFrame();
    ScreenCapture.CaptureScreenshot("screenshot.png");
}

否则,由于尝试保存部分渲染的帧,可能会遇到图像缺陷

但是,如果确实在 Update 中触发了 Capture Screenshot 功能,实际上可能不会遇到任何伪影问题。

假如仅仅为自己截屏,这可能不是什么大问题。但是,为了保证每个图像都按应有的方式显示出来,而且因为无论如何它只需要很少的额定工作,在帧结束时触发协程中的捕获屏幕截图功能通常是最好的方法这样做,因为它保证应该在结构中的一切内容都将真实存在。

但是,如果不想捕捉画面中的某些元素或者UI,我们该怎么办?

如何在Unity中排除截屏

Capture Screenshot 功能会记录游戏视图的图像,包括用户界面在内。

如果想为所有内容拍照,或者正在编辑器中工作,那么可以轻松地删除不想看到的任何内容。

但是,有时也可能希望捕捉相机可以看到的内容,但排除某些元素,例如没有Unity用户界面、使用透明背景,或者即使只是想从相机拍摄在不同的位置,看不见。

这可以通过将相机的视图渲染到纹理中,然后将该纹理保存为文件来完成。

那么它是怎样工作的?

首先,创建一个额外的相机,并在其设置中,使用 Culling Mask 下拉菜单过滤掉不想看到的任何图层。

接下来,将该相机的视图渲染为纹理并保存。

void SaveCameraView(Camera cam)
{
    RenderTexture screenTexture = new RenderTexture(Screen.width, Screen.height, 16);
    cam.targetTexture = screenTexture;
    RenderTexture.active = screenTexture;
    cam.Render();
    Texture2D renderedTexture = new Texture2D(Screen.width, Screen.height);
    renderedTexture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
    RenderTexture.active = null;
    byte[] byteArray = renderedTexture.EncodeToPNG();
    System.IO.File.WriteAllBytes(Application.dataPath + "/cameracapture.png", byteArray);
}

使用此方法时,可以将目标相机保持关闭状态,这很有用,因为根据渲染的内容,保持打开状态会显着降低性能。

这种捕获屏幕的方法效果很好,因为一旦设置好,它就可以简单地记录相机可以看到的任何内容。

只需更改相机的视图设置,即可轻松更改屏幕截图中包括和不包括的内容。这对于过滤掉相关UI、隐藏某些对象或使场景的背景彻底透明十分有用。

如何捕获具有透明背景的屏幕截图

截取透明背景的屏幕截图,需要使用与上一个示例相同的渲染纹理方法。然后,要过滤掉所有内容,请单击 Culling Mask 下拉菜单并选择 Nothing ,然后选择希望显示的图层。

ue3d - 如何在 Unity 中截图

接下来,需要从相机渲染中移除天空盒,这可以通过将 Clear Flags 下拉菜单设置为 Depth Only 来完成。

ue3d - 如何在 Unity 中截图

或者,也可以在此处使用 不清除透明色 选项,效果相同,这将导致在剔除层和天空盒背景被删除时渲染任何可见层。

通常可以使用此方法来捕获游戏中单个对象的图像,以供自己使用或用于由玩家触发的游戏内功能。

然而,虽然运用 Screen Capture 类和渲染纹路方法可能是创建游戏内屏幕截图功用的好方法,而且它们都适用于在编辑器中截取屏幕截图,但捕获游戏画面的较高质量方法和项目的屏幕截图是运用 Unity Recorder。

在Unity中使用Unity Recorder

Unity Recorder(记录器)是一个内置工具,可让为页面、短片或 3D 动画和电影制作捕获游戏项目的高质量屏幕截图和视频。

它只能在编辑器中使用,但允许捕获比直接录制游戏视图时质量更高的图像和视频。这是因为,尽管游戏视图的质量受到可变细节级别的限制,旨在进步游戏的实践功能,但 Unity Recorder 好像在截取屏幕截图之前将一切游戏设置提升到最大可能级别。

因此,纹理和模型细节往往更好,后处理效果更清晰,不会像使用 Screen Capture 方法时遇到模糊问题,屏幕截图的整体质量更高。

Unity Recorder 还可用于录制高质量视频,这对于录制视频内容或从 3D 动画生成视频文件非常有用。

但是,使用 Unity Recorder 录制的视频通常比捕获屏幕输出更流畅、更稳定,而不是简单地记录看到的内容,就像以更高质量渲染捕获的图像一样。

这是因为,在使用 Unity Recorder 时,Unity 将优先以稳定的帧速率正确捕捉素材,这意味着游戏本身可能会因此运行速度变慢。

在极点情况下,这会使玩游戏变得非常困难。但是,Unity Recorder 通常规划用于渲染预动画素材,例如 3D 动画,在这种情况下,控制游戏的技巧并不重要。

这意味着,如果打算使用 Unity Recorder 来捕捉自己玩游戏的过程,它可以帮助找到一个平衡的质量设置,让你可以同时非常顺畅地继续玩。

但 Unity Recorder 是如何工作的呢?

在Unity中如何安装Recorder

Unity Recorder 没有内置到编辑器中,这意味着,如果想使用它,需要先从包管理器下载并导入它。

ue3d - 如何在 Unity 中截图

安装后,将通过选择 Window > General > Recorder 找到 Unity Recorder 窗口。

ue3d - 如何在 Unity 中截图

在Unity中如何使用Recorder

安装 Unity Recorder 后,可以通过将新的 Recorder 添加到 Recorder 窗口左侧的列表来切换类型。

ue3d - 如何在 Unity 中截图

添加的记录器类型取决于你自己要捕获的内容。例如视频录像机的设置将允许指定文件类型 、 图像源、分辨率和质量设置,以及文件的保存目录。

ue3d - 如何在 Unity 中截图

要捕获单个屏幕截图,请添加图像序列记录器并将记录模式更改为单帧。然后,当项目处于播放模式时,单击 Start Recording 按钮或 F10 就可以进行截图。

ue3d - 如何在 Unity 中截图

默认情况下,截取的图片会在项目目录的 Recordings 文件夹中找到屏幕截图。

提高Unity Recorder的视频捕获质量

虽然 Unity Recorder 捕获的视频很好,但它是以稳定的帧速率捕获的。根据运用的设置,视频画面或许仍会受到压缩伪影的影响。

出于这个原因,假如运用 Unity Recorder 渲染 3D 动画或稍后或许被编辑成视频的任何类型的过场动画,最好生成一系列画面而不是运用 Movie Recorder。

这经过在帧间隔记录形式或时间间隔形式下运用图像序列记录器来作业。这不是生成视频文件,而是将每一帧渲染为高质量的 PNG,然后能够在后期将其组合创立更高质量的视频。

要运用此方法,就像录制视频时一样,需求指定进行录制的帧数或持续时间。或者,能够运用 Unity Timeline 中的 Recorder 轨道掩盖事件时间线。

ue3d - 如何在 Unity 中截图

这将在 Unity Recorder 剪辑的持续时间内自动录制素材。

但是请记住,当使用 Unity Recorder 轨道和 Timeline 时,该剪辑的 Recorder 设置将在 Inspector 中,而不是 Recorder 窗口中:

ue3d - 如何在 Unity 中截图

相关信息

  • 类型:知识
  • 字数:3227
  • 字符:9462
  • 适用软件:Unity
  • 说明:无
  • 编号:61482

热门内容

提示:3D天堂作为服务提供者,尊重网络版权及知识产权,对某些行为的发生不具备充分的监控能力,若无意间侵犯到您的权利,请 联系我们,我们会在收到信息后尽快给予处理。

本站文章版权归本站自创作者所有,未经允许不得转载!