docs.unity3d.com
Search Results for

    Show / Hide Table of Contents

    Command line recorder script

    This page provides the full version of an example script you can use to set up your project for recording from a command line.

    For more details about the purpose, structure, and use of this script, see the corresponding tutorial: Launch Recordings from the Command Line.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using UnityEditor;
    using UnityEditor.Presets;
    using UnityEditor.Recorder;
    using UnityEngine;
    
    public class CommandLineRecorder : MonoBehaviour
    {
        // The RecorderController starts and stops the recording.
        private RecorderController m_Controller;
    
        // The first frame to record.
        [SerializeField] private int m_startFrame;
    
        // The last frame to record.
        [SerializeField] private int m_endFrame;
    
        // The path to the Recorder Settings preset file to use for the recording.
        [SerializeField] private string m_presetPath;
    
        static RecorderSettings LoadRecorderSettingsFromPreset(string presetPath)
        {
            // Load the Preset from the provided path.
            var preset = AssetDatabase.LoadAssetAtPath<Preset>(presetPath);
    
            // Use reflection to determine the type of the RecorderSettings to use
            // (for example a MovieRecorderSettings).
            var recorderSettingsTypes =
                TypeCache.GetTypesDerivedFrom<RecorderSettings>().ToList();
    
            var recorderSettingsType = recorderSettingsTypes.SingleOrDefault(
                t => t.Name == preset.GetTargetTypeName());
    
            if (recorderSettingsType == null)
            {
                Debug.Log("Preset must be a subclass of RecorderSettings");
                return null;
            }
    
            // Create a new RecorderSettings instance and apply the Preset to it.
            RecorderSettings outSettings =
                (RecorderSettings)ScriptableObject.CreateInstance(recorderSettingsType);
    
            preset.ApplyTo(outSettings);
            outSettings.name = preset.name;
    
            return outSettings;
        }
    
        void StartRecording(string presetPath, int startFrame, int endFrame)
        {
            // Create RecorderSettings from the provided Preset path.
            RecorderSettings recorderSettings = LoadRecorderSettingsFromPreset(presetPath);
            recorderSettings.FrameRate = 60;
    
            // Create a new RecorderControllerSettings to set the start and end frame for
            // the recording session and add the RecorderSettings to it.
            var controllerSettings = ScriptableObject.CreateInstance<RecorderControllerSettings>();
            controllerSettings.AddRecorderSettings(recorderSettings);
            controllerSettings.SetRecordModeToFrameInterval(startFrame, endFrame);
    
            // Create and setup a new RecorderController and start the recording.
            m_Controller = new RecorderController(controllerSettings);
            m_Controller.PrepareRecording();
            m_Controller.StartRecording();
        }
    
        void OnEnable()
        {
            // This is called once when Unity enters PlayMode.
            StartRecording(m_presetPath, m_startFrame, m_endFrame);
        }
    
        void Update()
        {
            // This is called on every frame when Unity is in PlayMode.
            if (m_Controller != null && !m_Controller.IsRecording())
            {
                // When the RecorderController has no more frame to record, stop
                // the recording and exit the PlayMode.
                m_Controller.StopRecording();
                EditorApplication.ExitPlaymode();
            }
        }
    
        static Dictionary<string, string> GetCommandLineArgs()
        {
            string[] cmdLineParts = Environment.GetCommandLineArgs();
            Dictionary<String, String> arguments = new Dictionary<string, string>();
    
            // These are the 3 arguments this MonoBehaviour expects to start a recording.
            string[] args = { "-startFrame", "-endFrame", "-presetPath" };
    
            var idx = 1;
            while (idx < cmdLineParts.Length)
            {
                var part = cmdLineParts[idx];
                if (args.Contains(part))
                {
                    var argName = part.TrimStart('-');
                    arguments[argName] = cmdLineParts[idx + 1];
                }
    
                idx++;
            }
    
            return arguments;
        }
    
        private void SetRecordingInfo(int startFrame, int endFrame, string presetPath)
        {
            m_startFrame = startFrame;
            m_endFrame = endFrame;
            m_presetPath = presetPath;
            AssetDatabase.SaveAssets();
        }
    
        public static void ExecuteCommandLine()
        {
            // Parse the command line arguments to find the start and end frame and
            // the path to the Recorder Settings Preset file to use.
            var args = GetCommandLineArgs();
            if (!args.TryGetValue("startFrame", out var startFrame))
                throw new ArgumentException("[ERROR] Expected argument -startFrame");
    
            if (!args.TryGetValue("endFrame", out var endFrame))
                throw new ArgumentException("[ERROR] Expected argument -endFrame");
    
            if (!args.TryGetValue("presetPath", out var presetPath))
                throw new ArgumentException("[ERROR] Expected argument -presetPath");
    
            // Find the GameObject that has the CommandLineRecorder MonoBehaviour attached
            // to it and set the recording information provided by the command line arguments.
            var sceneCommandLineRecorder =
                FindObjectsByType<CommandLineRecorder>(FindObjectsSortMode.None).First();
    
            sceneCommandLineRecorder.SetRecordingInfo(
                Convert.ToInt32(startFrame),
                Convert.ToInt32(endFrame),
                presetPath);
    
            // Enter PlayMode: which starts the Recording (OnEnable)
            EditorApplication.EnterPlaymode();
        }
    }
    
    In This Article
    Back to top
    Copyright © 2024 Unity Technologies — Trademarks and terms of use
    • Legal
    • Privacy Policy
    • Cookie Policy
    • Do Not Sell or Share My Personal Information
    • Your Privacy Choices (Cookie Settings)