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

时间:2018-09-04 06:39:50

标签: list unity3d transform grid-layout

Unity3D 2018.2

  

问题:列表未填充网格,无法正确响应   List <>用Transforms填充,在List <>中至少包含1个项目,因此它不能为空。某些东西没有被正确转移

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

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

一旦从父级的GameObject获得所有子级转换,请检查哪个子级具有名为“卫星”的标签。用包含那些特定gameObject.transforms的List <>填充网格后。

单击网格中的按钮应包含转换,例如,如果我使用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;
 }
}

1 个答案:

答案 0 :(得分:1)

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 }}更大!

结果:您将“永远”向同一列表添加越来越多的元素,直到设备用尽内存。