【问题标题】:Change UI RectTransform position更改 UI RectTransform 位置
【发布时间】:2017-10-26 10:34:49
【问题描述】:

我有以下几行:

GameObject bp = Instantiate(MyPrefab);
bp.transform.SetParent(GameObject.FindGameObjectWithTag("ContentFactory").transform);
bp.transform.localPosition = new Vector3(0, 0, 0);

Si,我只是实例化了一个预制件,我设置了一个父级,我想改变位置。

我的问题是,函数SetParent 为我的bp GameObject 设置了一个固定位置,之后我不知道如何改变这个位置。最后一行没有任何改变....与.position相同。

如何更改bp 的位置?谢谢!

编辑:

ContentFactory 的检查员:

一个bp的检查员:

层次结构(蓝色的内容是ContentFactory):

【问题讨论】:

  • 因此,当您使一个对象成为另一个对象的子对象时,localPosition = (0,0,0) 与该父对象在空间中的位置相同。如果该父对象存在于场景空间中的 (0,0,0) 处(假设它本身不是子对象),则 position = (0,0,0) 将是相同的。我不确定你的问题是什么,它对我有用。
  • 啊啊,我们正在处理 RectTransforms。更改 RectTransform 的锚点和枢轴及其有效位置。你在任何地方都在改变它的锚点吗?
  • 不,我不会在任何地方更改锚点
  • 好吧,对于滚动视图,您通常希望锚点 min:max 为 (0,1):(0,1) 而不是 (0.5,0.5):(0.5,0.5) 以便 localPosition 值实际上意味着什么,或者按照程序员的建议和使用RectTransform.anchoredPosition

标签: c# unity3d position


【解决方案1】:

使用transform.localPosition 将使用它的相对位置。如果要改变世界空间的位置,需要使用transform.position

GameObject bp = Instantiate(MyPrefab);
bp.transform.SetParent(GameObject.FindGameObjectWithTag("ContentFactory").transform);
bp.transform.position = new Vector3(0, 0, 0);

编辑:

这是一个带有RectTransform 的 UI 对象。你不应该用 transform.position 移动它。

它应该被移动:

bp.GetComponent<RectTransform>().anchoredPosition = ...

bp.GetComponent<RectTransform>().anchoredPosition3D = ...

请注意,在使用RectTransform 时,还有其他一些因素会起作用。

这包括anchorMaxanchorMin,可以使用:

bp.GetComponent<RectTransform>().anchorMax = ...
bp.GetComponent<RectTransform>().anchorMin = ...

【讨论】:

  • 根据他的问题,使用position 并没有改变任何东西:“最后一行没有改变......与.position 相同。” 但是我确实同意这应该是他正在寻找的东西。
  • @Draco18s 刚刚注意到了。
  • @ClémentAndraud 您是否将 ContentFactory(父对象)移动到任何地方?如果是这样的话,它也应该改变孩子的位置。请确认您没有移动父对象。
  • 你能在代码运行后显示检查器的图片,显示对象的位置吗?
  • ContentFactory 没有移动。
【解决方案2】:

我将提供与 Programmer 不同的答案,因为这是我使用新 UI 系统处理动态填充的 ScrollView 的方式。我将不得不尝试看看使用RectTransform.anchoredPosition 是否效果更好。


我将锚的 min:max 值设置为(0,1):(0,1),以便按钮(图像、文本等)将滚动视图的左上角视为原点。然后我也将枢轴设置为(0,1),这样按钮的左上角就是原点(然后这些值被烘焙到预制件中:我再也不需要摆弄它们了)。这让我可以将位置设置为 (0,0,0) 并将其放置在我想要的位置,尽管我通常会将它们向右和向下轻推几个像素以使其看起来不错,但所有项目都收到相同的平面偏移。

然后in my code I can use .localPosition 以允许这些值与我希望放置我的对象的位置对齐的方式,请记住,需要在旧项目下方添加新项目,因此每个按钮的 Y 值将在第一个之后是负面的。这个偏移量将等于项目的高度(在 Inspector 中可见)加上一些用于填充的像素。

最后,我始终确保在 ScrollView 的内容的 RectTransform 上调用 SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, totalHeight) 以将滚动条更新为正确的值,并在必要时将内容变换自身的位置重置为 (0,0,0) 以便滚动回顶端。 totalHeight 实际上是放置的下一个项目的(正)Y 位置,再加上另一个平坦的缓冲量(用于从顶部偏移事物的相同值),所以它看起来不错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多