【问题标题】:GetAssetPreview always returns null for UnityEngine.UI.ImageGetAssetPreview 始终为 UnityEngine.UI.Image 返回 null
【发布时间】:2022-01-27 20:49:52
【问题描述】:

我有一组预制件,我想在我的自定义编辑器中显示预览。这适用于具有网格渲染器的游戏对象,例如基本四边形。但是,当我尝试在带有 UnityEngine.UI.Image 和画布渲染器的游戏对象上使用 AssetPreview.GetAssetPreview(tilePrefab.gameObject); 时,它总是返回 null。

下面是绘制预览的代码部分。

public class MapEditor : Editor
{
    public override void OnInspectorGUI()
    {
        for (int prefabIndex = 0; prefabIndex < TileSet.TilePrefabs.Count; prefabIndex++)
            DrawIconTexture(prefabIndex, columnCount);
    }

    private void DrawIconTexture(int prefabIndex, int columnCount)
    {
        TileBehaviour tilePrefab = TileSet.TilePrefabs[prefabIndex];
        Texture iconTexture = AssetPreview.GetAssetPreview(tilePrefab.gameObject);
        Rect iconRect = GetIconRect(prefabIndex, columnCount);

        if (iconTexture != null)
            GUI.DrawTexture(iconRect, iconTexture);
        else if (AssetPreview.IsLoadingAssetPreview(tilePrefab.gameObject.GetInstanceID()))
            Repaint();
    }
}

我知道 GetAssetPreview 会异步加载资产,这可以通过重绘来解决。我也试过了

while(iconTexture == null)
    iconTexture = AssetPreview.GetAssetPreview(tilePrefab.gameObject);

但这永远不会结束。

我也尝试过使用图片的纹理

if (iconTexture == null)
    iconTexture = tilePrefab.GetComponent<Image>().sprite.texture;

但这不起作用,因为精灵在图集中并且所有图集都显示出来了。

【问题讨论】:

    标签: unity3d unity3d-editor


    【解决方案1】:

    编辑:误读了问题。我实际上尝试使用 IsLoadingAssetPreview 和 IsLoadingAssetPreviews 几个小时,但没有成功。我最终使用了一个悲伤的小技巧

    if (_previews.All(pair => pair.Value != null)) return;
    _previews = GeneratePreviews();
    

    我把它放在我的 EditorWindow 的 Update() 循环中。这很 hacky,我要问 Unity AssetPreview 方法是否真的有效。

    旧答案,无关:

    您没有正确使用 while 循环和 GetAssetPreview。

    GetAssetPreview 将启动预览的异步加载。要知道预览是否已完全加载,您需要致电AssetPreview.IsLoadingAssetPreview

    一种非常简单而残酷的做法(它会阻止执行)是:

    var preview = AssetPreview.GetAssetPreview(item);
    while (AssetPreview.IsLoadingAssetPreview(item.GetInstanceID())) {
         // Loading
    }
    

    像往常一样,小心使用 while 循环。请注意,还有一个不带参数的AssetPreview.IsLoadingAssetPreviews 方法。

    【讨论】:

    • 如果您检查我的问题,那就是我如何使用它(否则如果)。唯一的区别是我不使用一段时间,我使用重绘导致函数在下一帧被调用。
    • 对不起,错过了...我刚刚与 AssetPreview.IsloadingAssetPreviews() 战斗了 4 个小时,但没有成功。我最终将对预览的引用存储在一个数组中,并检查了我的 EditorWindow if(previewsArray.Any(t =&gt; t == null) { GetPreviews() } 的每个 Update()。由于预览是缓存的,因此无需太多开销就可以解决问题...
    【解决方案2】:

    你应该只使用“使用 UnityEditor”

    【讨论】:

      猜你喜欢
      • 2017-06-28
      • 1970-01-01
      • 2021-09-13
      • 2016-05-31
      • 2015-08-15
      • 2012-03-18
      • 2016-11-04
      • 2016-07-28
      • 2010-11-08
      相关资源
      最近更新 更多