मैं सी # में कोडिंग के लिए नया हूं और एकता का उपयोग करते समय मुझे सूचियों का उपयोग करते समय समस्याएं आ रही हैं।

मेरे पास एक स्थिर वर्ग है जहां मैं दृश्यों में उपयोग करने के लिए डेटा रखता हूं, वहां मेरे पास गेमऑब्जेक्ट सूची है। यहाँ उसके लिए कोड है:

 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
Eduardo Londoño 3 पद 2018, 16:24

1 उत्तर

सबसे बढ़िया उत्तर

हमारे यहां थोड़ी 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);
        }
    }
}

अपने गेमऑब्जेक्ट प्रीफ़ैब्स को यूनिटी थो के भीतर अपने इंस्पेक्टर में गेमऑब्जेक्ट स्लॉट में खींचना न भूलें। अन्यथा आपको एक NullReferenceException मिलेगा।

यहां वास्तविक समस्या यह है कि ओपी तत्काल गेमऑब्जेक्ट्स को एक स्थिर सूची में सहेजना चाहता था ताकि उन्हें किसी अन्य दृश्य में फिर से चालू किया जा सके। आप ऐसा नहीं कर सकते क्योंकि आप संदर्भ को 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;
        }
    }
}
1
Antoine Thiry 3 पद 2018, 15:01