为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕森卡 2023-06-25 14:30:28
在我的 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”在当前上下文中不存在我哪里做错了?
查看完整描述

1 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

UnityEditor.AssetPreview属于UnityEditor命名空间。

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

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


基本上有两种解决方案可以UnityEditor从构建中排除某些内容:

预处理器

在 C# 中,您可以使用 in#if preprocessor来根据全局定义排除代码块。Unity 提供了这样的定义。在这种情况下使用例如

#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


查看完整回答
反对 回复 2023-06-25
  • 1 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信