例如,这是一个预制的结构在hierarhcy 。
Prefab1
Child1
Child2
Child3
Child4
Child5
Child6
Child7
Child8
例如,我有一个脚本连接到Child3或任何其他的孩子,但让我们说Child3,我想找到它的prefab父,然后得到并循环所有的Prefab1的孩子,并得到Child6和Child7。
现在,Child6和Child7都被标记为 "ThisChilds",但由于在世界的层次结构中,我有更多被标记为 "ThisChilds "的孩子,我想找到这个Prefab1的Child6和7,而不是世界上其他Prefabs的。
原因是我想在附加于Child3的脚本中分配Child6和Child7。
例如Child3中的脚本将是.NET,而不是在编辑器中手动拖动这个Child6和Child7中的脚本,我可以手动拖动它们,但是会很麻烦。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
public class GetChilds : MonoBehaviour
{
public GameObject Child6
public GameObject Child7
但是,我不想在编辑器中拖动这个Childs手册,而是想自动找到它们,并在Start()中把它们分配给Child6和Child7,我可以手动拖动它们,但这将是一个很大的工作。
如果你想找到Prefab1,如果它的根游戏对象在层次结构中,那么你可以找到它像
Gameobject rootGameobject = child3.transform.root.gameobject;
然后,如果你想找到这个gameobject的任何子对象,你可以使用
Gameobject Child6 = rootGameobject.transform.Find("Child6");
Gameobject Child7 = rootGameobject.transform.Find("Child7");
甚至你可以找到这样的嵌套的孩子。
Gameobject Child67 = rootGameobject.transform.Find("Child6/Child67");
在我看来,这里正确而干净的方式应该是 不用 Find
根本.
而不是在你的根对象上使用一个Component,并通过Inspector引用所有你需要的东西,比如说.
public class YourController : MonoBehaviour
{
[SerializeField] private GameObject child3;
[SerializeField] private GameObject child6;
// etc whatever you need
public GameObject Child3 => child3;
public GameObject Child6 => child6;
}
然后在你的子组件中使用如.
public class Child3Component : MonoBehaviour
{
// Best if you reference this already in the Inspector
[SerializeField] private YourController yourController;
private void Awake()
{
// As fallback get in once on runtime
if(!yourController) yourController = GetComponentInParent<YourController>();
}
private void SomeMethod()
{
// Now access the references you need
Debug.Log(yourController.Child6.name);
}
}
当然,你会使用一些更有意义的名字,而不是使用 Child3
或 child6
;)