在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数据类型的转换,不过网上相关的资料也是比较多的
[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则相反