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

Unity3D: Error when creating Grid layout with List<Transfrom>

Unity3D 2018.2

Problem: Grid not being populated by list, not responding correctly to the List<> being filled with Transforms, contains at least 1 item in List<> so it should not be empty. Something is not being transferred right

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

我通过检查 GameObject 获得变换,其中通常有 0-25 个子变换。

从父游戏对象获取所有子变换后,检查哪个子具有名为 "Satellite" 的标签。在用包含某些 gameObject.transforms.

的列表<>填充网格之后

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

这是我正在使用的代码,其中没有错误,网格是空的,所以我没有正确接收转换,但我不知道代码有什么问题。谢谢你的帮助。

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 个元素并且 i 1 更大!

结果:您向同一个列表添加越来越多的元素"forever",直到您的设备内存不足。