using UnityEngine; using System; using UnityEditor; namespace Cinemachine.Editor { /// /// This class contains setting for the Impulse system. Specifically, it holds /// the Impulse Channel definitions. These work like Unity Layers, you can /// define and name them, and create masks to filter only the layers you want. /// [Serializable] public class CinemachineImpulseChannels : ScriptableObject { static CinemachineImpulseChannels sInstance = null; private static bool alreadySearched = false; /// Get the singleton instance of this object, or null if it doesn't exist public static CinemachineImpulseChannels InstanceIfExists { get { if (!alreadySearched) { alreadySearched = true; var guids = AssetDatabase.FindAssets("t:CinemachineImpulseChannels"); for (int i = 0; i < guids.Length && sInstance == null; ++i) sInstance = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath(guids[i])); } if (sInstance != null) sInstance.EnsureDefaultLayer(); return sInstance; } } /// Get the singleton instance of this object. Creates asset if nonexistant public static CinemachineImpulseChannels Instance { get { if (InstanceIfExists == null) { string newAssetPath = EditorUtility.SaveFilePanelInProject( "Create Impulse Channel Definition asset", "CinemachineImpulseChannels", "asset", "This editor-only file will contain the Impulse channels for this project"); if (!string.IsNullOrEmpty(newAssetPath)) { sInstance = CreateInstance(); AssetDatabase.CreateAsset(sInstance, newAssetPath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } } if (sInstance != null) { sInstance.EnsureDefaultLayer(); } return sInstance; } } // Make sure it has at least one layer in it void EnsureDefaultLayer() { if (ImpulseChannels == null || ImpulseChannels.Length == 0) ImpulseChannels = new string[] { "default" }; } /// The currently-defined Impulse channel names public string[] ImpulseChannels; } }