2015-02-19 2 views
0

Итак, я следую учебному курсу онлайн и 99,9% уверен, что я не сделал ошибку, и это, возможно, связано с моей попыткой реализовать его идеи в уже созданном проекте с (возможно) разные факторы.GUI Проблемы масштабирования холста с помощью localPosition

Основная идея из математики, что мой SlotScript, который реализует IDragHandler, OnDrag -

public void OnDrag(PointerEventData data) 
{ 
    if (inventory.Items[slotNumber].itemName != null) 
    { 
     inventory.ShowDraggedItem(inventory.Items[slotNumber]); 
    } 
} 

выполняет метод в моем инвентаре, который просто присваивает bool draggingItem как истинный и изменяет это спрайт вместе с делает его активным.

Теперь мой фактический код обновления для возвращения позиции перемещенного элемента не возвращает это ожидаемое значение:

void Update() 
{ 
    if (draggingItem) 
    { 
     Vector3 position = (Input.mousePosition - (GameObject.FindObjectOfType<Canvas>().GetComponent<RectTransform>().localPosition)); 
     draggedItem.GetComponent<RectTransform>().localPosition = new Vector3(position.x + 15, position.y - 15, position.z); 
    } 
} 

Вот некоторые примеры того, что я получаю. Когда мышь находится в центре холста я получить ожидаемый результат:

enter image description here

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

enter image description here

enter image description here

Другая информация:

Экран занимает оверлей. Собственное разрешение: 1920x1080. При тестировании с меньшим разрешением размер проблемы ухудшается (смещение пропорционально больше). После того, как onDrag событие происходит mousePosition обновления правильно и CanvaslocalPosition остается точно такой же (ожидаемое поведение?)

Я надеюсь, что я сделал это достаточно ясно.

ответ

1

Ну, я был очень удивлен, увидев, что никто не ответил на это!

Независимо от того, что примерно через 2 часа (возможно, больше в течение продолжительного периода) игры с ним я заметил, что хотя (четко сказано) размеры холста на основе разрешения экрана не масштабируют возвращаемое значение localPosition, это вам нужно сделать самостоятельно.

Я устал, надеюсь, что это имело смысл.

Все, что вам нужно знать, если вы также столкнулись с этой проблемой является то, что, как только вы разделите предполагаемое положение mousePointer на холсте любого значения (х, у, г) из Vector3 localScale в Canvas RectTransform компоненты возвращается масштабированное положение (из-за деления причины на менее 1 увеличивает вашу ценность).

кода, чтобы решить признаки ниже:

if (draggingItem) 
    { 
     Vector3 localScale = GameObject.FindObjectOfType<Canvas>().GetComponent<RectTransform>().localScale; 
     Vector3 position = (Input.mousePosition - (GameObject.FindObjectOfType<Canvas>().GetComponent<RectTransform>().localPosition)); 
     Vector3 positionDivided = new Vector3(position.x, position.y, position.z)/localScale.x; 

     draggedItem.GetComponent<RectTransform>().localPosition = new Vector3(positionDivided.x + 15, positionDivided.y - 15, positionDivided.z); 
    } 
Смежные вопросы