2021-06-13 10:28:03 +02:00

79 lines
3.0 KiB
C#

using System.Collections;
using System.IO;
using UnityEditor;
using UnityEngine;
namespace AnimationImporter
{
/// <summary>
/// Utility functions for ScriptableObjects.
/// </summary>
public static class ScriptableObjectUtility
{
/// <summary>
/// Loads the save data from a Unity relative path. Returns null if the data doesn't exist.
/// </summary>
/// <returns>The saved data as a ScriptableObject, or null if not found.</returns>
/// <param name="unityPathToFile">Unity path to file (e.g. "Assets/Resources/MyFile.asset")</param>
/// <typeparam name="T">The ScriptableObject type</typeparam>
public static T LoadSaveData<T> (string unityPathToFile) where T : ScriptableObject
{
// Path must contain Resources folder
var resourcesFolder = string.Concat(
AssetDatabaseUtility.UnityDirectorySeparator,
AssetDatabaseUtility.ResourcesFolderName,
AssetDatabaseUtility.UnityDirectorySeparator);
if (!unityPathToFile.Contains(resourcesFolder))
{
var exceptionMessage = string.Format(
"Failed to Load ScriptableObject of type, {0}, from path: {1}. " +
"Path must begin with Assets and include a directory within the Resources folder.",
typeof(T).ToString(),
unityPathToFile);
throw new UnityException(exceptionMessage);
}
// Get Resource relative path - Resource path should only include folders underneath Resources and no file extension
var resourceRelativePath = GetResourceRelativePath(unityPathToFile);
// Remove file extension
var fileExtension = System.IO.Path.GetExtension(unityPathToFile);
resourceRelativePath = resourceRelativePath.Replace(fileExtension, string.Empty);
return Resources.Load<T>(resourceRelativePath);
}
/// <summary>
/// Loads the saved data, stored as a ScriptableObject at the specified path. If the file or folders don't exist,
/// it creates them.
/// </summary>
/// <returns>The saved data as a ScriptableObject.</returns>
/// <param name="unityPathToFile">Unity path to file (e.g. "Assets/Resources/MyFile.asset")</param>
/// <typeparam name="T">The ScriptableObject type</typeparam>
public static T LoadOrCreateSaveData<T>(string unityPathToFile) where T : ScriptableObject
{
var loadedSettings = LoadSaveData<T>(unityPathToFile);
if (loadedSettings == null)
{
loadedSettings = ScriptableObject.CreateInstance<T>();
AssetDatabaseUtility.CreateAssetAndDirectories(loadedSettings, unityPathToFile);
}
return loadedSettings;
}
private static string GetResourceRelativePath(string unityPath)
{
var resourcesFolder = AssetDatabaseUtility.ResourcesFolderName + AssetDatabaseUtility.UnityDirectorySeparator;
var pathToResources = unityPath.Substring(0, unityPath.IndexOf(resourcesFolder));
// Remove all folders leading up to the Resources folder
pathToResources = unityPath.Replace(pathToResources, string.Empty);
// Remove the Resources folder
pathToResources = pathToResources.Replace(resourcesFolder, string.Empty);
return pathToResources;
}
}
}