【发布时间】:2020-09-15 23:06:59
【问题描述】:
我正在构建一个自定义资产导入器,它从 JSON 文件中读取资产设置,然后将这些设置应用于 Unity 项目中的资产。我需要将这些设置应用于一系列资产。
我创建了一个编辑器窗口,点击按钮来测试我的代码,然后再将其实施到主项目中。
按钮点击事件:
private void ButtonClick()
{
string path = "Assets\\Audio";
var assetPaths = HelperFunctions.FindAssetsByType<AudioClip>(path, false);
for (int i = 0; i < assetPaths.Count; i++)
{
AudioClip audioClip = AudioClip.Create("", 128, 2, 8000, false);
Preset preset = new Preset(audioClip);
var importer = AssetImporter.GetAtPath(assetPaths[i]);
bool result = preset.ApplyTo(importer);
Debug.Log(result);
}
}
如您所见,我创建了一个空白音频剪辑,用于对预设进行建模。
然后,我使用 FindAssetByType 返回的路径为目标资产加载 AssetImporter,该路径返回我的资产路径,例如:"Assets/Audio/myaudiofile.mp3"
debug.log返回False,即申请失败。
我也无法以编程方式访问 AssetImporter 的某些属性,如下所示:
为什么 AssetImporter 无法应用我的新资产预设,为什么我无法访问代码截图中详述的属性?
'AssetImporter' does not contain a definition for 'defaultSampleSettings'
我也试过修改FindAssetsByType返回AssetDatabase返回的对象,如下:
T currentAsset = AssetDatabase.LoadAssetAtPath<T>(currentPath);
这会导致 Debug.Log 返回 true,但不会应用预设。
你可以在下面看到这段代码被注释掉了
这是我搜索资产的方式:
public static /*List<T>*/ List<string> FindAssetsByType<T>(string path) where T : UnityEngine.Object
{
List<string> assets = new List<string>();
//List<T> assets = new List<T>();
string searchString = string.Format("t:{0}", typeof(T));
searchString = searchString.Replace("UnityEngine.", "");
string[] guids = AssetDatabase.FindAssets(searchString, new string[] { path });
List<string> paths = AssetGuidToPath(guids);
foreach (var currentPath in paths)
{
T currentAsset = AssetDatabase.LoadAssetAtPath<T>(currentPath);
//assets.Add(currentAsset);
assets.Add(currentPath);
}
return assets;
}
确实需要一种方法来实现这一点吗?任何帮助将不胜感激!
【问题讨论】:
标签: c# unity3d unity-editor