0

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

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

4

2 回答 2

1

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

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

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

旧答案,无关紧要:

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

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

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

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

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

于 2017-07-27T12:13:58.387 回答
-2

你应该只使用“使用 UnityEditor”

于 2022-01-27T12:49:52.417 回答