首页 > 系统相关 >unity调用windows取色器实现换色和保存颜色

unity调用windows取色器实现换色和保存颜色

时间:2023-01-05 13:04:25浏览次数:48  
标签:Int32 windows unity color 取色 using new public choosecolor


需求如下:要打包后的exe文件可以实现给地板换颜色,而且必须用取色器来选颜色,当下次打开的时候颜色还要保留成上次选择后的颜色。
思路:
unity自带的取色器只能在编辑状态用,打包之后是用不了的,所以只能调用windows自己的取色器。下次打开软件要加载上次保留的颜色信息,也就是颜色是需要保存和加载的,方式就是保存颜色的RGB的数值就OK。

实现效果:
 

unity调用windows取色器实现换色和保存颜色_System

![换色功能](/i/li/?n=2&i=images/blog/202301/05124158_63b655162c7e240505.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的存储格式截图图片:

unity调用windows取色器实现换色和保存颜色_FileStream_02

在下面是使用OnGUI的方法,当按钮点击的时候就调出windows的调色板选色,然后吧选好的颜色存储到上面提到的文本里。之后再改变plane的rgb值。

这样就完成了!

 

标签:Int32,windows,unity,color,取色,using,new,public,choosecolor
From: https://blog.51cto.com/u_8378185/5990719

相关文章

  • unity4.6之UGUI之与代码结合及Text讲解
    UGUI与以往的NGUI不同之处很多其中一大特点就是UGUI把精灵图集的功能取消了。首先是我们看看UGUI的UI界面:其中有项是Text...也就是本节要讲的内容;说到text不得不说的是字......
  • Unity创建Animation动画无法播放问题
    前提:我是要使用animation的方式去播放动画,而不是animator状态机;是针对unity自己制作的动画,而不是外部导入进来的动画。 发现一个问题,我在unity中给一个cube创建一个animat......
  • Unity3D之sprite动画(Animation)的制作
    实例说明:忍者跑酷的player动画制作。。。这些都是用Sprite做的动画。。。在prioject面板里的一组sprite里面点击,之后看属性面板的SpriteEditor对这组Sprite进行编辑。。。......
  • windows.old的删除方法
    在重新装了系统后会发现C盘中会出现windows.old这个文件夹,而且这个文件夹用普通删除的方式是删除不掉的。要删除,步骤如下:就在当前窗口空白处右键------>属性,然后会看到如图:......
  • unity3d相机跟随物体平滑移动(C#代码)
    usingUnityEngine;usingSystem.Collections;publicclassCameraFollow:MonoBehaviour{publicTransformtarget;privateVector3wantedPosition......
  • Unity3d碰撞器与触发器的区别详解(rigidbody移动和charactercontroller移动区别)
    Rigidbody或者charactercontroller移动才可以用collider的碰撞。正文:要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动。碰撞体是物理......
  • 微软次时代新版cmd——windows terminal
    微软次时代新版cmdWindowsTerminal-MicrosoftStore应用程序microsoft/terminal:ThenewWindowsTerminalandtheoriginalWindowsconsolehost,allinthesa......
  • windows servier 2019 如何卸载ie浏览器
    在添加角色和功能向导里面根本找不到。只需要从powershell中输入这个命令,重新启动即可删除。dism/online/Remove-Capability/CapabilityName:Browser.InternetExplo......
  • unity代码编译时间分析工具
    https://github.com/needle-tools/compilation-visualizer    ......
  • Windows忘记Mysql8密码重置
    先关掉系统服务。在mysql8系统,用mysqld--console--skip-grant-tables--shared-memory可以无密码启动服务。服务启动后,打开另一个cmd。以空密码登入系统。mysql-ur......