【问题标题】:Possible Unity3d UGUI bug可能的 Unity3d UGUI 错误
【发布时间】:2015-03-06 10:39:05
【问题描述】:

Example project found here,请加载“TestScene”并播放以查看问题。我创建了一个由包含按钮的画布组成的预制件。在附加的脚本中,我在 Start() 中将按钮移离中心。当我实例化这个预制件时,按钮将位于中心/原点 (0,0,0),而不是偏离中心。不知何故,在 Start() 中移动按钮的调用被其他东西覆盖了。

换句话说,当在代码中实例化包含画布的预制件时,其大小字段在 Start() 中将全部为 0,但如果手动将预制件放入场景中,则在检查时将正确设置其大小参数在开始()...

我无法理解这种行为。它是一个错误吗?

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    非常有趣的场景,我认为这是一个错误。特别是,我注意到这可以解决这个问题:

    public class Placement : MonoBehaviour
    {
        public RectTransform btn;
    
        IEnumerator Start()
        {
            yield return new WaitForEndOfFrame();
            btn.position = new Vector3(100, 100, 0);
        }
    }
    

    但只是设置脚本执行顺序以便 Placement.cs 在其他所有内容之后运行没有帮助。如果您正在寻找应该归咎于哪个班级,那就是按钮的RectTransform。您可以通过将锚点位置设置为其他值来查看这一点,例如 Left。我还测试了这个脚本来帮助复制对象——新对象和旧对象一样吗?

    public class CloneOne : MonoBehaviour
    {
        void Awake()
        {
            GameObject go = gameObject;
            DestroyImmediate(this);
            Instantiate (go);
        }
    }
    

    发现如果我在运行时将clone组件添加到Canvas中,则clone在正确的位置,但是如果我将其添加到prefab中,则不是。

    所以它看起来像:

    1. RectTransform 的初始化代码正在设置子位置,并且在调用其他组件 Start 方法之后发生,无论执行顺序如何。而且,

    2. 这一定是某种高级初始化,设置在检查器中不可见的状态。我这样说是因为在编辑器模式下创建对象(不播放)时不会发生这种情况。 (是的,这意味着它是一个错误。这是导致错误的愚蠢行为。)

    【讨论】:

    • 也许我误解了你的意思,但改变锚点并没有让我发现任何新的东西。对我来说,责任似乎在于 Canvas,它的 rectTransform 的字段在 Start() 中都设置为 0,当我在 Start() 中中断时,整个预制甚至都没有在层次结构中列出,我认为应该是因为 start() 在 Update() 之前被调用。此外,具有“yield return new WaitForEndOfFrame();”实际上使事情变得更糟,因为现在即使我在运行时手动将预制件放入场景中,按钮也不会移动。到目前为止,唯一的技巧是在第一次更新调用中完成所有放置
    • 奇怪,你遇到的事情和我很不一样。锚点是矩形变换组件检查器左侧的方形按钮。当然,我说的是按钮。将其更改为“左”使按钮向左而不是中心。 (继续忽略您的定位代码。)还有一个有趣的地方:在Start 中设置按钮的位置没有效果——将其设置为打印值,并且它不会改变。在执行的后期设置它会立即生效。
    • 将代码放在Update 中似乎有点脏。在Start 中使用yield return null 在下一帧上执行绝对应该有效。
    • 我鼓励您报告有关此的错误。如果您不方便这样做,请告诉我,我会这样做。
    • 现在实际设置等待下一帧或 null 有效。但是向左改变确实会改变位置,但不会改变正确的位置。我会尽快将其报告为错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多