Unity3D 调用 winform的颜色对话框

在Unity 的 安装目标(一般是”D:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0“)中有一些直接可以放置在Plugins文件夹下的动态连接库文件,其中System.Drawing和Sytem.Windows.Form是文本的核心。

由于需要一个展示用的Demo,其中需要修改一些颜色的参数,最好能有个对话框。刚好前一段时间用到了选择文件和保存文件的winform的文件对话框,这里就试了试利用winform自己的颜色调节对话框来选择一种颜色吧。在实际操作过程中遇到了颜色转换问题,加深了对颜色格式的认识。、

(如上图所示,由于不确定项目经理需要什么背景颜色,或者到时候又需要修改比较麻烦,这里就直接写个背景色修改,让他自己改去。)

点击背景色按扭(button 图片设置为透明了),希望弹出一个对话框:

在Start里添加这个Button的事件:(或者在面版上注册)

colorBtn.onClick.AddListener (SetBgColor);

我们需要的是在SetBgColor这个方法中,出现一个对话框,因此在Start中还要初始化一个全局的颜色对话框:(private ColorDialog dialog;

       dialog = new ColorDialog ();
        dialog.AllowFullOpen=true;
        dialog.FullOpen=false;
        dialog.ShowHelp=false;

在SetBgColor中,打开这个对话框,并等待用户选择结束:

 //        file://恢复原
//        dialog.ShowDialog();
        if (DialogResult.OK == dialog.ShowDialog()) {
            System.Drawing.Color m_color = dialog.Color;

            UnityEngine.Color newColor = W2UColor(m_color);
            m_Camera.backgroundColor =newColor;
        }

其中W2UColor是另一个方法,用于将Winform中的颜色转换为Unity3d中的颜色,这是下一步的问题,先看看打开的效果吧:(由于写在主线程中了,unity会卡死等待结束,如果需要卡死等待,更标准的应该要开一个线程才行)

打开到是好办,关键是unity 的rgba  和 System.Drawing的rgba 不一样,要进行一点换算,于是在W2UColor中写入如下内容便可:

UnityEngine.Color newColor = new UnityEngine.Color (color.R / 255f, color.G/ 255f, color.B/ 255f, color.A/255f);
        return newColor;

最后再来看看得到的背景效果,要不就选左下第二个试试:

貌似还可以,唯一的缺点就是winform界面有点丑了~

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。

经过一段时间的研究,其实还有更合理的一种方法,便是直接访问windows的Api打开对应的窗口,涉及到c#和window数据类型的转换,不过网上相关的资料也是比较多的

windos窗口操作API

ColorDialog

C#中对应win32 API原型函数的一些数据类型


最后实现可用的相关C#类如下:

  [DllImport("comdlg32.dll", CharSet = CharSet.Auto)]
    public static extern bool ChooseColorA([In, Out] CHOOSECOLOR pChoosecolor);//对应的win32API

public class CHOOSECOLOR
{
    public Int32 lStructSize = Marshal.SizeOf(typeof(CHOOSECOLOR));
    public IntPtr hwndOwner;
    public IntPtr hInstance;
    public Int32 rgbResult;
    public IntPtr lpCustColors;
    public Int32 Flags;
    public IntPtr lCustData = IntPtr.Zero;
    public WndProc lpfnHook;
    public string lpTemplateName;
}

在其他脚本里调用就可以弹出颜色选择框了,注意到其实Unity自身也有对16进制颜色转换的方法:

ColorUtility.TryParseHtmlString 可以直接将16进制转换为Color

ColorUtility.ToHtmlStringRGBA则相反

发布了32 篇原创文章 · 获赞 12 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章