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