当前位置: 首页 > news >正文

Unity基于Recoder的API写了一个随时录屏的工具

Tips:
需要有Recorder Package引用或存在在项目

using UnityEngine;
using UnityEditor;
using UnityEditor.Recorder;
using UnityEditor.Recorder.Input;
using System.IO;
using System;public class RecorderWindow : EditorWindow
{private RecorderController recorderController;private bool isRecording = false;private string outputPath = "Recordings";private string fileName = "Gameplay";private int resolutionWidth = 1920;private int resolutionHeight = 1080;private bool includeAudio = true;private bool showAdvanced = false;private int frameRate = 60;private bool autoTimestamp = true;private Vector2 scrollPosition;[MenuItem("Tools/Recorder Control")]public static void ShowWindow(){var window = GetWindow<RecorderWindow>("录制控制");window.minSize = new Vector2(350, 450);window.SetupRecorder();}private void SetupRecorder(){if (recorderController != null) return;var controllerSettings = ScriptableObject.CreateInstance<RecorderControllerSettings>();recorderController = new RecorderController(controllerSettings);}private void OnGUI(){scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);EditorGUILayout.Space(10);EditorGUILayout.LabelField("录制控制", EditorStyles.boldLabel);EditorGUILayout.Space(5);// Recording Statusvar status = isRecording ? "录制中" : "准备就绪";var statusColor = isRecording ? new Color(0.8f, 0.2f, 0.2f) : new Color(0.2f, 0.7f, 0.2f);var origColor = GUI.color;GUI.color = statusColor;EditorGUILayout.LabelField($"状态: {status}", EditorStyles.boldLabel);GUI.color = origColor;EditorGUILayout.Space(15);// Recording ControlsEditorGUILayout.BeginHorizontal();if (GUILayout.Button(isRecording ? "停止录制" : "开始录制", GUILayout.Height(40))){if (isRecording) StopRecording();else StartRecording();}if (GUILayout.Button("打开输出目录", GUILayout.Height(40))){OpenOutputFolder();}EditorGUILayout.EndHorizontal();EditorGUILayout.Space(20);EditorGUILayout.LabelField("录制设置", EditorStyles.boldLabel);EditorGUILayout.Space(10);// Output SettingsEditorGUILayout.BeginVertical("box");EditorGUILayout.LabelField("输出设置", EditorStyles.boldLabel);EditorGUILayout.BeginHorizontal();outputPath = EditorGUILayout.TextField("输出路径", outputPath);if (GUILayout.Button("浏览", GUILayout.Width(60))){outputPath = EditorUtility.SaveFolderPanel("选择输出目录", outputPath, "");}EditorGUILayout.EndHorizontal();EditorGUILayout.BeginHorizontal();fileName = EditorGUILayout.TextField("文件名称", fileName);autoTimestamp = EditorGUILayout.Toggle("添加时间戳", autoTimestamp, GUILayout.Width(150));EditorGUILayout.EndHorizontal();EditorGUILayout.EndVertical();// Video SettingsEditorGUILayout.BeginVertical("box");EditorGUILayout.LabelField("视频设置", EditorStyles.boldLabel);EditorGUILayout.BeginHorizontal();resolutionWidth = EditorGUILayout.IntField("宽度", resolutionWidth);resolutionHeight = EditorGUILayout.IntField("高度", resolutionHeight);EditorGUILayout.EndHorizontal();frameRate = EditorGUILayout.IntSlider("帧率", frameRate, 1, 120);includeAudio = EditorGUILayout.Toggle("包含音频", includeAudio);EditorGUILayout.EndVertical();// Advanced SettingsshowAdvanced = EditorGUILayout.Foldout(showAdvanced, "高级设置", true);if (showAdvanced){EditorGUILayout.BeginVertical("box");EditorGUILayout.HelpBox("这些设置用于特殊需求,通常使用默认值即可", MessageType.Info);EditorGUILayout.Space(5);if (GUILayout.Button("重置为默认设置")){ResetToDefaults();}EditorGUILayout.EndVertical();}EditorGUILayout.Space(20);EditorGUILayout.EndScrollView();// FooterEditorGUILayout.BeginVertical("box");EditorGUILayout.LabelField("快捷键: F9 - 开始/停止录制", EditorStyles.centeredGreyMiniLabel);EditorGUILayout.LabelField("输出目录: " + GetFullOutputPath(), EditorStyles.centeredGreyMiniLabel);EditorGUILayout.EndVertical();}private void StartRecording(){SetupRecorder();var controllerSettings = recorderController.Settings;controllerSettings.ClearRecorderSettings(); // Clear existing settings// Create video recordervar videoRecorder = ScriptableObject.CreateInstance<MovieRecorderSettings>();videoRecorder.name = "Gameplay Recorder";videoRecorder.Enabled = true;// Output settingsvideoRecorder.OutputFile = Path.Combine(outputPath, fileName);if (autoTimestamp){videoRecorder.OutputFile += "_" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");}// Resolution settingsvideoRecorder.ImageInputSettings = new GameViewInputSettings{OutputWidth = resolutionWidth,OutputHeight = resolutionHeight};// Video formatvideoRecorder.VideoBitRateMode = VideoBitrateMode.High;videoRecorder.OutputFormat = MovieRecorderSettings.VideoRecorderOutputFormat.MP4;// Audio settingsif (includeAudio){var audioRecorder = ScriptableObject.CreateInstance<AudioRecorderSettings>();audioRecorder.Enabled = true;controllerSettings.AddRecorderSettings(audioRecorder);}// Frame rate settingscontrollerSettings.SetRecordModeToManual();controllerSettings.FrameRate = frameRate;// Add video recordercontrollerSettings.AddRecorderSettings(videoRecorder);// Start recordingrecorderController.PrepareRecording();recorderController.StartRecording();isRecording = true;Debug.Log($"录制已开始: {GetFullOutputPath()}.mp4");}private void StopRecording(){if (recorderController != null){recorderController.StopRecording();Debug.Log($"录制已停止,文件保存至: {GetFullOutputPath()}.mp4");}isRecording = false;}private string GetFullOutputPath(){string fullPath = Path.Combine(Directory.GetCurrentDirectory(), outputPath, fileName);if (autoTimestamp){fullPath += "_" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");}return fullPath;}private void OpenOutputFolder(){string fullPath = Path.Combine(Directory.GetCurrentDirectory(), outputPath);if (!Directory.Exists(fullPath)){Directory.CreateDirectory(fullPath);}EditorUtility.RevealInFinder(fullPath);}private void ResetToDefaults(){outputPath = "Recordings";fileName = "Gameplay";resolutionWidth = 1920;resolutionHeight = 1080;includeAudio = true;frameRate = 60;autoTimestamp = true;}private void OnInspectorUpdate(){if (isRecording && recorderController != null){Repaint();}}private void Update(){// Handle F9 key for recordingif (Event.current != null && Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.F9){if (isRecording) StopRecording();else StartRecording();Event.current.Use();}}private void OnDestroy(){if (isRecording){StopRecording();}}
}

