Unity3D 调用 winform的颜色对话框

原创 2016年08月29日 19:53:37

在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则相反

版权声明:本文为博主原创文章,未经博主允许不得转载。

winform内嵌unity

都是为了学习,转载时不用打招呼,标明出处就行,实在不想标明,也可以!...
  • lj34207310
  • lj34207310
  • 2017年02月23日 13:05
  • 3440

WinForm内嵌Unity3D

Unity3D可以C#脚本进行开,使用vstu2013.msi插件,可以实现在VS2013中的调试。在开发完成后,由于项目需要,需要将Unity3D嵌入到WinForm中。WinForm中的Unity...
  • xxdddail
  • xxdddail
  • 2015年11月17日 17:55
  • 7632

WinForm嵌入Unity3D并实现交互

  • 2015年11月17日 17:31
  • 1.4MB
  • 下载

WinForm和Unity3d互操作

  • 2014年07月08日 09:13
  • 270KB
  • 下载

当优美的C#与Unity3D结合时开发游戏变的超Esey(一)必须掌握的C#100个基本点。

Unity3D提供支持三种脚本语言,但是Jscript并非一我们所熟知的那个Jscript,有着很大的不同,所以建议使用优美的C#语言来写脚本,下面是必须掌握的100个C#基本点。 1.C#中使...
  • ljb81565248
  • ljb81565248
  • 2016年08月29日 10:18
  • 1890

Unity3D内部串口通信和Unity3D与Winform程序的串口通信的实现和异常问题

Unity3D内部串口通信和Unity3D与WinForm程序间的串口通信。容易引发的错误、异常,以及串口正常工作的区别。解决方法和思路。...
  • IOTHua
  • IOTHua
  • 2016年06月13日 13:39
  • 6307

Unity:实现调色板

放在unity中的plugins文件夹下 using UnityEngine; using System.Collections; using System; using System.Runtim...
  • emoonight
  • emoonight
  • 2016年05月15日 21:01
  • 1855

Unity3d 框选

有时候,我们在游戏中会遇到需要框选对象的情况,比如红警。 在unity3d中可以用GL非常简单的实现。 1.先用GL画出线框,并求出Bounds 2.遍历对象,将对象的世界坐标转换到屏幕坐标,并...
  • yanhui2012
  • yanhui2012
  • 2015年10月09日 23:14
  • 998

unity 关于模型的边界框bounds

SkinnedMeshRenderer.Bounds的边界框默认是不能通过脚本修改的 在有蒙皮骨骼的模型Rig选项中改成Legacy的时候会出现这种情况,这个时候最好选择genetic导入,可以得到...
  • shenmifangke
  • shenmifangke
  • 2015年10月27日 17:04
  • 3336

Unity的基本Shader框架写法&颜色、光照与材质

原文地址:http://blog.csdn.net/poem_qianmo/article/details/40955607 本篇文章中,我们学习了Unity Shader的基本写法框架,以...
  • oSKyTonight
  • oSKyTonight
  • 2014年12月29日 18:05
  • 16423
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3D 调用 winform的颜色对话框
举报原因:
原因补充:

(最多只允许输入30个字)