所以我想将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起作用并显示正常位置(图像的中点)。第二个无效,并显示相同。两个图像在运行时都会实例化。
希望这是足够的信息,我已经潜伏了很长时间,但是我自己从未发布过任何信息,所以如果我忘了添加信息,请对我保持温柔。
答案 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;
}