gpt4 book ai didi

c# - Unity3d 从父源实例化一个子预制件

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:59 24 4
gpt4 key购买 nike

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

我有一个名为 GreyPiece 的预制件,单击它时,这个 GreyPiece 应该会创建相同类型的子项目前我的 GreyPiece 类有一个名为 GreyPieceTransform 的公共(public) Transform 对象

public Transform greyPieceTransform;

此变换与主 GreyPiece 预制件相同 [在 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());

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

  • parent
    • child

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

  • parent
    • child
    • child
      • child

如果我创建 3

  • parent
    • child
    • child
      • child
    • child
      • child
      • child
        • child

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

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

this id -185148 prefab id -185148 child id -185236

this id -185148 prefab id -185148 child id -185318

this id -185148 prefab id -185148 child id -185418

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

为了使这一点更清楚,我决定将转换命名为“灰色”+greyPiece.getInstanceID();这是它在层次结构 View 中的样子

screenshot

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

最佳答案

我猜问题出在下面。在第一次实例化时,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 组合。

案例一

如果 Test 附加到 hierarchy 中的对象并且 prefab 是对项目中预制件的引用,ids会有所不同

案例二

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

案例三

如果 Test 附加到预制件上,并且字段预制件指向自身,当它第一次被实例化(或拖入层次结构)时,转换和预制件字段将指向同一个对象(预制实例的转换)。ID 将相等。

apparently what's happening is that the when instantiating an object from a that prefab Transform [greyPieceTransform], it's using it as the current object and modifies the original one [so greyPiece and greyPieceTransform would be the same]

没有。如果对象的 greyPieceTransformtransform 不同,“原始”将不会被修改。但可能不是。

关于c# - Unity3d 从父源实例化一个子预制件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25831217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com