如何在列表中获取游戏对象的组件

How to get component of gameobjects in a list

我有这个脚本可以将我选择的游戏对象添加到列表中(在运行时)。

public Transform ParentOfList;
public List<GameObject> Objects3d = new List<GameObject>();
public GameObject ActualSelected;

public void add3DtoList()
{
    foreach (Transform child in ParentOfList) // iterate through all first level children
    {
        if (child.gameObject.activeSelf)
        {
            Debug.Log($"The child {child.name} is active!");
            ActualSelected = child.gameObject;
            if (Objects3d.Contains(ActualSelected))
            {
                Debug.Log("Already exist in list");
            }
            else
            {
                Objects3d.Add(ActualSelected); //add the actual gameobject selected in runtime to list
            }
        }
    }
}

PD:父游戏对象只有一个子游戏对象同时处于活动状态。

添加到列表中的每个游戏对象都有一个文本组件,我想从列表中获取这些单独的文本组件并将其放入新的可变文本中。 喜欢:

Text MergeText;
MergeText.text = ListIndex1.text + ListIndex2.text + etc;

我不知道如何实现它。一些指导?,谢谢。

已解决, 脚本一列表:

public Transform ParentOfList;
    public List<GameObject> Objects3d = new List<GameObject>();
    public GameObject ActualSelected;
    public Text MergeText;

    public void add3DtoList()
    {
        foreach (Transform child in ParentOfList) // iterate through all first level children
        {
            if (child.gameObject.activeSelf)
            {
                Debug.Log($"The child {child.name} is active!");
                ActualSelected = child.gameObject;
                if (Objects3d.Contains(ActualSelected))
                {
                    Debug.Log("Already exist in list");
                }
                else
                {
                    Objects3d.Add(ActualSelected); //add the actual gameobject selected in runtime to list
                }
            }
        }
        MergeText.text = string.Join("\n", Objects3d.Select(obj => obj.GetComponent<Text>().text));
    }

已解决, 两个列表的脚本:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;

public class LIST3DOBJECTS : MonoBehaviour
{
    public Transform ParentOfListCodigo;
    public Transform ParentOfListDesc;
    public List<GameObject> Objects3dCodigo = new List<GameObject>();
    public List<GameObject> Objects3dDesc = new List<GameObject>();
    public GameObject ActualSelectedCode;
    public GameObject ActualSelectedDesc;
    public Text MergeTextCode;
    public Text MergeTextDesc;
    public Text MergeLists;

    public void add3DtoList()
    {       
        foreach (Transform child in ParentOfListCodigo) // iterate through all first level children
        {
            if (child.gameObject.activeSelf)
            {
                Debug.Log($"The child {child.name} is active!");
                ActualSelectedCode = child.gameObject;
                if (Objects3dCodigo.Contains(ActualSelectedCode))
                {
                    Debug.Log("Already exist in list");
                }
                else
                {
                    Objects3dCodigo.Add(ActualSelectedCode); //add the actual gameobject selected in runtime to list
                }
            }
        }
        MergeTextCode.text = string.Join("\n", Objects3dCodigo.Select(obj => obj.GetComponent<Text>().text)); //first list, show the code (name), of the children gameobject


        foreach (Transform child in ParentOfListDesc) // iterate through all first level children
        {
            if (child.gameObject.activeSelf)
            {
                Debug.Log($"The child {child.name} is active!");
                ActualSelectedDesc = child.gameObject;
                if (Objects3dDesc.Contains(ActualSelectedDesc))
                {
                    Debug.Log("Already exist in list");
                    
                }
                else
                {
                    Objects3dDesc.Add(ActualSelectedDesc); //add the actual gameobject selected in runtime to list
                    
                }
            }
        }
        MergeTextDesc.text = string.Join("\n", Objects3dDesc.Select(obj => obj.GetComponent<Text>().text)); //second list, show the description of the children gameobject
        CleanText();
    }

    private void CleanText()
    {
        var list1 = Objects3dCodigo.Select(child => child.GetComponent<Text>().text);
        var list2 = Objects3dDesc.Select(child => child.GetComponent<Text>().text);
        var zipped = list1.Zip(list2, (l1, l2) => $"{l1}\n{l2}");
        MergeLists.text = string.Join("\n", zipped);
    }

}

我不明白你的意思,你可以这样做:
var TextsList = Objects3d.Select(object => object.GetComponent<Text>()).ToList() 要获取所有对象文本,或者你可以使用 where select 列表中的组件 where is你的价值:
string text = Objects3d.Where(object => object.GetComponent<Text>() = "your_value");
它是基本的 C#

听起来你想做的事情就像是

var stringBuilder = new StringBuilder();
foreach(var child in Objects3d)
{
    stringBuilder.Append(child.GetComponent<Text>().text);
}
MergeText.text = stringBuilder.ToString();

或者如果你想使用 Linq 你也可以,例如做一些像

MergeText.text = string.Join("", Objects3d.Select(child => child.GetComponent<Text>().text));

而不是 "" 您还可以使用“定界符”——一个分隔符字符串,例如" "", ""\n"

同样的事情你当然也可以使用 upper 方法附加。


关于评论中的后续问题

对于两个列表,您可以采用第一种方法,但按索引进行迭代,例如

for(var i =0; i< Objects3d.Length; i++)
{  
    stringBuilder.Append(Objects3d[i]).Append('\n')
        .Append(otherList[i]).Append('\n'); 
}

或者您可以使用第二种 Linq 方法并使用 .Zip 将两个列表“合并”在一起,我认为例如像这样

var list1 = Objects3d.Select(child => child.GetComponent<Text>().text);
var list2 = OtherList.Select(child => child.GetComponent<Text>().text);
var zipped = list1.Zip(list2, (l1, l2) => $"{l1}\n{l2}");
MergeText.text = string.Join("\n", zipped);

虽然可能有更优雅的解决方案(目前仅在我的智能手机上)