avatar/Assets/VRCFury/Scripts/Editor/VF/PreSaveVerifier.cs

50 lines
2.1 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;
using VF.Model;
namespace VF {
public class PreSaveVerifier : UnityEditor.AssetModificationProcessor
{
static string[] OnWillSaveAssets(string[] paths) {
var blocked = new List<string>();
foreach (var path in paths) {
if (typeof(SceneAsset) == AssetDatabase.GetMainAssetTypeAtPath(path)) {
for (int n = 0; n < SceneManager.sceneCount; ++n) {
var scene = SceneManager.GetSceneAt(n);
if (scene.path == path) {
var brokenComponents = scene.GetRootGameObjects()
.SelectMany(obj => obj.GetComponentsInChildren<VRCFuryComponent>(true))
.Where(vrcf => vrcf.IsBroken());
foreach (var brokenComponent in brokenComponents) {
blocked.Add(brokenComponent.gameObject.name + " in " + path);
}
}
}
} else {
var isBroken = AssetDatabase.LoadAllAssetsAtPath(path)
.OfType<VRCFuryComponent>()
.Any(asset => asset.IsBroken());
if (isBroken) {
blocked.Add(path);
}
}
}
if (blocked.Count > 0) {
EditorUtility.DisplayDialog("VRCFury Error",
"These assets have been blocked from saving, because doing so would corrupt the contained" +
" VRCFury components. You may need to update VRCFury using Tools -> VRCFury -> Update VRCFury," +
" or report the issue to https://discord.com/vrcfury.\n\n" +
string.Join("\n", blocked),
"Ok");
paths = paths.ToList().Where(e => !blocked.Contains(e)).ToArray();
}
return paths;
}
}
}