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;
}
}