查找对象左侧的位置

时间:2018-09-06 14:29:53

标签: c# unity3d position

所以我想将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 :(得分:1)

问题left表示X值较小。

因此,通常图像的左边缘(假设PageObjectBase以某种方式从MonoBehaviour继承而来,您是在谈论{{1}来自Unity Image的{​​{1}}组件}}) 是图像所有四个角的最左端。您可以使用GetWorldCorners

获得所有四个角
UI

如果图像旋转,这也应该起作用。

如果您不使用RectTransform,则必须以其他方式获得宽度,但其余部分保持不变。

比起循环,您首先必须获得最小的(最左侧)边缘,所以我将其分成两个循环:

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