如何解决如何在列表中获取游戏对象的组成部分
我有这个脚本可以将我选择的游戏对象添加到列表中(在运行时)。
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:父游戏对象同时只有一个孩子。
添加到列表中的每个gameobject都有一个文本组件,我想从列表中获取这些单独的文本组件并将其放入新的可变文本中。 喜欢:
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 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);
虽然可能会有更优雅的解决方案(当前仅在我的智能手机上)
,我不知道您的意思,您可以这样做:var TextsList = Objects3d.Select(object => object.GetComponent<Text>()).ToList()
要获取所有对象的文本,也可以使用从列表中选择组件的位置,您的值在哪里:string text = Objects3d.Where(object => object.GetComponent<Text>() = "your_value");
这是基本的C#
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。