Unity之读取色盘(任意形状和颜色分布)颜色
色盘是一张图,我们不用关心其形状或颜色分布,根据业务需求请美工做出该图即可。
在这里,我使用这样一张图作为色盘图:
需求:鼠标点击/按住该UI图的时候,把该位置对应的颜色值赋给模型。模型变色请看这篇博文:https://blog.****.net/itsxwz/article/details/89376498
可以看出来,这张图不是很均匀的全颜色分布,而是很多小的同色块组成。利用颜色值(0~255)和半径来处理是不可能很好的实现的。
我们换一种思路:获取鼠标点对应的图片像素点的颜色值。
API:Texture2D.GetPixel(int x, int y);可以帮助我们达到上述目的。
我们可以通过Input.mousePosition;来获取鼠标点的位置。
那么,怎么把mousePos转换为pixelPos呢?
因为色盘在Canvas上的位置是任意的,我们可以确定一个中心点centerPos,即上图的圆心处。我们有2中方式获取圆心点:1)Input.mousePosition;但是人眼确定位置,人手点击的方式一定会有误差,所以我们采用方式2;2)根据色盘物体的RectTransform的PosX和PosY来计算,屏幕的中心点(0,0)在屏幕左中位置,则色盘中心点为(PosX , Screen.height / 2 + PosY)。
通过pixelPos = mousePos - centerPos + tex / 2;的转换我们就可以获取该像素点的颜色了。
我们要注意判断mousePos是否在色盘内,否则不读取像素点颜色值。
代码实现如下:
private void ChooseColorByClickColorWheel() {
if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0)) {
Vector2 mousePos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
int x = (int)(mousePos.x - centerPos.x);
int y = (int)(mousePos.y - centerPos.y);
if(x*x + y*y <= Mathf.Pow(tex.width/2,2)) {
//tex为色盘图
pixelColor = tex.GetPixel(x + tex.width/2, y+tex.height/2);
}
}
}
可以类推到适用该功能的所有应用场景上去(点击UI图片取色??),不限于“色盘”。
最后说明下坐标的问题: