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

在我的 Unity 项目中,我有 C# 代码来获取 png 格式的预制件预览图像。


在 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”在当前上下文中不存在


我哪里做错了?


慕森卡
浏览 175回答 1
1回答

紫衣仙女

UnityEditor.AssetPreview属于UnityEditor命名空间。这只存在于 Unity 编辑器 istelf 中,并在构建中被删除。=> 您不能UnityEditor在构建中使用命名空间中的任何内容。基本上有两种解决方案可以UnityEditor从构建中排除某些内容:预处理器在 C# 中,您可以使用 in#if preprocessor来根据全局定义排除代码块。Unity 提供了这样的定义。在这种情况下使用例如#if UNITY_EDITOR     // CODE USING UnityEditor     #endifEditor文件夹如果整个脚本应从构建中排除,您只需将其放置在名为 的文件夹中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
打开App,查看更多内容
随时随地看视频慕课网APP