做新手引导的过程中发现,在滚动容器中的物体不能通过自身GObject.LocalToGlobal(Vector2.zero),来获取屏幕坐标,如果容器发生移动,物体的XY是不变的,导致这种方法获取的坐标始终是不变的。
目前的解决方案是遍历父物体,手动加上scrollPane的偏移量:
public static Vector2 GetGlobalPosInContainer(GObject obj, bool isCenter)
{
Vector2 lastPos = isCenter ? obj.size / 2 : Vector2.zero;
if (obj.parent != null)
{
while (obj.parent != GRoot.inst)
{
lastPos += obj.xy;
if (obj.inContainer && obj.parent.scrollPane != null)
{
lastPos.x -= obj.parent.scrollPane.posX;
lastPos.y -= obj.parent.scrollPane.posY;
}
if (obj.pivotAsAnchor)
{
lastPos.x -= obj.width * obj.pivotX;
lastPos.y -= obj.height * obj.pivotY;
}
obj = obj.parent;
}
lastPos += obj.xy;
}
else
{
lastPos += obj.LocalToGlobal(Vector2.zero);
obj = obj.parent;
}
return lastPos;
}
参考:
FairyGUI坐标转换辅助类
本地坐标转世界坐标坑逼之处