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",直到您的设备内存不足。
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",直到您的设备内存不足。