育儿后儿童对象的位置转移

时间:2015-08-13 09:42:41

标签: unity3d parent-child unityscript

对于我的UI,有一个层次结构链创建如下

  • MainCanvas(屏幕空间 - 摄像机,平面距离为0.31(近平面为0.3))
    • EmptyPanel
      • UI_A(使用rect变换)
        • UI_B(使用rect变换)

Emptypanel包含一个脚本,该脚本在运行时创建UI_A,父UI_A创建自身

GameObject UI_A= Instantiate(g);
UI_A.transform.position = transform.position;
UI_A.transform.SetParent(transform);
UI_A.transform.localScale = transform.localScale;

UI_A还包含一个创建UI_B的脚本,该脚本将自身附加到UI_A

//script in UI_A
void Start () {

        //float width = GetComponent<RectTransform>().rect.width;
        //float height = GetComponent<RectTransform>().rect.height;

        Vector3 pos = transform.position;
        pos += new Vector3(offsetFromEdge.x, offsetFromEdge.y, 0f);

        _UI_B = new UI_B(transform, pos);

    }

并在UI_B构造函数中:

    public UI_B(Transform parent, Vector3 pos)
    {

        GameObject obj = new GameObject();
        obj.AddComponent<Canvas>();

        var comp = obj.GetComponent<RectTransform>();
        comp.pivot = Vector2.zero;
        comp.anchorMin = Vector2.zero;
        comp.anchorMax = Vector2.zero;

        obj.transform.position = pos;

        obj.SetParent(parent);
        obj.localScale = scale;

    }

因此,当offsetFromEdge为(0,0)时,UI_B在它应该的位置显得很好,就在UI_A之上,localPosition为(0,0,0)。但是,当我将offsetFromEdge的值设置为(1,1)时,UI_B localposition变得非常庞大(3611.xx,3611.xx,0);

这些值显示在RectTransform组件的Pos X和Pos Y上,我认为它与UI_B的transform.localPosition相同。

我不知道导致这种行为的原因。

1 个答案:

答案 0 :(得分:2)

您首先设置游戏对象的世界位置然后更改其父级,这就是您没有获得所需位置的原因。您应首先设置父级,然后通过transform.localposition设置位置。