如何通过脚本控制Unity Recorder实现多相机依次录制MP4动画?
实现Unity Recorder多相机依次录制的脚本方案
前置准备
- 确保已在Package Manager中安装Unity Recorder包(推荐2.x及以上版本,API更稳定)
- 在场景中创建空对象,将下面的脚本挂载到该对象上
- 提前整理好需要录制的相机列表(可直接在Inspector面板拖拽赋值)
核心脚本实现
using UnityEngine; using UnityEditor.Recorder; using UnityEditor.Recorder.Input; using System.Collections; public class CameraSequenceRecorder : MonoBehaviour { public Camera[] targetCameras; // 拖拽场景中需要录制的相机到这里 public float singleRecordDuration = 20f; // 单台相机的录制时长 public string saveDirectory = "Assets/Recordings"; // 录制文件的保存路径 private RecorderController recorderController; private int currentCamIndex = 0; void Start() { InitializeRecorder(); StartCoroutine(RunRecordingSequence()); } void InitializeRecorder() { // 创建Recorder控制器实例 recorderController = ScriptableObject.CreateInstance<RecorderController>(); var recorderSettings = ScriptableObject.CreateInstance<RecorderSettings>(); // 配置MP4录制参数 var videoSettings = recorderSettings.GetSettings<VideoRecorderSettings>(); videoSettings.outputFormat = VideoRecorderSettings.VideoOutputFormat.MP4; videoSettings.imageInputSettings = new GameViewInputSettings { outputWidth = 1920, outputHeight = 1080, captureAlpha = false }; // 设置文件名规则:相机名称+时间戳,避免文件覆盖 recorderSettings.FileNameGenerator.FileName = "{CamName}_{Time}"; recorderSettings.FileNameGenerator.Root = OutputPath.Root.AssetsFolder; recorderSettings.FileNameGenerator.RootPath = saveDirectory; recorderController.settings = recorderSettings; } IEnumerator RunRecordingSequence() { while (currentCamIndex < targetCameras.Length) { var currentCam = targetCameras[currentCamIndex]; // 只激活当前要录制的相机,禁用其他相机 SwitchActiveCamera(currentCam); // 更新Recorder的目标相机 var videoSettings = recorderController.settings.GetSettings<VideoRecorderSettings>(); (videoSettings.imageInputSettings as GameViewInputSettings).camera = currentCam; // 替换文件名中的相机名称变量 recorderController.settings.FileNameGenerator.Variables["CamName"] = currentCam.name; // 启动录制 recorderController.PrepareRecording(); recorderController.StartRecording(); // 等待设定的录制时长 yield return new WaitForSeconds(singleRecordDuration); // 停止录制并等待文件写入完成 recorderController.StopRecording(); yield return new WaitForEndOfFrame(); // 切换到下一台相机 currentCamIndex++; } Debug.Log("所有相机录制任务完成!"); } void SwitchActiveCamera(Camera activeCamera) { foreach (var cam in targetCameras) { cam.gameObject.SetActive(cam == activeCamera); } } void OnDestroy() { // 销毁Recorder资源,避免内存泄漏 if (recorderController != null) { DestroyImmediate(recorderController.settings); DestroyImmediate(recorderController); } } }
关键细节说明
- Recorder配置:脚本动态生成录制配置,也可提前在Editor中创建
RecorderProfile,直接赋值给recorderController.settings,适配更复杂的录制需求 - 相机切换逻辑:通过
SwitchActiveCamera确保同一时间只有目标相机处于激活状态,避免录制画面混乱 - 文件名规则:使用变量占位符自动生成唯一文件名,防止后续录制覆盖之前的文件
- 录制流程控制:用协程分步处理录制等待、相机切换,确保每一段录制完成后再启动下一段
使用注意事项
- 运行前需确保
saveDirectory路径已存在,脚本不会自动创建文件夹,可自行添加路径创建逻辑 - 若需录制透明通道,需将
captureAlpha设为true,但MP4格式不支持透明,需改用PNG序列后再转格式 - Unity Recorder仅支持Editor环境运行,打包后的游戏无法使用该功能
内容的提问来源于stack exchange,提问作者Bertrand
相关产品推荐
相关产品推荐

