【发布时间】:2020-05-22 17:04:31
【问题描述】:
使用 Unity 2017.4.33f1-Personal。
我正在尝试使用 System.Drawing 命名空间中的 Image.FromFile 方法在游戏对象的逻辑中加载位图。请注意,我对将此 bmp 保存为资产或类似的东西不感兴趣。我只是想把它加载到我可以做一些计算的 RAM 中。我尝试了以下方法:
var result = Image.FromFile(
AssetDatabase.GetAssetPath(mainImg)
) as Bitmap;
但我收到以下错误:
InvalidProgramException: Invalid IL code in System.Drawing.Image:FromFile (string): IL_0000: ret
仅供参考,
-
mainImg是对Texture2D资源的引用 -
AssetDatabase.GetAssetPath(mainImg)解析为Assets/CustomPackages/SeededConstruction/PuzzleBuilder/Input/main.bmp
我还尝试了许多其他愚蠢的事情,包括获取绝对路径和用反斜杠替换正斜杠,如下所示:
var result = Image.FromFile(
Directory.GetCurrentDirectory()
+ "\\"
+ AssetDatabase.GetAssetPath(mainTileset)
.Replace('/', '\\')
) as Bitmap;
在这种情况下,路径解析为D:\_Projects\2dGenerator\PlatformGeneration\Assets\CustomPackages\SeededConstruction\PuzzleBuilder\Input\main.bmp。但是,这会返回与上述相同的错误。
我在这里做错了什么?看起来这种方法在普通的 .Net 应用程序中运行良好,为什么在 Unity 中不行?
【问题讨论】:
-
在 Unity 中开始使用
System.Drawing并不是一个好主意。相反,使用它的(非常广泛和强大的)纹理工具。见docs.unity3d.com/ScriptReference/ImageConversion.LoadImage.html -
无效的 IL 代码意味着 .Net 引擎本身无法解析您调用的任何函数。这就像灾难性的糟糕程度。它与路径或其他无关,您尝试执行的 .Net 程序集无效。
-
@3Dave 嗯,有道理。稍微改变一下这个问题,如果我有使用 System.Drawing 的 .dll 并且我想从 GameObject 调用这个 .dll,我有什么选择?
-
程序集需要针对您的 Unity 应用程序使用的相同框架和版本构建。但是,我没有看到任何使用
System.Drawing的 Unity 标题,因为通常没有理由这样做。如果这是第三方程序集,我会问它提供的哪些功能尚不可用。 -
我不知道为什么这个问题被否决了。如果投反对票的人再次出现,请就您投反对票的原因留下一些反馈。