Example project found here,请加载' TestScene'并发挥看看问题。我创建了一个由包含按钮的画布组成的预制件。在附加的脚本中,我在Start()中偏离中心按钮。当我实例化这个预制件时,按钮将位于中心/原点(0,0,0),而不是偏离中心。不知怎的,在Start()中移动按钮的调用被其他东西覆盖了。
换句话说,当在代码中实例化包含画布的预制件时,其大小字段在Start()中都将为0,但如果在场景中手动删除预制件,则在检查时其大小参数将被正确设置在开始()......
我无法理解这种行为。这是一个错误吗?
答案 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,则克隆位于正确的位置,但如果我将其添加到预制件中,则不是。
所以看起来像:
RectTransform
的初始化代码正在设置子位置,并且在调用其他组件Start
方法之后发生,无论执行顺序如何。和,
这必须是某种高级初始化,设置在检查器中不可见的状态。我这样说是因为在编辑器模式下创建对象(不播放)时不会发生这种情况。 (是的,这意味着它是一个错误。它是导致愚蠢的错误行为。)