在这里插入图片描述

http://www.xdnf.cn/news/1260235.html

相关文章:

  • Linux Shell:Nano 编辑器备忘
  • ConcurrentDictionary 详解:.NET 中的线程安全字典
  • simulink tlc如何通过tlc写数据入文件
  • Spring Boot + Angular 实现安全登录注册系统:全栈开发指南
  • 深入理解 Java AWT Container:原理、实战与性能优化
  • 使用Prometheus + Grafana + node_exporter实现Linux服务器性能监控
  • 【3d61638 渍韵】001 png pdf odt 5与明天各种号(虚拟文章スミレ数据)
  • 从零开始构建【顺序表】:C语言实现与项目实战准备
  • 【前端】纯代码实现Power BI自动化
  • 破界之光:DeepSeek 如何重构AI搜索引擎的文明坐标 || #AIcoding·八月创作之星挑战赛#
  • 点播服务器
  • Day10 SpringAOP
  • Linux 学习 ------Linux 入门(上)
  • DuoPlus支持导入文件批量配置云手机参数,还优化了批量操作和搜索功能!
  • DigitalProductId解密算法php版
  • 三种经典寻路算法对比
  • 在 Mac 上安装 IntelliJ IDEA
  • 2025产品经理接单经验分享与平台汇总
  • 2025最新版天猫图片搜索API全解析:从图像识别到商品匹配实战
  • TensorFlow深度学习实战(29)——自监督学习(Self-Supervised Learning)
  • 存储管理、XFS 增量备份恢复、LVM
  • 【Qt开发】常用控件(二) -> enabled
  • GoLand 项目从 0 到 1:第六天 —— 权限接口开发与问题攻坚
  • npm run 常见脚本
  • HarmonyOS SDK助力讯飞听见App能力建设
  • Java技术栈/面试题合集(21)-Docker篇
  • 仅需8W,无人机巡检系统落地 AI 低空智慧城市!可源码交付
  • ADB打印设备日志相关
  • WWDC 25 玻璃态星际联盟:SwiftUI 视图协同“防御协议”
  • 深入理解 robots.txt:网站与搜索引擎的 “沟通协议”