using System; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.Timeline; using Object = UnityEngine.Object; namespace UnityEditor.Timeline.Signals { class SignalManager : IDisposable { static SignalManager m_Instance; readonly List m_assets = new List(); internal static SignalManager instance { get { if (m_Instance == null) { m_Instance = new SignalManager(); m_Instance.Refresh(); } return m_Instance; } set { m_Instance = value; } } internal SignalManager() { SignalAsset.OnEnableCallback += Register; } public static IEnumerable assets { get { foreach (var asset in instance.m_assets) { if (asset != null) yield return asset; } } } public static SignalAsset CreateSignalAssetInstance(string path) { var newSignal = ScriptableObject.CreateInstance(); newSignal.name = Path.GetFileNameWithoutExtension(path); var asset = AssetDatabase.LoadMainAssetAtPath(path) as SignalAsset; if (asset != null) { TimelineUndo.PushUndo(asset, Styles.UndoCreateSignalAsset); EditorUtility.CopySerialized(newSignal, asset); Object.DestroyImmediate(newSignal); return asset; } AssetDatabase.CreateAsset(newSignal, path); return newSignal; } public void Dispose() { SignalAsset.OnEnableCallback -= Register; } void Register(SignalAsset a) { m_assets.Add(a); } void Refresh() { var guids = AssetDatabase.FindAssets("t:SignalAsset"); foreach (var g in guids) { var path = AssetDatabase.GUIDToAssetPath(g); var asset = AssetDatabase.LoadAssetAtPath(path); m_assets.Add(asset); } } } }