缩放我的颜色选择器



嘿,

我正在开发一个3D房间编辑器,在那里你可以从菜单中获取一个对象并将其放回房间。您还可以选择为这些对象提供不同的颜色,这是由颜色选择器完成的。我现在有一个脚本,它按照我想要的方式工作,只有当我放大颜色选择器时,他不再拾取颜色,也不再移动选择器圆圈。

我该如何解决此问题?

1.8比例的GIF颜色选择器

GIF颜色选择器在2以上比例

颜色选择器脚本:

Color[] Data;
SpriteRenderer SpriteRenderer;
GameObject ColorPicker;
GameObject Selector;
BoxCollider Collider;
public GameObject target;
Ray rayray;
private Plane MyPlane;
public int Width { get { return SpriteRenderer.sprite.texture.width; } }
public int Height { get { return SpriteRenderer.sprite.texture.height; } }
public Color Color;
void Awake()
{
ColorPicker = transform.Find("ColorPicker").gameObject;
SpriteRenderer = ColorPicker.GetComponent<SpriteRenderer>();
Selector = transform.Find("Selector").gameObject;
Collider = ColorPicker.GetComponent<BoxCollider>();
Data = SpriteRenderer.sprite.texture.GetPixels();
Color = Color.white;
Debug.Log(Collider);
MyPlane = new Plane(transform.TransformDirection(Vector3.forward), transform.position);
}

void Update()
{
if (Input.GetMouseButton(0))
{
rayray = Camera.main.ScreenPointToRay(Input.mousePosition);
MyPlane = new Plane(transform.TransformDirection(Vector3.forward), transform.position);
Vector3 screenPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
screenPos = new Vector3(screenPos.x, screenPos.y);

//check if we clicked this picker control
RaycastHit[] ray = Physics.RaycastAll(rayray.origin, rayray.direction);
foreach (RaycastHit h in ray)
{
Debug.Log(h.collider.name);
if (h.collider.name == "ColorPicker")
{
Selector.transform.position = screenPos;
//get color data
screenPos -= ColorPicker.transform.position;
int x = (int)(screenPos.x * Width);
int y = (int)(screenPos.y * Height) + Height;
if (x > 0 && x < Width && y > 0 && y < Height)
{
Color = Data[y * Width + x];
target.GetComponent<Renderer>().material.color = Color;
Debug.Log(Width);
Debug.Log(Height);
}
}
}
}
}

编辑:

GIF

这是来自颜色选择器颜色字段的检查员

这是主摄像头的检查员

图像:

这是来自颜色选择器颜色字段的检查员

这是主摄像头的检查员

如果不在Unity编辑器中看到您的场景,很难确定,但我有一些东西可以解决您的问题。

  1. 检查以确保缩放GameObject时,BoxCollider缩放正确。缩放后选择游戏对象时,您应该能够看到Gizmo。确保缩放前后它覆盖了UI的相同区域。BoxCollider用于检测鼠标在整个对象上的点击,除非光线击中碰撞器,否则其他功能都无法工作。

  2. 脚本似乎没有考虑颜色选择器的比例变化。查看用于拾取颜色的X/Y坐标的位置(在//获取颜色数据注释下(。您会注意到它将屏幕位置乘以"高度"one_answers"宽度",这两个值取自纹理的大小。这将需要相应地缩放,以便对纹理的正确区域进行采样。

如果你仍然无法正常工作,我建议你发布一张场景层次结构和相关游戏对象的屏幕截图,这样我们就可以看到它是如何设置的。

最新更新