Unity3d从父源实例化子预制件

时间:2014-09-14 07:56:17

标签: c# unity3d parent-child instantiation

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

我有一个名为GreyPiece的预制件,当点击它时,这个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似乎正在改变,当我尝试实例化另一个对象时,它采取修改后的[当前父级]并从中实例化 如果我没有设置新实例化对象的父级,那么这个问题就不会发生

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

  

这个id -185148 prefab id -185148 child id -185236

     

此id -185148 prefab id -185148 child id -185318

     

这个id -185148 prefab id -185148 child id -185418

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

为了使这一点更加清晰,我决定将变换命名为" grey" + greyPiece.getInstanceID(); 这就是它在层次结构视图中的外观

screenshot

所以现在,我怎样才能让grePieceTransform实际引用预制[从预制实例化]而不是它与父母具有相同的引用

1 个答案:

答案 0 :(得分: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组合。

案例1

如果Test中的hierarchy附加了prefab,而Test中的hierarchy是对项目预制件的引用,则 ID将不同。< / p>

案例2

如果prefab附加到Test中的对象(这是一个预制实例),greyPieceTransform是对项目中链接预制件的引用,则ID仍然不同。 (prefab是从实例化对象到预制件的链接。在这种情况下,它应该是预制属性覆盖,你应该在检查器中看到粗体字。) ID会有所不同。

案例3

如果transform附加到预制件并且字段预制件指向自身,则在第一次实例化(或拖入层次结构)时,变换和预制字段将指向同一对象(变换预制实例)。 ID相等。

  

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

没有。如果对象的{{1}}和{{1}}不同,那么&#34;原始&#34;不会被修改。但可能他们不是。