Unity3D: GridLayout продолжает добавлять 1 элемент под последним элементом, когда count равен 1 - PullRequest
0 голосов
/ 05 сентября 2018

Unity3D 2018.2

Итак, у меня есть холст, который отключается и активируется по выбору пользователя. У меня есть список, заполненный преобразованиями, в которых я заполнил сетку. У меня также есть еще один список для хранения всех изображений, которые будут использоваться для заполнения сетки, так как сетка заполняется кнопками, содержащими преобразование. Например, если я нажимаю кнопку и запускаю Debug.Log ("transform.name"), я должен увидеть все свои разные преобразования.

Проблема 1: каждый раз, когда этот холст включается или отключается, сетка продолжает добавлять 1 элемент под начальный, и после того, как включается / отключается снова, другой элемент создается под этим один.

+

Проблема 2: Также не вызывается ни одна из этих созданных экземпляров кнопок. Может быть проблема здесь из-за 1-й проблемы?

Вот код, который у меня есть внутри кнопки, которую я имею

public class SatelliteButton : MonoBehaviour {

[SerializeField]
private Image myIcon;

 public void SetIcon(Sprite mySprite)
 {
     myIcon.sprite = mySprite;
 }

 public void OnMouseEnter()
 {
     Debug.Log(transform.name);
 }
}

Вот код для заполнения сетки

public class SatelliteGridControl : MonoBehaviour {

private List<Transform> satelliteListFromPlanet;

[SerializeField]
private GameObject buttonTemplate;
[SerializeField]
private GridLayoutGroup gridGroup;
[SerializeField]
private List<Sprite> iconSprites;

// Use this for initialization
void OnEnable()
{
    getSatellitesInPlanet();
    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 (Transform sat in satelliteListFromPlanet)
    {
        GameObject newButton = Instantiate(buttonTemplate) as GameObject;
        newButton.SetActive(true);

        newButton.GetComponent<SatelliteButton>().SetIcon(iconSprites[Random.Range(0, iconSprites.Count)]);
        newButton.transform.SetParent(buttonTemplate.transform.parent, false);
    }
 }
}

Я ценю помощь! Изучение расположения сетки с помощью List <>!

Ответы [ 2 ]

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

В genInventory() Вы создаете новую кнопку для каждого Transform в satelliteListFromPlanet. Поскольку добавляется только 1, кажется, что ваш список содержит только 1 элемент.

Но вы никогда не уничтожаете и не удаляете эти Instantiated GameObjects, поэтому в следующий раз, когда вы снова включите объект, будет вызван OnEnable, и будут созданы новые префабы.

Решение:

Убедитесь, что где-то хранятся объекты Intititiated, например,

private List<GameObject> instances = new List<GameObject>();

//....

foreach (Transform sat in satelliteListFromPlanet)
{
    GameObject newButton = Instantiate(buttonTemplate) as GameObject;
    newButton.SetActive(true);

    newButton.GetComponent<SatelliteButton>().SetIcon(iconSprites[Random.Range(0, iconSprites.Count)]);
    newButton.transform.SetParent(buttonTemplate.transform.parent, false);

    instances.Add(newButton);
}

А чем вы можете их уничтожить при отключении объекта:

private void OnDisable()
{
    foreach(var instance in instances)
    {
        Destroy(instance);
    }
}
0 голосов
/ 05 сентября 2018

Проблема 1: Каждый раз, когда этот холст включается или отключается, сетка продолжает добавлять 1 элемент под начальный, а после повторного включения / выключения создается другой элемент под этим.

Прямо сейчас вы вызываете getSatellitesInPlanet () для метода OnEnabled () в SatelliteGridControl. Этот метод вызывается каждый раз, когда объект активен . Если вы просто хотите вызвать свой метод один раз, используйте Start .

Проблема 2: Также не вызывается ни одна из этих созданных экземпляров кнопок. Может быть проблема здесь из-за 1-й проблемы?

Я не думаю, что проблемы связаны. Можете ли вы подтвердить, что ваш префаб buttonTemplate содержит элемент Image и его RaycastTarget включен?

Всего лишь один совет, я бы назначил тип buttonTemplate для SatelliteButton, а не GameObject. Таким образом, вы можете создать его экземпляр типа SatelliteButton и избежать необходимости вызова:

newButton.GetComponent<SatelliteButton>()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...