需求如下:要打包後的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值。
這樣就完成了!