首页 > 解决方案 > 缩放游戏颜色选择器

问题描述

嘿,

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

我该如何解决这个问题?

1.8 比例的 GIF 颜色选择器

2 级以上的 GIF 颜色选择器

颜色选择器脚本:

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);
                }
            }
        }
    }
}

编辑:

动图

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

这是主摄像头的检查员

图片:

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

这是主摄像头的检查员

标签: c#unity3dscalecolor-picker

解决方案


如果没有在 Unity 编辑器中看到您的场景,很难确定,但我有几件事可以检查,可能会解决您的问题。

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

  2. 脚本似乎没有考虑颜色选择器的比例变化。看看你在哪里得到你的 X/Y 坐标来选择颜色(在 //get color data 注释下)。您会注意到它将屏幕位置乘以从纹理大小获取的高度和宽度。这将需要相应地缩放以对纹理的正确区域进行采样。

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


推荐阅读