错误CS0103:名称“ AssetPreview”在当前上下文中不存在

时间:2019-07-15 16:54:45

标签: c# unity3d

在Unity项目中,我使用C#代码获取png格式的Prefabs预览图像。

在Unity Play模式下,此脚本没有错误,一切正常,但是当我尝试构建项目时,却收到错误消息。

我花了很多时间试图弄明白我在哪里犯了一个错误,但没有结果。

一些身体可以帮助解决这个问题吗?

C#脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System;

public class LoadTexture : MonoBehaviour
{
    [System.Serializable]
    public class LoadTex
    {
        public string name;
        public GameObject texture;
        public Texture2D gameObjectTex;
        public Texture gameObjTex;
    }

    public List<LoadTex> ItemTablezz = new List<LoadTex>();

    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0; i < ItemTablezz.Count; i++)
        {
            var getImage = UnityEditor.AssetPreview.GetAssetPreview(ItemTablezz[i].texture);
            print(getImage);

            ItemTablezz[i].gameObjectTex = getImage;
        }
    }

    // Update is called once per frame
    void Update()
    {
        CheckIfNull();
    }

    void CheckIfNull()
    {
        for (int k = 0; k < ItemTablezz.Count; k++)
        {
            Texture2D tex = new Texture2D(128, 128, TextureFormat.RGBA32, false);
            Color[] colors = ItemTablezz[k].gameObjectTex.GetPixels();
            int i = 0;
            Color alpha = colors[i];
            for (; i < colors.Length; i++)
            {
                if (colors[i] == alpha)
                {
                    colors[i].a = 0;
                }
            }

            tex.SetPixels(colors);
            tex.Apply();
            byte[] png = tex.EncodeToPNG();
            File.WriteAllBytes(Application.persistentDataPath + "/" + ItemTablezz[k].name + ".png", png);
        }
    }
}
  

错误CS0103:名称'AssetPreview'在当前上下文中不存在

我在哪里弄错了?

1 个答案:

答案 0 :(得分:1)

UnityEditor.AssetPreview属于UnityEditor命名空间。

这仅存在于Unity编辑器istelf中,并在构建中删除。

=>您不能在构建中使用UnityEditor名称空间中的任何内容。


为了从构建中排除UnityEditor东西,基本上有两种解决方案:

预处理器

在c#中,您可以使用#if preprocessor以便根据全局定义排除代码块。 Unity提供了这样的defines。在这种情况下,请使用

#if UNITY_EDITOR
    // CODE USING UnityEditor
#endif

Editor文件夹

如果要从构建中排除整个脚本,则可以将其放置在名为Editor的文件夹中。这将使它完全脱离构建。


要在构建中使用此脚本,您要么必须使用另一个库,要么在Unity编辑器中运行一次此脚本,然后将这些引用存储在构建中,例如使用[ContextMenu]属性:

    void Start()
    {
#if UNITY_EDITOR
        LoadPreviewImages();
#endif

        // if nothing more comes here
        // rather remove this method entirely
        ...
    }

#if UNITY_EDITOR
    // This allows you to call this method 
    // from the according components context menu in the Inspector
    [ContextMenu("LoadPreviewImages")]
    private void LoadPreviewImages()
    {
        foreach (var loadText in ItemTablezz)
        {
            var getImage = UnityEditor.AssetPreview.GetAssetPreview(loadText.texture);
            print(getImage);
            loadText.gameObjectTex = getImage;
        }
    }
#endif