例如,如果我具有原始层次结构:
Cube1
Cube2
我在Cube2上做了:
transform.SetParent(null);
现在层次结构如下:
Cube1
Cube2
但是,如果我现在想将Cube2移回他的原始位置?
Cube1
Cube2
对于其他对象(如果它们是孩子或子父母的孩子)也是如此,我移动了一组对象并将它们全部设置为SetParent(null),现在我希望它们全部返回它们到原始位置。
答案 0 :(得分:3)
您找到作为父级的“ Cube1”游戏对象:
GameObject cube1 = GameObject.Find("Cube1");
您再次调用SetParent
函数,但在传递给它的参数中使用了“ Cube1”变换:
transform.SetParent(cube1.transform);
答案 1 :(得分:0)
我在游戏指南中使用了类似的内容。基本上,目的是将UILayer中的游戏对象转移到TutorialLayer中。
在我们游戏的TutorialHandler中,我制作了Dictionary<int, GameObject> originalParent
PutToLayer(GameObject targret)
函数将目标转移到TutorialLayer,并使用目标的实例ID作为键originalParent.Add(target.GetInstanceId()),target.transform.parent将原始父项存储到字典中。 )
可以通过从字典中获取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);
}
}