在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'在当前上下文中不存在
我在哪里弄错了?
答案 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