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のループに入れました。かなりハックです。AssetPreview メソッドが実際に機能しているかどうかを Unity に問い合わせてみます。

古い答え、無関係:

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 に答える