【发布时间】:2020-12-20 12:37:43
【问题描述】:
我有这个脚本可以将我选择的游戏对象添加到列表中(在运行时)。
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));
}
已解决, 两个 List 的脚本:
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);
}
}
【问题讨论】:
-
你到底是什么意思?使用 Linq 你可以例如做
var texts = Objects3d.Select(obj => obj.GetComponent<Text>().text).ToList();还是你的意思是你想得到child.gameObject.GetComponent<Text>().text? -
@derHugo 我编辑了我的帖子,我认为现在更具描述性。基本上我想要做的是:在将所有我需要的游戏对象添加到列表中之后,我需要获取每个游戏对象的文本组件并将它们合并到一个新的文本变量中。比如:MergeText.text = ListIndex1.text + ListIndex2.text + etc;
-
但是得到的文本组件是什么?您在
Objects3d中收集的子对象? -
正确,我需要获取我在 Objects3d 中收集的子对象的文本组件