如何在脚本中"Copy World Placement"?



我使用Unity 2020.1.15f1.

首先,如果你不知道你可以右键点击unity编辑器上的transform或rect transform选择"Copy World Placement"在底部,得到这个信息。

UnityEditor.TransformWorldPlacementJSON:{"position"{"x" -17.771259307861329,"y": -9.999999046325684,"z": 90.0},"rotation":{"x" 0.0,"y": 0.0,"z": 0.0,"w": 1.0},"scale":{"x" 1.0,"y": 1.0,"z": 1.0}}

这正是我在脚本中需要的,但找不到一种方法来从rect转换组件获得此信息。它不一定是JSON格式,我需要的只是相同的x和y值。

PS:变换。地位不是我想要的。对于rect转换,它没有给出这些值。

编辑:我无法在脚本中从位置获得这些值的原因是项目在void Awake()方法中获取这些值,如果你在void Start()中调用它,它会改变你得到的位置值

所以我猜德雨果的第一个答案是正确的。

对于我(Unity 2020.2.5f1),这只是返回transform.position,transform.rotationtransform.localScale,无论它是RectTransform还是只是Transform

请注意,Screenspace - Overlay类型的Canvas中的RectTransform位于像素空间

!我不知道它内部是如何工作的但基本上你可以这样做

public static class TransformExtensions
{
[Serializable]
private struct TransformData
{
public Vector3 position;
public Quaternion rotation;
public Vector3 scale;
public TransformData(Transform transform)
{
position = transform.position;
rotation = transform.rotation;
scale = transform.localScale;
}
}
public static string CopyWorldPlacementJson(this Transform transform, bool humanReadable = false)
{
var data = new TransformData(transform);
var json = JsonUtility.ToJson(data, humanReadable);
return json;
}
}

使用这个扩展方法,您可以在项目的任何地方简单地执行

var json = someGameObject.transform.CopyWorldPlacementJson();
Debug.Log(json);

特别是UI的东西,你可能不得不等待下一次重新绘制矩形。您可以使用Canvas.ForceUpdateCanvases

强制执行此操作

强制所有画布更新其内容。

画布在一帧结束时执行布局和内容生成计算,就在渲染之前,以确保它基于该帧期间可能发生的所有最新更改。这意味着在Start回调和第一个Update回调中,画布下的布局和内容可能不是最新的。

依赖于最新布局或内容的代码可以在执行依赖于它的代码之前调用此方法来确保它。

我无法在脚本中从position获取这些值的原因是项目在void Awake()方法中获取这些值如果你在void Start()中调用它它会改变位置值

所以我猜德雨果的第一个答案是正确的。