我正在创建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或这里的其他原因。
谢谢。
答案 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。