可能的Unity3d UGUI错误

时间:2015-03-06 10:39:06

标签: unity3d

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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);
    }
}

并发现如果我在运行时将克隆组件添加到Canvas,则克隆位于正确的位置,但如果我将其添加到预制件中,则不是。

所以看起来像:

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

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