自动创建RectTransform的原因

时间:2019-01-31 10:03:29

标签: c# unity3d

我正在创建2个GameObject。

一个自动获取RectTransform而不显式添加一个,另一个不添加。

在这种情况下,未添加RectTransform,但可以访问它:

    GameObject nCanvasGO = new GameObject("CanvasContainer");
    Canvas nCanvas = nCanvasGO.AddComponent<Canvas>();
    nCanvas.renderMode = RenderMode.WorldSpace;
    nCanvasGO.AddComponent<CanvasScaler>();
    nCanvasGO.AddComponent<GraphicRaycaster>();

    RectTransform rtCanvasGO = nCanvasGO.GetComponent<RectTransform>(); //can be accessed, isn't null

这没有RectTransform:

    GameObject nAnimInfo = new GameObject("AnimInfo");
    RectTransform rtAnimInfo = nAnimInfo.GetComponent<RectTransform>(); // is null

因此,我想问一下是否将Canvas组件添加到GameObject中是否添加了RectTransform或这里的其他原因。

谢谢。

1 个答案:

答案 0 :(得分:3)

是的,将画布添加到游戏对象会自动将Transform更改为RectTransform。这是因为rect变换与Transform的2D等效,并具有锚定等其他功能。

从Unity docs

  

Rect Transform组件是Transform组件的2D布局副本。其中“变换”代表一个点,“矩形”变换代表一个矩形    元素可以放在里面。如果Rect变换的父对象也是Rect变换,则子Rect变换也可以指定相对于父矩形的位置和大小。

文档实际上并没有明确指出通过RectTransform自动替换转换的任何地方...

此外,画布取决于RectTransform,因此,如果没有RectTransform,就无法使用。当您尝试从画布中删除rect变换时,您会看到这些。它将弹出,显示“由于Canvas依赖于它,所以无法删除RectTransform”。

添加到GameObject的任何其他UI组件也将自动添加Recttransform组件(例如,图像,文本等)。这与Canvas具有相同的原因,它们依赖于RectTRansform。

您还将注意到,默认情况下,您制作的作为画布子级的任何GameObject还将具有RectTransform,以便它可以相对于父级(在此示例中为画布)rect转换锚定自己。您可以从这些对象中删除rectTransform,只要它的任何组件都不依赖于RectTransform。尽管我不明白为什么会这样,但画布的任何子级都应该是某种形式的UI,例如图像或文本。因此,应要求使用RectTransform。