如图是场景中的布局,Player
和pool
都是空物体,用来当做物体的parent的,这里这两个的位置不重要(不在一起也没有问题),player
下的ABC是三层父物体,D是一个小球,在C下面,现在我想在pool
下面生成一个cube,位置和D一样,需要用到坐标转换 此处为pool.InverseTransformPoint(D的世界坐标)
,代码如下
public class test : MonoBehaviour
{
// 在parent下生成一个物体,位置和D所在的位置
public Transform D;
public Transform pool;
void Start()
{
// D的世界坐标转换为相对于Parent的本地坐标
Vector3 Pos = pool.InverseTransformPoint(D.position);
// 创建一个cube,生成在指定位置
GameObject ga = GameObject.CreatePrimitive(PrimitiveType.Cube);
ga.transform.localScale = Vector3.one * 0.1f;
ga.transform.SetParent(pool);
ga.transform.localPosition = Pos;
}
}
效果如下
自己的理解是 把D这个子物体相对于世界的位置记录下来,再放到pool这个空间中,因为相对位置固定,所以生成的位置会叠在一起
UI坐标转换
需求是把B挪到A所在的位置,且不改变父物体,很常见的需求
public class Testt : MonoBehaviour
{
public RectTransform BParent;
public RectTransform A;
public RectTransform B;
void Start()
{
// 把A的世界坐标先转屏幕坐标
Vector3 screenPos = Camera.main.WorldToScreenPoint(A.position);
// 把A的屏幕坐标转成B的UI坐标
RectTransformUtility.ScreenPointToLocalPointInRectangle(BParent, screenPos, Camera.main, out Vector2 localPoint);
B.anchoredPosition = localPoint;
}
}