我最初在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();这就是它在层次结构视图中的样子
所以现在,我如何让grePieceTransform实际引用预制[从预制实例化]而不是它与父母具有相同的参考
1 回答
我猜问题如下 . 在第一个实例化
transform
和greyPieceTransform
指向同一个对象 . 你可以检查一下comparing instance ids .如果是这种情况,您看到的行为是合理的 . 第一次实例化一个新的
GameObject
时,源对象没有父对象,也没有子对象,所以你只得到一个孩子 . 第二次使用1个子实例化父项并将其作为子项附加(图2) . 等等 .这是一个可能有用的简单代码段:
它将根据对象引用的设置方式打印不同的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.不 . 如果对象的
greyPieceTransform
和transform
不同,"original"赢了't be modified. But probably they aren' t .