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;
}
}
答案 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 }}更大!
结果:您将“永远”向同一列表添加越来越多的元素,直到设备用尽内存。