将变换转换为 RectTransform

Kai*_*Kid 5 c# transform unity-game-engine

在我的 Unity 项目中,我通过脚本动态创建对象。

var btnExit = new GameObject("Player " + ID + "'s Exit Button");
btnExit.transform.SetParent(UI.transform);
Run Code Online (Sandbox Code Playgroud)

我需要设置对象的锚点和枢轴。我应该能够使用它的 RectTransform 组件来做到这一点,就像我在场景编辑器中创建对象时所做的那样。

myRectTransform.anchorMin = new Vector2(1, 0);
myRectTransform.anchorMax = new Vector2(0, 1);
myRectTransform.pivot = new Vector2(0.5f, 0.5f);
Run Code Online (Sandbox Code Playgroud)

但是对象的变换组件不是 RectTransform,只是普通的 Transform。所以我不能将它转换为使用我需要的那些属性。

RectTransform myRectTransform = (RectTransform)btnExit.transform;
Run Code Online (Sandbox Code Playgroud)

那么如何在我通过脚本而不是在场景编辑器中初始化的对象上正确使用 RectTransform 类的功能呢?

小智 8

RectTransform rectTransform = transform.GetComponent<RectTransform>();

RectTransform rectTransform = (transform as RectTransform);

RectTransform rectTransform = (RectTransform)transform;
Run Code Online (Sandbox Code Playgroud)

只要您的对象具有 RectTransform,这些都是从内置transform引用获取 RectTransform 的有效方法。

  • @shcode 我刚刚测试过。GetComponent 比强制转换或使用 `as` 慢 7 倍。以下是调用 10000 次后的结果: `GetComponent: 0.4623ms` `as: 0.065ms` (2认同)
  • @shcode 我认为你误读了我的评论。结果完全符合您的预期。另外,我的评论中没有包括选角,但是,是的,它只是比“as”快一点。 (2认同)
  • @Bip901 哦哇,是的,我确实读错了。在两三个月的时间里我多次决定对此发表评论。有趣的。尴尬。谢谢你指出=D (2认同)

Pro*_*mer 0

您无法投射TransformRectTransform. 这就是GetComponent用途。使用btnExit 变量,您将能够从按钮GetComponent获取。RectTransform

RectTransform myRectTransform =  btnExit.GetComponent<RectTransform>();
Run Code Online (Sandbox Code Playgroud)

笔记

您应该只在调用后执行此操作SetParent,因为如果父对象是 UI 对象(例如 Canvas),SetParentUnity 会自动附加RectTransform到变量。btnExit您还可以使用AddComponent附加RectTransform到该游戏对象。

如果您不执行任何这些操作,您将得到“ nullsinceRectTransform不附加到Button.

  • 等等,为什么这被标记为正确答案?如果游戏对象确实具有 RectTransform 组件,则可以将转换转换为 RectTransform。 (3认同)