Unity3D:使用 List<Transfrom> 创建网格布局时出错



Unity3D 2018.2

问题:网格未按列表填充,无法正确响应 列表中<>填充了转换,在列表中至少包含 1 个项目<>因此它不应为空。某些内容未被转让给权利

我正在尝试在滚动视图中创建一个网格布局,其中充满了包含保存在列表中的转换的按钮<>

我通过检查一个游戏对象来获得转换,该游戏对象通常包含 0-25 个子转换。

从父级的游戏对象获取所有子项转换后,请检查哪个子项具有名为"卫星"的标记。用列表填充网格后<>其中包含那些特定的游戏对象转换。

单击网格中的按钮应该包含转换,例如,如果我使用 Debug.Log(transform.name(,脚本中的 OnMouseEnter(( 它应该显示它。

这是我使用的代码,它不包含任何错误,网格是空的,所以我没有正确接收转换,但我不知道代码出了什么问题。谢谢你的帮助。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SatelliteGridControl : MonoBehaviour {
private List<Transform> satelliteListFromPlanet;
[SerializeField]
private GameObject buttonTemplate;
[SerializeField]
private GridLayoutGroup gridGroup;
[SerializeField]
private Sprite[] iconSprites;
// Use this for initialization
void OnEnable()
{
getSatellitesInPlanet();
satelliteListFromPlanet = new List<Transform>();
for (int i = 1; i <= satelliteListFromPlanet.Count; i++)
{
SatTransfrom newSatellite = new SatTransfrom();
newSatellite.iconSprite = iconSprites[Random.Range(0, iconSprites.Length)];
satelliteListFromPlanet.Add(newSatellite);
}
GenInventory();
}
//  Get Satellites
private void getSatellitesInPlanet()
{
satelliteListFromPlanet = new List<Transform>();
//  Get current planet
Transform currentPlanet = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<HandleCamera>().targetToLookAt;
//  Check inside for satellites
foreach (Transform satellite in currentPlanet)
{
//  Check transform for tag
if (satellite.CompareTag("Satellite"))
{
//  Add each transform from planet to array
satelliteListFromPlanet.Add(satellite);
}
}
}
//  Handle Grid
private void GenInventory()
{
if (satelliteListFromPlanet.Count < 6)
{
gridGroup.constraintCount = satelliteListFromPlanet.Count;
}
else
{
gridGroup.constraintCount = 5;
}
foreach (SatTransfrom sat in satelliteListFromPlanet)
{
GameObject newButton = Instantiate(buttonTemplate) as GameObject;
newButton.SetActive(true);
newButton.GetComponent<SatelliteButton>().SetIcon(sat.iconSprite);
newButton.transform.SetParent(buttonTemplate.transform.parent, false);
}
}
public class SatTransfrom : Transform
{
public Sprite iconSprite;
}
}

OnEnable中,您首先调用getSatellitesInPlanet来填充列表satelliteListFromPlanet

但是在你完成之后,你打电话

satelliteListFromPlanet = new List<Transform>();

这会将您的列表重置为新的空列表。

比你有一个循环

for (int i = 1; i <= satelliteListFromPlanet.Count; i++)
{ //... }

但由于此刻satelliteListFromPlanet是一个空列表,因此没有任何反应。

最后,当您致电GetInventory您的列表仍然为空时,因此

foreach (SatTransfrom sat in satelliteListFromPlanet)

从不执行,因为satelliteListFromPlanet中没有元素。


现在来看第二个问题:

你有

for(int i = 0; i< sateliteLostFromPlanet.Count; i++)

但是在这个循环中,你做

sateliteListFromPlanet.Add(xy);

。那么,在运行此循环期间,您的列表会发生什么情况?

它每个循环都会变大 1 个,所以你的循环条件i < sateliteListFromPlanet.Count都是正确的,因为每次执行后你的列表都长 1 个元素,i1大!

结果:您"永远"将越来越多的元素添加到同一列表中,直到您的设备内存不足。

最新更新