【问题标题】:Convert a Transform to a RectTransform将 Transform 转换为 RectTransform
【发布时间】:2017-11-14 12:45:51
【问题描述】:

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

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

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

myRectTransform.anchorMin = new Vector2(1, 0);
myRectTransform.anchorMax = new Vector2(0, 1);
myRectTransform.pivot = new Vector2(0.5f, 0.5f);

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

RectTransform myRectTransform = (RectTransform)btnExit.transform;

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

【问题讨论】:

    标签: c# unity3d transform


    【解决方案1】:

    你可以直接给游戏对象添加RectTransform组件,Transform组件会变成Rect Transform

    例如:

    var btnExit = new GameObject("Player " + ID + "'s Exit Button");
    btnExit.AddComponent<RectTransform>();
    

    然后演员表将起作用:

    RectTransform myRectTransform = (RectTransform)btnExit.transform;
    

    附言

    如果不添加组件,上面的转换会抛出错误

    InvalidCastException: Cannot cast from source type to destination type.
    

    但是添加了组件后,演员表工作正常。以上代码在 Unity 2018.2.5f1 (64bit) 中测试。

    【讨论】:

      【解决方案2】:
      RectTransform rectTransform = transform.GetComponent<RectTransform>();
      
      RectTransform rectTransform = (transform as RectTransform);
      
      RectTransform rectTransform = (RectTransform)transform;
      

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

      【讨论】:

      • 1.这应该是公认的答案。 2. 但是你有一些关于 GetComponent 与转换转换性能的信息吗?据我所知,GetComponent 通常比较慢,我假设 transform 使用快捷方式(每个游戏对象必须具有的组件),所以我认为转换转换可能更快?我应该测试一下,但我现在没有时间:/
      • 我的理解是“transform”是一个缓存的引用。我没有深入研究列出的每个选项的性能成本,但我认为可以肯定地假设演员阵容会更快。无论如何,它绝对不会变慢。出于这个原因,我总是转换而不是使用 GetComponent,但我从未证实过这个假设。
      • @shcode 我刚刚测试过。 GetComponent 比强制转换或使用 as 慢 7 倍。以下是调用 10000 次后的结果:GetComponent: 0.4623msas: 0.065ms
      • @shcode 我认为你误读了我的评论。结果和你预期的完全一样。另外,我的评论中没有包括演员阵容,但是是的,它比as 快一点。
      • @Bip901 哦,哇,是的,我确实看错了。毕竟,在我决定发表评论之前,在两三个月的时间里有好几次。有趣的。尴尬。谢谢你指出=D
      【解决方案3】:

      您不能将Transform 转换为RectTransform。这就是GetComponent 的用途。在 btnExit 变量上使用 GetComponent,您将能够从 Button 获取 RectTransform

      RectTransform myRectTransform =  btnExit.GetComponent<RectTransform>();
      

      注意

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

      如果您不执行任何这些操作,您将获得null,因为RectTransform 未附加到Button

      【讨论】:

      • 等等,为什么这被标记为正确答案?如果游戏对象确实有一个 RectTransform 组件,您可以将变换转换为 RectTransform。
      猜你喜欢
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多