Найти положение левой стороны объекта - PullRequest
0 голосов
/ 06 сентября 2018

Итак, я хочу совместить 2 объекта на левой стороне объекта, который находится дальше всего слева. Итак, я нарисую сценарий:

На доске 2 изображения в случайных позициях. Вы выбираете оба изображения (с помощью инструмента выбора, который был сделан) и затем нажимаете: «Выровнять объекты по левому краю» Изображение, наиболее удаленное от ПРАВА, должно затем зафиксироваться в том же положении края на левой стороне другого изображения. Таким образом, при нажатии на кнопку мой код должен рассчитать обе левые стороны (край изображения слева) положения изображений, затем проверить, какая из них наиболее удалена вправо на холсте, и переместить эту к тому же X ось как другое изображение.

Таким образом, конечным результатом будет то, что изображения будут на одной оси X. Таким образом, если изображение 1 установлено на -73, а изображение 2 на -50, изображение 2 также следует переместить на -73, независимо от поворота обоих изображений.

В настоящее время я могу только узнать, как найти среднюю позицию изображения, мой код выглядит следующим образом:

using com.company.program.core.pageObjects;
using com.company.program.ui.colorPicker;
using UnityEngine;

namespace com.company.program.core.SelectionManager
{
    public static class SelectionAlignment
    {
        public static void AlignLeft(PageObjectBase pageObject)
        {
            Debug.Log("Let's check if this is a group first!");
            if (pageObject is PageObjectGroup)
            Debug.Log("Now we can AlignLeft!");

                PageObjectGroup group = (PageObjectGroup)pageObject;
                foreach (PageObjectBase objectBase in group.Children)
                {   

                    //objectBase.transform.position

                    Debug.Log("Position is now" + objectBase.transform.position);
                    Debug.Log("Left Position is" + objectBase.transform.position + -objectBase.transform.right);
                }
            }
        }
    }
}

Примечание: у меня пока нет движущейся функции, так как я сначала пытаюсь выяснить, каково положение самой левой стороны изображения. Первый Debug.log работает и отображает нормальную позицию (средняя точка изображения). Второй не работает, и отображает то же самое. Оба изображения создаются во время выполнения.

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

1 Ответ

0 голосов
/ 06 сентября 2018

Из вашего вопроса left означает меньшее значение X.

Так что в общем случае левый край изображения (при условии, что PageObjectBase как-то наследуется от MonoBehaviour, а вы говорите о Image компоненте из Unity UI с RectTransform) самый левый из всех четырех углов изображения. Вы можете получить все четыре угла, используя GetWorldCorners

private float GetLeftEdge(PageObjectBase obj)
{

    RectTransform rectTransformComponent = obj.gameObject.GetComponent<RectTransform>();

    if(!rectTransformComponent)
    {
        Debug.LogError("No Image component found", this);
        return 0;
    }

    Vector3[] v = new Vector3[4];
    rectTransformComponent.GetWorldCorners(v);

    float mostLeftCorner = float.MaxValue;
    foreach(var pos in v)
    {
         mostLeftCorner = Mathf.Min(mostLeftCorner, pos.x);
    }

    return mostLeftCorner;  
}

Это также должно работать, если изображения поворачиваются.

Если вы не используете RectTransform, вам нужно каким-то образом получить ширину, но остальное остается прежним.

Чем в вашем цикле вы сначала должны получить наименьшее (самое левое) ребро, чтобы я разбил его на два цикла:

// Start with the max float value so any other value should be smaller
float mostLeftEdge = float.MaxValue;
PageObjectBase referenceToMostLeftObject;

// Get the most left position and object reference
foreach (PageObjectBase objectBase in group.Children)
{
    float leftEdge = GetLeftEdge(objectBase);

    if(leftEdge < mostLeftEdge)
    {
        referenceToMostLeftObject = objectBase;
        mostLeftEdge = leftEdge;
    }
}

// Now you have the most left edge value and the object which is your reference

// Just a little safety skip to not move to strange values

if(referenceToMostLeftObject == null || Mathf.Approximately(mostLeftEdge, float.MaxValue))
{
     Debug.LogError("Ups, I think something went wrong getting the mostLeftEdge", this);
     return;
}

// Move the other objects to match with that edge
foreach (PageObjectBase objectBase in group.Children)
{
    // Skip the reference object
    if(objectBase == referenceToMostLeftObject) continue;

    // First get the difference
    float leftEdge = GetLeftEdge(objectBase);

    // Should always be negative
    float difference = mostLeftEdge - leftEdge;

    // Than move it there
    var current = objectBase.transform.position;

    // Since difference should be negative
    // Adding it to the current position should result in the wanted position
    var newPosition = new Vector3(current.x + difference, current.y, current.z);

    objectBase.transform.position = newPosition;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...