我怎样才能得到任何一个子代的父代,然后搜索特定的子代?

问题描述 投票:0回答:1

例如,这是一个预制的结构在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,我可以手动拖动它们,但这将是一个很大的工作。

c# unity3d
1个回答
0
投票

如果你想找到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");

0
投票

在我看来,这里正确而干净的方式应该是 不用 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);
    }
}

当然,你会使用一些更有意义的名字,而不是使用 Child3child6 ;)

© www.soinside.com 2019 - 2024. All rights reserved.