如何使用SetParent将游戏对象移回其在层次结构中的原始位置?

时间:2018-10-31 23:40:50

标签: c# unity3d

例如,如果我具有原始层次结构:

Cube1
 Cube2

我在Cube2上做了:

transform.SetParent(null);

现在层次结构如下:

Cube1
Cube2

但是,如果我现在想将Cube2移回他的原始位置?

Cube1
 Cube2

对于其他对象(如果它们是孩子或子父母的孩子)也是如此,我移动了一组对象并将它们全部设置为SetParent(null),现在我希望它们全部返回它们到原始位置。

3 个答案:

答案 0 :(得分:3)

您找到作为父级的“ Cube1”游戏对象:

GameObject cube1 = GameObject.Find("Cube1");

您再次调用SetParent函数,但在传递给它的参数中使用了“ Cube1”变换:

transform.SetParent(cube1.transform);

答案 1 :(得分:0)

我在游戏指南中使用了类似的内容。基本上,目的是将UILayer中的游戏对象转移到TutorialLayer中。

  1. 在我们游戏的TutorialHandler中,我制作了Dictionary<int, GameObject> originalParent

  2. PutToLayer(GameObject targret)函数将目标转移到TutorialLayer,并使用目标的实例ID作为键originalParent.Add(target.GetInstanceId()),target.transform.parent将原始父项存储到字典中。 )

  3. 可以通过从字典中获取trarget来返回原始父对象 Transform origParent = originalParent[target.GetInstanceId()]; target.SetParent(origParent);

通过这种方式,您可以在将游戏对象转移到其他父母的同时,保持对原始父母的了解

答案 2 :(得分:0)

我认为更好的解决方案不会涉及任何硬编码名称或检查器分配,因为当您重命名或移动对象时,这些实现容易中断。

我将创建一个新组件,以记住原始父对象,然后在告诉您时将其留下或重新加入。

public class RoamingChild : MonoBehaviour {

     private Transform _parent;

     public void Awake () {
          _parent = transform.parent;
     }

     //Leave the parent and go off on its own!
     public void Leave () { 
          transform.SetParent(null);
     }

     //Come back to the parent!
     public void Rejoin () {
          transform.SetParent(_parent);
     }
}

Child返回到Parent中的相同位置可能也很有用。因此Child2可以离开,然后作为第二个孩子重新加入父母。

您还可以通过记住SiblingIndex来添加此功能。

public class RoamingSibling : MonoBehaviour {

     private Transform _parent;
     private int _siblingIndex;

     public void Awake () {
          _parent = transform.parent;
          _siblingIndex = transform.GetSiblingIndex();
     }

     //Leave the parent and go off on its own!
     public void Leave () { 
          transform.SetParent(null);
     }

     //Come back to the parent!
     public void Rejoin () {
          transform.SetParent(_parent);
          transform.SetSiblingIndex(_siblingIndex);
     }
}