在OS X上使用Unity和System.Drawing

3

我正在尝试在OS X Mountain Lion上使用Mono中的System.Drawing来进行Unity(4.3.2)的开发。我有以下简单的C#脚本来验证它是否可行:

using UnityEngine;
using System.Drawing;

public class DrawingTest : MonoBehaviour {

    void Start () {

        Bitmap bitmap = new Bitmap(128, 128, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

        System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);

        g.DrawRectangle(new Pen(System.Drawing.Color.Red, 4), 0, 0, 128, 128);

        bitmap.Save("/Users/username/drawing.png", System.Drawing.Imaging.ImageFormat.Png);
    }

}

我已将System.Drawing.dll文件复制到项目的Assets/Plugins文件夹中。我还复制了/Applications/Unity/Unity.app/Contents/Frameworks/Mono/lib/libgdiplus.dylib文件到Assets/Plugins中。这样可以在Monodevelop中顺利构建(CMD-B)所有内容。然而,在尝试在Unity编辑器中运行项目时,我收到了以下错误消息:

DllNotFoundException: libgdiplus.dylib
System.Drawing.GDIPlus..cctor ()
Rethrow as TypeInitializationException: An exception was thrown by the type initializer for System.Drawing.GDIPlus
System.Drawing.Bitmap..ctor (Int32 width, Int32 height, PixelFormat format)
(wrapper remoting-invoke-with-check) System.Drawing.Bitmap:.ctor (int,int,System.Drawing.Imaging.PixelFormat)
DrawingTest.Start () (at Assets/DrawingTest.cs:9)

我还添加了以下这行代码:
<dllmap dll="gdiplus.dll" target="libgdiplus.dylib" os="osx"/>

为了让Unity能够找到要加载的DLL,我尝试编辑 /Applications/Unity/Unity.app/Contents/Frameworks/Mono/etc/mono/config 文件。同时,我也将项目的Player Settings设置为使用“.NET 2.0”兼容级别(而不是子集)。即使我构建了该项目并运行独立可执行文件,问题仍然存在。

如果我尝试使用Mono.Cairo(自然使用不同的DLL),也会出现同样的问题。我的问题是,如何在Mac上的Unity中使用System.Drawing或者其他默认未启用的程序集?我还想最终将该应用程序部署给最终用户,因此,如果独立构建需要使用不同的技巧,则非常感激。


你想做什么?我真的看不出为什么你想在你的Unity应用程序中使用那个库。也许如果你提供一些关于你目标的背景信息,会帮助其他人给你一个答案。 - Alex
@alex 我想将一些矢量图形(填充的凸多边形和贝塞尔曲线)在内存中渲染以生成纹理。我宁愿使用Cairo,但我认为让System.Drawing工作会更容易。但是,它们似乎都有同样的问题。 - user3142849
你找到任何解决方案了吗? - dehinrsu
2个回答

0

在 macOS 上安装 GDI+ 的 Homebrew 包:

brew install mono-libgdiplus

更新:我已经搜索了相同的问题,并找到了另一个答案,我尝试了一下,对我有用:

您可以使用以下行更新配置文件/Applications/Unity/Hub/Editor/X.X.X/Unity.app/Contents/MonoBleedingEdge/etc/mono/config: < dllmap dll="gdiplus" target="/Library/Frameworks/Mono.framework/Versions/XXX/lib/libgdiplus.dylib" / > < dllmap dll="gdiplus.dll" target="/Library/Frameworks/Mono.framework/Versions/XXX/lib/libgdiplus.dylib" / > (XXX是您的Unity版本)


-1

根据你的评论,我可以推荐两件事情:

  1. 在这里 here查看。这样,您就可以在3D中创建所有形状,这也让您能够在场景中可视化它们。如果我没记错,Vectrosity(一个很棒的Unity插件)就是这样做的。在内存中制作位图并将坐标从3D空间转移到2D应该相对简单。

  2. 您可以通过自己进行数学计算,直接向Texture2d对象(使用SetPixel)在内存中绘制像素。Unity具有Rect形状,您可以创建其他形状以适应您的需要。以下是一些应该有帮助的链接。

Polygon Contains

过程式基元

希望这可以帮到您。


2
并不是真正回答手头的问题。是的,有“可能”的解决方案,但对于许多System.Drawing/Mono.Cairo使用情况来说,并不可行。 - Slipp D. Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接