【发布时间】:2014-09-14 07:56:17
【问题描述】:
我最初在 answers.unity3d 上发布了这个问题,但没有得到任何答案 Unity3d Instantiate a child prefab from the parent source
我有一个名为 GreyPiece 的预制件,当点击它时,这个 GreyPiece 应该会创建相同类型的子代 目前我的 GreyPiece 类有一个名为 GreyPieceTransform 的公共 Transform 对象
public Transform greyPieceTransform;
这个Transform与主要的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());
到目前为止一切顺利,如果我创建一个对象并单击它,我将有 1 个孩子
- 父级
- 孩子
现在如果我创建 2 我会得到这个
- 父级
- 孩子
- 孩子
- 孩子
如果我创建 3
- 父级
- 孩子
- 孩子
- 孩子
- 孩子
- 孩子
- 孩子
- 孩子
基本上发生的事情是原始的 GreyPieceTransform 似乎正在发生变化,当我尝试实例化另一个对象时,它会采用修改后的 [当前父级] 并从中实例化 如果我没有设置新实例化对象的父级,则不会发生此问题
编辑:我还添加了调试输出 debug.Log 输出是这样的
这个 id -185148 prefab id -185148 子 id -185236
此 id -185148 prefab id -185148 子 id -185318
此 id -185148 预制件 id -185148 子 id -185418
如您所见,父变换和预制变换具有相同的 id,但它们不应该
为了更清楚,我决定将变换命名为“灰色”+greyPiece.getInstanceID(); 这就是它在层次视图中的外观
那么现在,我怎样才能让 grePieceTransform 实际引用预制件 [从预制件中实例化] 而不是它与父代具有相同的引用
【问题讨论】:
-
我猜 grayPieceTransform 指向的是预制件实例而不是预制件本身,不是吗?
-
@Heisenbug 显然正在发生的事情是,当从预制变换 [greyPieceTransform] 实例化一个对象时,它使用它作为当前对象并修改原始对象 [所以 grayPiece 和 grayPieceTransform 将是相同的],我不确定如何防止这种情况发生>_
-
我不明白您要为公共字段 grayPieceTransform 分配什么。您是否有一个脚本实例,其中 grayPieceTransform 字段指向预制件(在项目中)?我想不会,否则它会按预期工作。你可能有一个对象的实例,它的变换与 grayPieceTransform 相同(检查实例 ID)。
-
@Heisenbug 公共字段 grayPieceTransform 在 Unity3d 编辑器中分配 [拖放] 用于预制件,我会检查他们的 id 并回复你,感谢 id 的想法!
标签: c# unity3d parent-child instantiation