<br> <div><ul><li><ul><li><ul><li>👉一、前言及知识点</li><li><ul><li>1、前言</li><li>2、知识点</li></ul></li><li>👉二、实现鼠标拾取电脑屏幕指定区域像素颜色</li><li><ul><li>1、准备工作</li><li>2、使用.Net类库System.Drawing截取图像并转为Unity支持的纹理图像Texture</li><li>3、需要注意的点</li></ul></li><li>👉三、集成到ColorPicker插件源代码中完成取色笔的功能</li><li><ul><li>1、修改ColorPicker脚本中的源代码</li><li>2、使用修改后的ColorPicker插件取色笔功能修改Image和Text的颜色</li><li>3、测试修改后的取色笔功能</li><li><ul><li>1.编辑器内测试</li><li>2.打包exe后测试</li></ul></li></ul></li></ul></li></ul></li></ul> </div> <h4>1、前言</h4> <p>开发时常遇到要动态修改物体或UI的颜色的需求,而且需要像Unity编辑器一样弹出颜色选择器来选择颜色。 心想如果还要从0开始开发一套取色器,那工作量可不少,最后我选择使用第三方颜色选择器插件ColorPicker来完成取色的功能。但在使用ColorPicker插件的过程中我发现用取色笔拾取电脑屏幕像素时会报错:<strong>attempting to ReadPixels outside of RenderTexture bounds! Reading (2396, 2905, 2412, 2921) from (1920, 1080)</strong>(意思是试图读取的像素超出纹理边界) <font>排查报错的原因: 原来ColorPicker插件的作者写取色笔拾色的逻辑是截取鼠标坐标点指定区域的图像,然后再通过获取图像中心点位置的像素点颜色来完成取色。由于插件源代码使用Texture2D.ReadPixels方法来绘制纹理图像,这个方法只能读取到当前分辨率的Game游戏窗口范围内像素,一旦超出这个范围就无法读取且会报错。 解决方法:Unity库中我没有找到可以读取Game窗口外电脑屏幕像素的方法,于是我将方向转到了.NET类库中。可以使用.net库中System.Drawing.dll截取电脑屏幕快照,创建图像的位图数据,将其转为字节数组,再将字节数组加载到Unity的纹理Texture图像上,最后读取该Texture纹理的像素颜色。</font></p> <h4>2、知识点</h4> <blockquote> <p><strong>1. 用.Net类库System.Drawing截取鼠标指定区域图像</strong> <strong>2. 将位图数据Bitmap转为字节数组</strong> <strong>3. 将字节数据转为Unity的Texture纹理图像</strong> <strong>4. 通过Unity的【【微信】】tPixel()方法获取图片上指定点像素颜色</strong></p> </blockquote> <h4>1、准备工作</h4> <p>导入.NET类库System.Drawing.dll。(使用搜索工具查找或者从你的unity安装路径下找到当前unity运行平台下的System.Drawing.dll) </p> <h4>2、使用.Net类库System.Drawing截取图像并转为Unity支持的纹理图像Texture</h4> <p>新建核心脚本GetScreenPixel.cs:</p> <h4>3、需要注意的点</h4> <p>1.将位图数据转为字节流时需要指定图片格式为png或jgp类型(Unity支持的格式),否则会出现unity加载纹理时显示红色问号图像的情况。 2.在GetScreenPixel脚本中处理位图时用到了c++的指针,如果是使用Unity2018以后的版本,请在PlayerSetting/OtherSetting中勾选Allow ‘unsafe’ Code:否则编译器可能会报无法识别不安全代码的错误。 </p> <p>ColorPicker插件的核心脚本就是ColorPicker,我们需要在该脚本中调用GetScreenPixel脚本的GetTexture()方法,以获取鼠标点屏幕快照,并读取得到的图像中心点的像素颜色。除此之外,还要注释掉一些代码。</p> <h4>1、修改ColorPicker脚本中的源代码</h4> <p>1.添加【【微信】】方法,并在Update函数里调用该方法和注释掉原来截图的方法 </p> <p> 2.添加【【微信】】(bool focus)方法</p> <blockquote> <p>因为当鼠标点在Game窗口外是不响应鼠标点击函数的,所以选择屏幕外像素颜色时,我们要用到【【微信】】函数,也就是运行unity时在后台中点击鼠标的话,unity程序会“失去焦点”,会调用一次【【微信】】函数,传入的参数是False。此时我们就可以设置取色器上的颜色为当前颜色面板图的中心点的像素颜色了。</p> </blockquote> <p>3.注释掉脚本上OnDisable函数里的内容 因为初始是要隐藏掉取色器面板的,隐藏时会调用该函数,将按钮事件监听都移除了,就无法响应鼠标事件了,所以需要注释或删掉。 </p> <h4>2、使用修改后的ColorPicker插件取色笔功能修改Image和Text的颜色</h4> <p>1.搭建测试场景 分别新建image和text用来测试取色器修改后取色笔的功能。 2.写测试脚本 因为ColorPicker脚本为我们提供了取色器面板上的颜色访问器: 所以在需要修改的物体和UI的颜色脚本里,声明一下ColorPicker对象,调用该对象的颜色访问器即可。 如下脚本所示:</p> <h4>3、测试修改后的取色笔功能</h4> <h5>1.编辑器内测试</h5> <h5>2.打包exe后测试</h5> <p> Perfect!完美😄</p> <hr><h1 style="font-size: 38px;color: #4d4f53;">SAP 资深技术专家 Jerry Wang 的技术分享</h1><br> 尽管量子计算机的潜力巨大,但我们也需要认识到,量子计算机不是万能的。此外,量子计算机的实用化还面临许多技术挑战,包括量子比特的稳定性、误差纠正、量子编程等问题。总的来说,量子计算机的出现可能会带来一场科技革命,但这场革命的具体形状和速度还需要我们去探索和等待。传统的计算机在模拟大型量子系统时,由于受到指数级的复杂性墙壁的限制,无法准确模拟。传统计算机在处理这些问题时可能需要花费很长时间,而量子计算机可以利用量子超级位置和量子纠缠等现象,更快地找到问题的解。量子密码学利用量子力学的基本规则来保护信息的安全。
本文地址:
/show-97164.html
版权声明:除非特别标注原创,其它均来自互联网,转载时请以链接形式注明文章出处。



