首页 文章

Unity3d从父源实例化子预制件

提问于
浏览
2

我最初在answers.unity3d上发布了这个问题但没有得到答案Unity3d Instantiate a child prefab from the parent source

我有一个名为GreyPiece的Prefab,当点击它时,这个GreyPiece应该创建相同类型的子节点,目前我的GreyPiece类有一个名为GreyPieceTransform的公共Transform对象

public Transform greyPieceTransform;

此变换与主要GreyPiece Prefab [在Unity3d编辑器中拖放]相同 . 当单击对象时,我[根据需要]为此对象实例化多个子项并将变换设置为父项

Transform greyPiece = Instantiate(greyPieceTransform, transform.position, transform.rotation) as Transform;
greyPiece.parent = transform;
Debug.Log("this id "+transform.GetInstanceID()+"\tprefab id "+greyPieceTransform.GetInstanceID()+"\tchild id "+greyPiece.GetInstanceID());

到目前为止一切顺利,如果我创建一个对象并单击它,我将有一个孩子

亲子

现在如果我创造2我会得到这个

父母子女

如果我创造3

父母子女儿童儿童儿童儿童

基本上发生了什么,原来的GreyPieceTransform似乎正在改变,当我尝试实例化另一个对象时,它正在修改[当前父级]并从中实例化,如果我没有设置父级,则不会发生此问题新的实例化对象

EDIT: 我还添加了一个调试输出debug.Log输出就是这个

这个id -185148 prefab id -185148孩子id -185236这个id -185148预制id -185148孩子id -185318这个id -185148预制id -185148孩子id -185418

如您所见,父变换和预制变换具有相同的ID,但它们不应该

为了使这更清楚,我决定将变换命名为“grey”greyPiece.getInstanceID();这就是它在层次结构视图中的样子

screenshot

所以现在,我如何让grePieceTransform实际引用预制[从预制实例化]而不是它与父母具有相同的参考

1 回答

  • 0

    我猜问题如下 . 在第一个实例化 transformgreyPieceTransform 指向同一个对象 . 你可以检查一下comparing instance ids .

    如果是这种情况,您看到的行为是合理的 . 第一次实例化一个新的 GameObject 时,源对象没有父对象,也没有子对象,所以你只得到一个孩子 . 第二次使用1个子实例化父项并将其作为子项附加(图2) . 等等 .

    这是一个可能有用的简单代码段:

    public class Test : MonoBehaviour {
    
        public Transform prefab;
    
        // Use this for initialization
        void Start () {
    
        }
    
        // Update is called once per frame
        void Update () {
    
            if (Input.GetKeyDown(KeyCode.A))
            {
                Debug.Log("prefab id " + prefab.GetInstanceID() + " this id " + transform.GetInstanceID());
            }
        }
    }
    

    它将根据对象引用的设置方式打印不同的ID组合 .

    Case 1

    如果 Test 附加到 hierarchy 中的对象, prefab 是对项目中预制件的引用, ids will be different .

    Case 2

    如果 Test 附加到 hierarchy (这是一个预制实例)中的对象,并且 prefab 是对项目中链接预制件的引用,则ID仍然不同 . (预制件是从实例化对象到预制件的链接 . 在这种情况下,它应该是预制属性覆盖,您应该在检查器中看到粗体字体) . Ids will be different.

    Case 3

    如果 Test 附加到预制件并且字段预制指向其自身,则在第一次实例化(或拖入层次结构)时,变换和预制字段将指向同一对象(预制实例的变换) . Ids will be equal.

    显然正在发生的事情是,当从预制的Transform [greyPieceTransform]实例化一个对象时,它将它用作当前对象并修改原始对象[所以greyPiece和greyPieceTransform将是相同的]

    不 . 如果对象的 greyPieceTransformtransform 不同,"original"赢了't be modified. But probably they aren' t .

相关问题