
最近在跑一个 Unity 小项目需要把游戏内的战斗结算画面、角色展示动画和操作过程完整录下来。最先想到的是用 OBS 或者 Windows 自带录屏但实际试下来有几个很明显的问题一是录屏软件抓的是桌面窗口一旦切到其他界面或者电脑弹通知画面就会被污染二是录出来的视频帧率不稳定游戏里很流畅录出来却一卡一卡的三是如果游戏用到了 HDR、Linear 色彩空间画面还会出现发灰、偏色的问题。后来换成 Unity 官方自带的 Recorder 插件做“内录”相当于直接在引擎内部采集 Game 视图的渲染结果和音频数据录出来的视频和编辑器里看到的效果几乎一致帧率也稳定很多。这篇文章就把完整的接入手顺、录制参数配置、脚本控制方式和常见排错经验整理出来给同样有这个需求的开发者做个参考。文章主要面向两类读者一类是刚接触 Unity、需要给游戏项目录制展示视频或测试视频的初学者另一类是在美术或策划团队做视频产出想用官方方案替代屏幕录制软件提升录制质量的开发者。1. Unity 自带内录方案是什么1.1 什么是 Unity 的 Recorder 插件Unity Recorder 是 Unity 官方提供的一个录制插件它不是第三方 Asset Store 插件而是可以通过 Package Manager 直接安装的官方包。安装之后你可以在 Unity 编辑器内部直接录制 Game 视图、指定摄像机或 RenderTexture 的画面同时可以把游戏音频一并录制进去最终输出成 MP4、WebM、GIF、图像序列帧等格式。因为录制行为发生在编辑器内部所以它并不依赖外部屏幕录制工具。这种录制方式也被很多开发者称为“内录”意思是画面不经过桌面窗口合成而是直接读取 Unity 渲染管线输出的图像数据。从 Unity 2018 之后的官方推荐路径来看Unity 已经把 Recorder 整合进 Package Manager这也是目前 Unity 项目中最主流的官方录屏方案。早期版本中出现的 Video Recorder、Movie Recorder 等组件形式实际上已经是比较老的方案新项目更推荐直接使用 Recorder 包。1.2 它解决了什么问题在实际开发中录制游戏内容的需求非常常见但用外部录屏软件时往往会碰到这样几类问题帧率不稳定游戏渲染和屏幕捕获是两个独立的工作流屏幕录制软件抓帧时经常因为 GPU 编码瓶颈导致画面掉帧。画面内容不干净桌面壁纸、鼠标光标、系统通知、其他窗口都会被录进去不适合直接作为交付素材。色彩不一致Unity 的 Linear 色彩空间在外部录屏软件中经常被错误转换导致视频画面发灰、发白。无法精准控制录制范围有时候只想录制某一个相机的视角或者一块 RenderTexture 的画面外部工具做不到这种精细控制。不方便自动化在 CI 环境或者批量跑测试时希望用代码控制录制开始和结束外部软件很难和 Unity 编辑器流程集成。Recorder 插件因为是在编辑器内部工作这些问题都能得到有效解决。尤其是当你的需求是“把游戏画面录下来做成展示视频”或者“记录测试过程”使用官方 Recorder 是最省心、最可控的方案。1.3 Unity Recorder 与屏幕录制软件的区别简单说屏幕录制软件是“录桌面”Unity Recorder 是“录引擎”。对比项屏幕录制软件Unity Recorder录制原理捕获操作系统桌面合成画面引擎内直接读取渲染图像与音频画面干净程度容易混入鼠标、通知、窗口只录制 Unity 画面帧率控制依赖系统抓帧和编码能力可固定帧率录制色彩管理依赖桌面色彩配置可跟随 Unity 色彩空间录制源整个屏幕或窗口Game 视图、指定 Camera、RenderTexture脚本自动化较难可通过 Editor 脚本调用 Recorder API这个概念搞清楚之后后面的配置和代码才会有方向感。2. 环境准备与版本说明2.1 系统与 Unity 版本本文中的操作在 Windows 10/11 环境下验证过macOS 环境下的菜单入口和参数基本一致差异不大。Unity 版本方面因为 Recorder 是通过 Package Manager 安装的所以理论上只要你的 Unity 版本支持打开 Package Manager就可以安装。实际应用中Unity 2019.4 LTS 到 Unity 2022、Unity 6 系列都属于常见可用范围。需要特别说明的是不同 Unity 版本对应的 Recorder 主版本不同比如 Unity 2019 对应 Recorder 2.xUnity 2021 之后对应 Recorder 3.x、4.xUnity 6 中 Recorder 也在持续更新。API 在 2.x 到 4.x 之间基本保持稳定但具体字段名可能有一些细微差异建议安装后以当前版本的 API 文档为准。版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。2.2 安装 Unity Recorder安装步骤非常简单。打开 Unity 项目依次点击菜单栏Window - Package Manager在 Package Manager 窗口左上角 Packages 下拉菜单中选择“Unity Registry”或“All packages”然后在上方搜索框中输入 Recorder。搜索结果里会出现 Unity Recorder 官方包确认 Publisher 是 Unity Technologies点击 Install 即可。等待安装完成后Recorder 插件就集成到当前项目中了不需要额外做引用配置。如果你用的是旧版 Unity也可以在 Package Manager 中切换版本来源找到该包。只要能从官方源搜索到并安装成功功能基本一致。2.3 确认安装成功的标志安装完成后可以通过两个地方确认 Recorder 已生效第一Recorder 菜单出现。在 Unity 编辑器顶部菜单中可以看到Window - General - Recorder或者在某些版本中位于Window - Recorder - Recorder Window第二Project 窗口中能看到包依赖。打开 Package Manager在 Installed 列表中找到 Recorder说明安装成功。如果菜单没有出现可以先点击菜单栏的“Window - General - Recorder”如果还是没有则需要检查 Package Manager 中是否真的安装成功或者重启一次编辑器。3. Recorder 窗口基本录制流程3.1 打开 Recorder 窗口安装完成之后创建一个新的场景或者打开需要录制的场景然后点击菜单Window - General - Recorder打开 Recorder 窗口。界面整体分为左右两块左侧是保存的录制器列表右侧是参数配置区域。如果你是第一次使用这时的录制器列表是空的需要手动添加。3.2 添加录制器与选择输出格式点击左侧列表下方的“Add Recorder”按钮会有几个选项Movie输出视频文件常见格式为 MP4 或 WebM。Image Sequence输出一系列序列帧图片常见格式为 PNG、JPEG、EXR。GIF Animation输出动图文件。Animation Clip录制动画曲线数据。WAV只录制音频文件。如果你的目的是常规视频展示比如录制玩法演示、角色操作流程、游戏宣传片段直接选择 Movie 即可。选择 Movie 之后右侧会出现一个名为 Movie 的配置面板。在 Output Format 下拉框中你可以设置视频编码格式MP4适合大多数场景兼容性好常见视频播放器和剪辑软件都支持。WebM适合网页端播放和部分流媒体场景。选 MP4 后还可以继续选择 Video Bitrate Mode比如 High 高码率、Medium 中等码率、Low 低码率。录制用来做宣传展示的视频建议选 High录制测试过程选 Medium 或默认即可文件体积更小。3.3 配置输入源与分辨率如果你希望录制的是 Game 视图看到的画面Source 选择 Game View。如果你希望录制某一个特定摄像机的画面不跟随 Game 视图切换Source 可以选择 Targeted Camera然后指定目标 Camera。如果你希望录制一个 RenderTexture则选择 RenderTexture并把对应的 RenderTexture 对象拖进去。这一项是整个录制配置中最关键的部分一定要先想清楚“你打算录什么”再选择对应的输入源。很多开发者第一次使用 Recorder 时录出来黑屏或者画面不对基本都是输入源选错了。分辨率方面Recorder 提供了多种预设比如 1920x1080、1280x720、3840x2160 等。也可以选择 Output Resolution 中的自定义选项手动输入宽高。这里有一个非常实用的功能如果你选择 Game View 作为输入源并希望录制结果和窗口显示尺寸一致可以选择 “Game View” 作为分辨率基准如果你想固定输出 1080P则直接指定 1920x1080。3.4 配置帧率与编码参数Frame Rate 是录制视频的帧率设置。Constant固定帧率适合需要精准控制时长的输出。Variable可变帧率适合录制播片类、平时帧率波动大但不想改变回放速度的内容。实际做游戏展示视频时更推荐 Constant再把 Target FPS 设置为 30 或 60。如果录制的时候游戏帧率偏低开启 Cap Frame Rate 选项可以避免录制出来的视频出现掉帧导致的跳变感。音频设置在 Media Settings 区域中也有对应配置。如果希望在录视频时同时录制游戏内音效和音乐需要把 Audio 相关的 Enabled 选项勾上。默认音频采样率一般是 44.1kHz 或 48kHz。这里需要提醒一下如果游戏本身有音频但你录出来的视频没有声音绝大多数情况不是 Recorder 坏了而是没有启用音频录制或项目音频输出设置有问题。这个在常见问题部分会继续展开。3.5 开始录制与输出配置完成后Recorder 窗口底部有一个“Start Recording”按钮。点击后Unity 会自动进入 Play Mode并在游戏运行的同时开始录制。当你在编辑器中点击停止播放或者录制到设定的时间后录制会自动停止并在 Console 中显示输出文件的路径。输出的默认路径一般在项目根目录的 Recordings 文件夹下。你可以在 Output File 区域看到输出文件名和目录也可以手动修改。这里要特别提醒的是如果你的输出路径放在 Assets 文件夹下Unity 会自动把生成的文件作为资源导入工程可能产生重复导入和版本管理问题。建议把输出路径放到项目外部的临时目录比如E:/UnityRecordings/或者放在项目根目录下的非 Assets 路径。4. 使用 Timeline 录制4.1 创建 Timeline 与 Recorder Track如果你在制作过场动画、CG 剧情、战斗回放等需要严格按时间轴播放的内容Recorder 还提供了 Timeline 集成能力。创建 Timeline 的方法在场景中选中一个空物体然后点击菜单Window - Sequencing - Timeline在 Timeline 窗口中点击 Create 按钮给该物体添加 Timeline 资源。接着在 Timeline 窗口中点击“”号添加 Recorder Track也就是录制轨道。4.2 配置 Recorder Clip添加 Recorder Track 后在对应轨道上右键创建 Recorder Clip。选中这个 Clip 后Inspector 中会显示录制配置信息。你需要在这里把输出格式、输入源、帧率等参数配置好配置方式和 Recorder 窗口基本一致。Recorder Clip 会把录制和 Timeline 播放绑定起来当 Timeline 播放到 Clip 所在的时间段录制会自动开始当 Timeline 播放结束或者 Clip 区间结束录制也会自动停止。这个能力在制作剧情演示视频时非常方便你不用手动掐点录制只需要把片段时间轴排好播放一次就能得到完整录像。4.3 播放并录制配置完成后在 Timeline 窗口中点击播放。播放过程中 Recorder 会按照 Timeline 的时间轴录制内容。录制结束之后去输出目录查看生成的视频文件即可。如果你在使用 Timeline 的 Recorder Clip 时发现没有录制内容常见原因是 Clip 没有绑定有效的输入源或者输出路径没有权限写入。5. 脚本控制录制5.1 脚本控制适用场景虽然 Recorder 窗口和 Timeline 已经能满足大部分手动录制需求但在以下场景中你更可能需要通过代码控制录制需要精确指定某一帧开始录制、某一帧停止录制。需要在同一台设备上批量录制多个不同的参数组合。需要给非技术同事或测试人员提供一键录制功能。需要在编辑器自动化测试流程中嵌入录制逻辑。这些情况下可以使用 UnityEditor.Recorder 命名空间下的 API。5.2 创建 Editor 脚本因为 Recorder 依赖的是 UnityEditor.Recorder 命名空间所以控制录制的脚本只能放在 Editor 文件夹下或者使用预处理指令包裹。建议在 Assets 下创建 Editor 文件夹路径为Assets/Editor/RecorderControllerExample.cs然后打开脚本编写以下内容。5.3 核心代码逻辑下面是一个通过脚本控制录制视频的示例// 文件路径Assets/Editor/RecorderControllerExample.cs using UnityEditor; using UnityEditor.Recorder; using UnityEditor.Recorder.Input; using UnityEngine; public class RecorderControllerExample { private static RecorderController controller; [MenuItem(Tools/录制视频/开始录制)] public static void StartRecord() { // 1. 创建录制器控制器设置 var controllerSettings ScriptableObject.CreateInstanceRecorderControllerSettings(); // 2. 创建视频录制器设置 var recorderSettings ScriptableObject.CreateInstanceMovieRecorderSettings(); recorderSettings.name My Video Recorder; recorderSettings.Enabled true; // 3. 设置视频输出格式为 MP4高码率 recorderSettings.OutputFormat MovieRecorderSettings.VideoRecorderOutputFormat.MP4; recorderSettings.VideoBitRateMode VideoBitrateMode.High; // 4. 设置音频录制 recorderSettings.AudioSettings.Enabled true; recorderSettings.AudioSettings.Preset AudioSettingsPreset.Stereo_44.1k; // 5. 设置输入源这里使用 Game View var imageInputSettings recorderSettings.ImageInputSettings; imageInputSettings.Source ImageSource.GameDisplay; imageInputSettings.OutputWidth 1920; imageInputSettings.OutputHeight 1080; // 6. 设置帧率 recorderSettings.FrameRate 30; recorderSettings.FrameRateMode FrameRateMode.Constant; // 7. 设置输出路径注意不要放在 Assets 下 recorderSettings.OutputFile E:/UnityRecordings/rec_ System.DateTime.Now.ToString(yyyyMMdd_HHmmss); // 8. 将录制器设置加入控制器设置 controllerSettings.AddRecorderSettings(recorderSettings); // 9. 创建控制器并开始录制 controller new RecorderController(controllerSettings); controller.PrepareRecording(); controller.StartRecording(); Debug.Log(录制已开始文件将输出到 E:/UnityRecordings/ 目录); } [MenuItem(Tools/录制视频/停止录制)] public static void StopRecord() { if (controller ! null controller.IsRecording()) { controller.StopRecording(); Debug.Log(录制已停止); } else { Debug.LogWarning(当前没有正在进行的录制任务); } } }代码逻辑解释第 1 步创建 RecorderControllerSettings这是所有录制器配置的容器。第 2 步创建 MovieRecorderSettings表示这是一个视频录制器。第 3 到第 7 步分别设置输出格式、音频、输入源、分辨率、帧率和输出路径。最后通过 RecorderController 启动录制。注意点脚本必须放在 Editor 文件夹下否则会因为找不到 UnityEditor.Recorder 命名空间而报错。输出路径建议使用项目外部目录避免生成文件被 Unity 当作资源导入。如果你使用的是不同版本的 Recorder某些属性名可能略有差异比如AudioSettingsPreset在不同版本中可能存在枚举成员变化需以你当前版本 API 文档为准。5.4 运行与验证脚本写好后回到 Unity 编辑器等待编译完成。编译完成后菜单栏会出现Tools - 录制视频 - 开始录制 Tools - 录制视频 - 停止录制点击“开始录制”Unity 会自动进入 Play Mode录制开始。此时你可以正常操作游戏完成想要录制的画面。录制结束后点击“停止录制”Unity 退出播放模式并输出视频文件。检查目标目录E:/UnityRecordings/如果能看到对应的 MP4 文件说明脚本控制录制已经成功。5.5 扩展按时间自动停止有时候我们希望在游戏运行到一定时长后自动停止录制而不是手动点击菜单。可以在脚本中增加一个协程或者在 Update 中判断时间但考虑到 Editor 脚本的运行方式更简单的方案是配合 Recorder 的自动停止功能。Recorder 默认并不提供直接的“录制时长”字段但你可以通过协程方式实现[MenuItem(Tools/录制视频/录制10秒)] public static void StartRecordWithDuration() { StartRecord(); EditorApplication.update CheckStop; } private static float startTime; private static void StartTimer() { startTime (float)EditorApplication.timeSinceStartup; } private static void CheckStop() { if ((float)EditorApplication.timeSinceStartup - startTime 10f) { StopRecord(); EditorApplication.update - CheckStop; } }思路是在开始录制时记录当前时间并在 EditorApplication.update 中轮询判断时长是否达到 10 秒达到后自动停止录制。不过更稳妥的做法是使用Unsupported下的播放状态回调或者在 PlayMode 的 MonoBehaviour 里实现定时停止并把停止指令发给 Editor 脚本。这块属于进阶玩法可以根据项目需要自行研究。6. 录制输入源深入介绍6.1 Game ViewGame View 是最常用的录制输入源。选择这个源之后Unity 会直接采集 Game 窗口中渲染出来的画面。优点配置简单所见即所得只要 Game 窗口显示什么录制出来就是什么。注意Game View 的分辨率受窗口大小影响。如果希望固定输出 1920x1080记得在 Recorder 中手动指定输出分辨率不要选择“跟随 Game View”。6.2 Targeted Camera如果场景中有多个摄像机或者你只想录制某一个特定视角可以指定 Target Camera。选择 Targeted Camera 之后需要把目标 Camera 对象拖到 Source 对应的 Camera 槽位中。这个方案很适合录制角色特写、相机切换动画等场景因为不依赖 Game 视图是否被切换相机只要在场景中正常渲染录制就会正常工作。6.3 RenderTexture如果你用 RenderTexture 做了特殊的分屏画面、小地图画面、或者后处理渲染目标可以直接录制 RenderTexture。选择 RenderTexture 源之后把目标 RenderTexture 对象拖到槽位中即可。这种输入源在录制备用素材时非常灵活比如你可以把多个不同相机的画面分别渲染到多个 RenderTexture然后用脚本控制录制其中某一路。6.4 音频输入配置音频是很多开发者容易忽略的部分。Recorder 默认录制视频时不会自动录制音频需要在录制设置中手动打开。具体位置在 Movie 录制器的 Audio 设置区域勾选 Enabled。预设可以选择 Mono 或 Stereo 采样格式常见为 Stereo_44.1k。如果项目中的音频是通过 AudioListener 输出的Recorder 会直接采集 AudioListener 的混音结果。如果勾选之后仍然没有声音优先检查 Unity 的 Audio 面板确认 Master Volume 不是静音以及场景中存在激活的 AudioListener。7. 常见问题与排查下面把 Recorder 使用过程中最容易遇到的问题整理成一个表格再补充一些详细排查思路。问题现象常见原因解决思路录制出来是黑屏输入源选择错误或相机未正确渲染检查 Source 设置确认目标相机可见视频没有声音音频录制未启用勾选 Audio Enabled检查 AudioListenerMP4 无法播放部分平台缺少 H.264 解码器使用 VLC/播放器或换 WebM 格式输出文件找不到输出目录不存在或路径被修改手动创建输出目录检查 Output File 路径录制过程中掉帧严重分辨率或帧率设置过高调低分辨率开启 Cap Frame Rate脚本报错找不到命名空间脚本没放在 Editor 文件夹下移动到 Assets/Editor 目录Recorder 菜单不显示插件未安装成功重新在 Package Manager 中安装 Recorder视频画面偏亮或偏暗色彩空间或 HDR 设置差异对比 Game 视图和录制文件调整曝光7.1 录制黑屏的排查黑屏问题首先要确认 Source。如果 Source 是 Game View确保 Game 窗口中实际能看到画面。如果 Source 是 Targeted Camera确保 Camera 组件启用且 Culling Mask、Target Display 设置正确。如果你使用了 URP 或 HDRP检查相机是否正常渲染到对应目标。其次检查 Recorder 的 Capture 设置确保没有把 Alpha 通道设置成透明背景导致视频背景完全透明。这种情况下视频播放器可能会显示为黑底。7.2 没有声音的排查音频问题按下面顺序排查检查 Recorder 的 Audio Enabled 是否勾选。检查场景中是否存在 AudioListener。检查 Project Settings - Audio 中的系统音频输出是否正常。检查系统音量管理器中是否把 Unity 进程静音。如果使用 Timeline确认 Recorder Clip 上是否启用了音频捕获。7.3 编码格式兼容问题MP4 是目前最通用的视频格式但 Unity 的 MP4 编码在部分老旧播放器上可能无法直接播放。如果遇到无法播放的问题可以先用 VLC、PotPlayer 等播放器测试。如果这些播放器能播说明文件本身没有损坏只是播放器解码器不全。如果目标平台是 Web 展示可以考虑输出 WebM 格式兼容大部分现代浏览器。8. 最佳实践与工程建议8.1 输出目录规划不要把录制生成的视频文件直接输出到 Assets 目录否则 Unity 会把大型视频文件作为资源导入并生成 .meta 文件既拖慢编辑器速度又容易污染工程。推荐两种做法项目根目录下新建 Recordings 文件夹和 Assets 平级。项目外部的固定目录比如E:/UnityRecordings。如果是团队协作项目建议在 Recorder 配置中统一输出路径规则例如项目名/版本号/日期/录制内容.mp4这样整理素材和归档成本更低。8.2 画质与性能平衡录制视频时尤其是高分辨率项目不要一味调高分辨率。建议按照视频用途选择测试视频1280x720 或 1920x1080中等码率。项目展示1920x1080 或 2560x1440高码率。宣传片级根据分发平台要求设置。录制时如果项目本身运行帧率不高建议开启 Cap Frame Rate并尽量关闭不需要的 UI 叠层和 Debug 信息避免录制内容带有测试痕迹。8.3 使用序列帧做后期如果视频需要进后期剪辑、调色、绿幕抠像推荐输出 PNG Sequence也就是序列帧格式而不是直接输出 MP4。序列帧的每个画面都是无损 PNG 图片后期软件导入时精度更高alpha 通道信息也更容易保留。缺点是文件体积非常大。按流程来就是Recorder 输出 PNG Sequence然后在 PR 或 After Effects 中导入序列帧再做剪辑和压制。8.4 注意版权与合规录制游戏画面时尤其是录制包含音效、音乐、模型素材的内容要确认素材是否具有分发权限。如果录制内容用于公开发布、商业宣传请先确认项目资源和音频素材的授权范围避免涉及版权问题。另外如果录制的是用户生成内容或者涉及敏感数据的操作过程建议在正式发布前做脱敏处理。8.5 善用 Recorder 的自动化能力把录制流程脚本化是提高素材产出效率的重要手段。你可以把常用录制配置写成 Editor 脚本做成菜单按钮让测试人员或策划同事直接点击菜单完成录制不需要他们理解 Recorder 窗口中的每一个参数。也可以把录制配置放到 EditorWindow 中做成自己的录制工具面板统一管理内置录制的入口。9. 下一步可以继续学习的方向如果这篇教程中的内容你已经全部跑通接下来可以从这几个方向继续深入学习 Recorder 的 Image Sequence 输出掌握透明背景视频的制作流程。研究 Timeline 与 Recorder Clip 的组合制作自动化过场录屏。结合 CI 工具把 Recorder 集成到自动化打包和测试流程中。尝试在 URP/HDRP 项目中录制 HDR 内容了解不同色彩空间对录制结果的影响。建议新建一个小 Demo把按钮、暂停、录制、停止这些交互全部用代码串起来做成一个简单的“游戏内录工具面板”。这个练习做完你对 Unity 自带插件的理解就会从“会用”变成“能灵活用在项目里”。如果这篇文章对你有所帮助可以收藏备用后续遇到录制相关需求时翻出来对照配置。也欢迎在实际项目中使用后把你遇到的问题和有趣的解决方案分享出来一起交流Unity 项目开发中的实用技巧。