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 个元素,i
1
大!
结果:您"永远"将越来越多的元素添加到同一列表中,直到您的设备内存不足。