using System.Collections.Generic; using UnityEditor.Presets; using UnityEngine; namespace UnityEditor.Recorder { /// /// Class that models a Recorder List (a stack of preset Recorder Settings instances) that you can save and load for reuse into a Recorder Window. /// public class RecorderControllerSettingsPreset : ScriptableObject { [SerializeField] Preset m_Model; [SerializeField] List m_RecorderPresets = new List(); internal Preset model { get { return m_Model; } } internal Preset[] recorderPresets { get { return m_RecorderPresets.ToArray(); } } /// /// Saves the specified Recorder List to a file on disk. Note that this method doesn't save Scene references (such as a GameObject reference in Animation Recorder Settings). /// /// The Recorder List to save. /// The path on disk where to save the Recorder List. You must specify a path relative to the project. public static void SaveAtPath(RecorderControllerSettings model, string path) { var data = CreateInstance(); var copy = Instantiate(model); copy.name = model.name; // TODO Remove this once there's an official way to exclude some field from being save into presets copy.ClearRecorderSettings(); // Do not save asset references in the preset. var p = new Preset(copy) { name = model.name }; data.m_Model = p; foreach (var recorder in model.RecorderSettings) { var settingsClone = Instantiate(recorder); settingsClone.name = recorder.name; settingsClone.OnAfterDuplicate(); // might need to update bindings for AnimationRecorder. var rp = new Preset(settingsClone) { name = settingsClone.name }; data.m_RecorderPresets.Add(rp); DestroyImmediate(settingsClone); } //var preset = new Preset(data); //AssetDatabase.CreateAsset(preset, "Assets/test.preset"); var preset = data; //new Preset(data); AssetDatabase.CreateAsset(preset, path); //AssetDatabase.CreateAsset(preset, "Assets/test.preset"); foreach (var rp in data.m_RecorderPresets) AddHiddenObjectToAsset(rp, preset); AddHiddenObjectToAsset(p, preset); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } /// /// Applies the current Recorder List to the specified RecorderControllerSettings instance. /// /// The RecorderControllerSettings instance to apply the Recorder List to. public void ApplyTo(RecorderControllerSettings prefs) { prefs.ReleaseRecorderSettings(); m_Model.ApplyTo(prefs); foreach (var rp in m_RecorderPresets) { var r = (RecorderSettings)CreateFromPreset(rp); r.name = rp.name; prefs.AddRecorderSettings(r); } prefs.Save(); } static ScriptableObject CreateFromPreset(Preset preset) { var instance = CreateInstance(preset.GetTargetFullTypeName()); preset.ApplyTo(instance); return instance; } static void AddHiddenObjectToAsset(UnityEngine.Object objectToAdd, UnityEngine.Object assetObject) { objectToAdd.hideFlags |= HideFlags.HideInHierarchy; AssetDatabase.AddObjectToAsset(objectToAdd, assetObject); } } }