unity調用windows取色器實現換色和保存顏色

需求如下:要打包後的exe文件可以實現給地板換顏色,而且必須用取色器來選顏色,當下次打開的時候顏色還要保留成上次選擇後的顏色。
思路:
unity自帶的取色器只能在編輯狀態用,打包之後是用不了的,所以只能調用windows自己的取色器。
下次打開軟件要加載上次保留的顏色信息,也就是顏色是需要保存和加載的,方式就是保存顏色的RGB的數值就OK。


實現效果:
 

![換色功能](https://img-blog.csdnimg.cn/20190711100147276.gif)
 

實現方法:

首先我們得調用windows的代碼;將以下代碼放到unity的Plugins裏

將綁定到plane上運行即可。

using UnityEngine;
using System.Collections;
using System.IO;
using System;
using System.Runtime.InteropServices;
using System.Text;

public class changecc : MonoBehaviour
{
    private Color color;
    private int a;
    private string colorStr;
    public  GameObject plane;
    string path = Environment.CurrentDirectory;
    // Use this for initialization
    void Start()
    {
        
        Debug.Log(path);     

        //讀取文本里的RGB值
        using (FileStream file = new FileStream(path + @"\1.txt", FileMode.OpenOrCreate, FileAccess.Read))
        {
            byte[] buffer = new byte[1024 * 1024 * 2];
            int i = file.Read(buffer, 0, buffer.Length);
            string s = Encoding.UTF8.GetString(buffer, 0, i);
          
            string[]sarry=  s.Split(',');        
               
                float bb;
                float.TryParse( sarry[a],out bb);
                color.r = bb;
                color.g =float.Parse( sarry[a+1]);
                color.b =float.Parse( sarry[a+2].ToString());
                Debug.Log(sarry[a] + "\n");
               
            
            Debug.Log(color.r + "\n"+color.g +"\n"+ color.b);
            // plane.GetComponent<Renderer>().material.color = new Color(color.r / 255f, color.g / 255f, color.b / 255f);//unity的RGB值要除以255
            plane.GetComponent<Renderer>().material.color = new Color(color.r , color.g, color.b);
        }
       
       

    }
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

    public class CHOOSECOLOR
    {
        public Int32 lStructSize;
        public Int32 hwndOwner;
        public Int32 hInstance;
        public Int32 rgbResult;
        public IntPtr lpCustColors;
        public Int32 Flags;
        public Int32 lCustData;
        public Int32 lpfnHook;
        public Int32 lpTemplateName;
    }

    public class DllTest
    {
        [DllImport("comdlg32.dll", CharSet = CharSet.Auto)]
        public static extern bool ChooseColorA(CHOOSECOLOR pChoosecolor);//對應的win32API
        public static bool ChooseColorA1(CHOOSECOLOR pChoosecolor)
        {
            return ChooseColorA(pChoosecolor);
        }
    }
 

    private void OnGUI()
    {
      
        if (GUI.Button(new Rect(150, 0, 100, 35), "OpenColor"))
        {
            CHOOSECOLOR choosecolor = new CHOOSECOLOR();
            choosecolor.lStructSize = Marshal.SizeOf(choosecolor);
            choosecolor.hwndOwner = 0;
            choosecolor.rgbResult = 0x808080;//顏色轉成int型
            choosecolor.lpCustColors = Marshal.AllocCoTaskMem(64);
            choosecolor.Flags = 0x00000002 | 0x00000001;
            if (DllTest.ChooseColorA1(choosecolor))
            {
                a = choosecolor.rgbResult;//獲取int型顏色值  rgba由這個值組成
                colorStr = Convert.ToString(a, 16);//十進制轉化十六進制  每兩個字符代表一個顏色值  順序從左到右依次爲RGB
                color.b = Convert.ToInt32(colorStr.Substring(0, 2), 16) / 255f;
                color.g = Convert.ToInt32(colorStr.Substring(2, 2), 16) / 255f;
                color.r = Convert.ToInt32(colorStr.Substring(4, 2), 16) / 255f;
            }

            //儲存顏色的rgb值到文本里
            using (FileStream writecolor = new FileStream(path + @"\1.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {
                string save = color.r.ToString() + "," + color.g.ToString() + "," + color.b.ToString();

                byte[] savesome = new byte[1024 * 1024 * 2];

                savesome = Encoding.Default.GetBytes(save);

                writecolor.Write(savesome, 0, save.Length);
            }
            //改變plane的顏色
            plane.GetComponent<Renderer>().material.color = new Color(color.r, color.g, color.b);

           

               
        }
      

       
    }

}

解釋代碼:

首先在start裏將存儲RGB值的文本讀取,然後存儲的格式是用逗號隔開R,G,B三個數值,當讀取之後給plane賦值。下面是RGB的存儲格式截圖圖片:

在下面是使用OnGUI的方法,當按鈕點擊的時候就調出windows的調色板選色,然後吧選好的顏色存儲到上面提到的文本里。之後再改變plane的rgb值。

這樣就完成了!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章