Статический список создается каждый раз, когда он вызывается - PullRequest
0 голосов
/ 03 декабря 2018

Я новичок в программировании на C # и использовании Unity. У меня возникают проблемы при использовании списков.

У меня есть статический класс, в котором я храню данные для использования в разных сценах, там у меня есть список GameObject.Вот код для этого:

 public static class data {
     private static List<GameObject> objectsInScene;

     static sendsize() {
         objectsInScene = new List<GameObject>();
     }

     public static List<GameObject> ObjectsInScene
     {
        get{
            return objectsInScene;
        }
     }

     public static void addObject(GameObject obj)
     {
         objectsInScene.Add(obj);
     }
 }

И когда я пытаюсь получить доступ к списку, он просто возвращает ноль, даже когда я заполнил его GameObjects.

Также пытался изменить private static List<GameObject> objectsInScene;на private static List<GameObject> objectsInScene = new List<GameObject>(); и все еще возвращаю ноль

Я заполняю список в этом скрипте (вызывая функцию добавления с событием в инспекторе):

   public class Add : MonoBehaviour {
        public void add(GameObject obj){
            GameObject objInstance = Instantiate(obj);
            sendsize.addObject(objInstance);
        }
    }

Я пытаюсьполучить доступ к нему в этом сценарии:

public class Setup3D : MonoBehaviour {
    void Start() {

        foreach (GameObject obj in data.ObjectsInScene) 
        {
            Instantiate(obj);
        }
    }
}

1 Ответ

0 голосов
/ 03 декабря 2018

У нас была небольшая XY проблема здесь.Вот ответ для списка, являющегося нулевым.

public static class Data
{
    public static List<GameObject> ObjectsInScene = new List<GameObject>();

    public static void AddObject(GameObject obj)
    {
        ObjectsInScene.Add(obj);
    }
}

public class Setup3D : MonoBehaviour
{
    public GameObject prefab;

    void Start()
    {
        // Adding objects to your list
        GameObject objInstance = Instantiate(prefab);
        Data.AddObject(objInstance);

        // cycling through the list
        foreach (GameObject obj in Data.ObjectsInScene)
        {
            Instantiate(obj);
        }
    }
}

Не забудьте перетащить ваши префабы GameObject в слот GameObject в вашем инспекторе в Unity tho.В противном случае вы получите NullReferenceException.

. Настоящая проблема здесь заключается в том, что OP хотел сохранить экземпляры GameObject в статическом списке, чтобы иметь возможность снова создавать их экземпляры в другой сцене.Вы не можете сделать это, потому что вы сохраняете ссылку в GameObject.Вместо этого вам следует сохранить данные преобразования объектов и восстановить их в другой сцене, а затем применить преобразования.Как это:

using System.Collections.Generic;
using UnityEngine;

public static class Data
{
    public static List<DataStructure> ObjectsInScene = new List<DataStructure>();

    public static void AddObject(GameObject obj)
    {
        ObjectsInScene.Add(new DataStructure
        {
            position = obj.transform.position,
            rotation = obj.transform.rotation,
            scale = obj.transform.localScale
        });
    }
}

public class DataStructure
{
    public Vector3 position;
    public Quaternion rotation;
    public Vector3 scale;    
}

public class Setup3D : MonoBehaviour
{
    public GameObject prefab;

    void Start()
    {
        // Adding objects to your list
        GameObject objInstance = Instantiate(prefab);
        Data.AddObject(objInstance);

        // cycling through the list
        foreach (DataStructure obj in Data.ObjectsInScene)
        {
            var instantiated = Instantiate(prefab);
            instantiated.transform.position = obj.position;
            instantiated.transform.rotation = obj.rotation;
            instantiated.transform.localScale = obj.scale;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...