Unity3D: ошибка при создании макета сетки со списком <Transfrom> - PullRequest
0 голосов
/ 04 сентября 2018

Unity3D 2018.2

Проблема: Сетка не заполняется списком, неправильно реагирует на список <>, заполненный преобразованиями, содержит по крайней мере 1 элемент в списке <>, поэтому он не должен быть пустым. Что-то не передается правильно

Я пытаюсь создать сетку в виде прокрутки, которая заполнена кнопками, содержащими преобразования, хранящиеся в списке <>

Я получаю преобразования из проверки GameObject, в котором обычно содержится 0-25 дочерних преобразований.

Как только он получит все дочерние преобразования из родительского GameObject, проверьте, у какого дочернего элемента есть тег с именем «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;
 }
}

1 Ответ

0 голосов
/ 04 сентября 2018

В 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 больше!

Результат: вы добавляете все больше и больше элементов в один и тот же список «навсегда», пока на вашем устройстве не заканчивается память.

...