You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过脚本控制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:25:20