You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

75 lines
2.4 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEditor.Search;
using UnityEngine;
using UnityEngine.Search;
using UnityEngine.VFX;
static class VFXPicker
{
internal static void Pick(VisualEffectAsset vfxAsset, Action<VisualEffect> selectHandler)
{
var viewState = new SearchViewState(
SearchService.CreateContext(CreateSceneRefProvider(vfxAsset)),
(item, canceled) => SelectItem(item, canceled, selectHandler));
viewState.title = "Visual Effect";
viewState.flags |= SearchViewFlags.DisableInspectorPreview | SearchViewFlags.CompactView;
SearchService.ShowPicker(viewState);
}
static void SelectItem(SearchItem item, bool canceled, Action<VisualEffect> selectHandler)
{
if (!canceled)
{
if (item?.ToObject<GameObject>() is { } go
&& go.TryGetComponent(typeof(VisualEffect), out var component)
&& component is VisualEffect vfx)
{
selectHandler(vfx);
}
else
{
selectHandler(null);
}
}
}
static SearchProvider CreateSceneRefProvider(VisualEffectAsset vfxAsset)
{
return new SearchProvider("sref", "Visual Effect", (context, provider) => FetchSceneRefs(vfxAsset, context.searchQuery));
}
static IEnumerable<SearchItem> FetchSceneRefs(VisualEffectAsset vfxAsset, string userQuery)
{
var sceneProvider = SearchService.GetProvider("scene");
var path = AssetDatabase.GetAssetPath(vfxAsset);
var searchQuery = BuildQuery(path, userQuery);
using (var query = SearchService.CreateContext(sceneProvider, searchQuery))
using (var request = SearchService.Request(query))
{
return request.Where(x => IsValidItem(x, vfxAsset));
}
}
static bool IsValidItem(in SearchItem item, VisualEffectAsset vfxAsset)
{
return item.ToObject<GameObject>().TryGetComponent(typeof(VisualEffect), out var component)
&& component is VisualEffect vfx
&& vfx.visualEffectAsset == vfxAsset;
}
static string BuildQuery(in string refPath, in string userQuery)
{
string baseQuery = $"ref=\"{refPath}\"";
return string.IsNullOrEmpty(userQuery)
? baseQuery
: $"{baseQuery} ({userQuery})";
}
}