Шкала в игре выбора цвета - PullRequest
0 голосов
/ 21 ноября 2018

Привет,

Я работаю над трехмерным редактором комнат, где вы можете взять объект из меню и поместить его обратно в комнату.У вас также есть возможность придать этим объектам другой цвет, это делается с помощью палитры цветов.Теперь у меня есть скрипт, который работает так, как я хочу, только если я увеличу палитру цветов, то он больше не подбирает цвета и больше не двигает круг селектора.

Как мне решить эту проблему?

GIF Палитра цветов в масштабе 1,8

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

Это инспектор из цветового поля палитры цветов

Это инспектор с основной камеры

ИЗОБРАЖЕНИЕ:

Это инспектор из цветаПоле выбора цвета

Это инспектор с основной камеры

1 Ответ

0 голосов
/ 21 ноября 2018

Трудно понять наверняка, не увидев вашу сцену в редакторе Unity, но я хотел бы проверить несколько вещей, которые могут решить вашу проблему.

  1. Проверьте, чтобы убедиться, чтокогда вы масштабируете свой GameObject, что BoxCollider масштабируется правильно.Вы должны видеть Gizmo при выборе GameObject после масштабирования.Убедитесь, что он покрывает те же области пользовательского интерфейса до / после масштабирования.BoxCollider используется для обнаружения щелчков мышью по объекту в целом, и, если луч не достигнет этого коллайдера, никакие другие функции не будут работать.

  2. Это не похоже на сценарийучитывает изменения масштаба для палитры цветов.Посмотрите, где вы получаете координаты X / Y для выбора цвета (под // комментарием к данным о цвете).Вы заметите, что он умножает положение экрана на высоту и ширину, которые взяты из размера вашей текстуры.Это должно быть соответствующим образом масштабировано для выборки правильной области текстуры.

Если вы все еще не можете заставить его работать, я бы предложил опубликовать снимок экрана с иерархией вашей сцены.и соответствующие GameObjects, чтобы мы могли видеть, как все это настроено.

...