【问题标题】:Making a Texture2D readable in Unity via code [duplicate]通过代码使Texture2D在Unity中可读[重复]
【发布时间】:2014-09-30 07:15:14
【问题描述】:

我有一些要转换为 .png 图像文件的 AssetBundle。

它们是 Texture2D 资产,但问题是它们不是 Read Enable,当 我尝试使用

将它们转换为 PNG
var _bytes = _texture2d.EncodeToPNG();

命令,我收到以下错误消息:

纹理“纹理名称”不可读,无法从脚本访问纹理内存。您可以使纹理在 纹理导入设置。

我真的无法访问纹理导入设置,因为它们来自资产包,而且一切都是用代码制作的。

有人对此有解决方法吗?

谢谢

【问题讨论】:

  • 你能用this使它可读吗?
  • 感谢 Aldour,但我不这么认为。当您在编辑器中导入纹理时,Textureimporter 会起作用,但图像已经转换为 Texture2D 对象并存储为 AssetBundle,因此它们不再通过 Textureimporter。

标签: c# unity3d texture2d


【解决方案1】:

这是一个可行的解决方案:

public static void SetTextureImporterFormat( Texture2D texture, bool isReadable)
{
    if ( null == texture ) return;

    string assetPath = AssetDatabase.GetAssetPath( texture );
    var tImporter = AssetImporter.GetAtPath( assetPath ) as TextureImporter;
    if ( tImporter != null )
    {
        tImporter.textureType = TextureImporterType.Advanced;

        tImporter.isReadable = isReadable;

        AssetDatabase.ImportAsset( assetPath );
        AssetDatabase.Refresh();
    }
}

【讨论】:

  • 非常感谢!
  • 由于此解决方案依赖于 AssetDatabase(位于 UnityEditor 命名空间中),因此只能在编辑器中使用。但是,它在构建时失败(找不到类型或命名空间名称“UnityEditor”。)
  • 抱歉,这只适用于编辑器
  • @Schnodderbalken 这个脚本必须放在“Editor”目录中。
  • 一个潜在的问题,运行此代码后,游戏对象对该纹理的引用将引发 nullreferenceexception。
【解决方案2】:

在项目中选择纹理,打开检查器窗口,将纹理类型设置为“高级”,切换“启用读写”。

【讨论】:

  • 恐怕这不可能,纹理根本不在项目中,我只有从 Texture2D 对象创建的 Assetbundle,所以我无法在编辑器中制作任何版本。我正在制作的实用程序会加载这些 Assetbundle,以便再次导出图像,这样我们就可以在 Photoshop 中对其进行编辑。
  • 您仍然可以将不可读的纹理渲染到 RenderTexture 然后读取它。
  • 好点,游戏开发萌芽。我会试试这个解决方法,谢谢。
  • 这不是使用new Texture2D(...) 制作的纹理的有效案例。我怎样才能读取这样的纹理,或者我应该在设置像素之前使用 Color[]?
  • 我认为问题是“通过代码在 Unity 中使 Texture2D 可读”而不是“通过 Unity Inspector”
猜你喜欢
  • 1970-01-01
  • 2017-11-27
  • 2017-02-05
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
相关资源
最近更新 更多