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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章