Jump to content
Unity Insider Forum

Zugriff auf Liste in einem anderen Skript


Elharter

Recommended Posts

Hallo,

hab da ein Problem mit dem Zugriff auf eine Liste in einem anderen Skript. Vielleicht könnt ihr mir helfen.
 

Script1 - for example ill call it "baseData.cs":


 
  1. using UnityEngine;
  2. using System.IO;
  3. using System.Collections.Generic;
  4.  
  5. public class TrackData
  6. {
  7.  
  8. blablabla... file loading and so on....
  9.  
  10. public List<TrackObject> trackObjects = new List<TrackObject>();
  11.  
  12. // Track Objects
  13.  
  14. int objStart = index;
  15. int objCount = int.Parse(data[index + 1].ToString("X2") + data[index].ToString("X2"), System.Globalization.NumberStyles.HexNumber);
  16. index += 2;
  17. for (int i = 0; i < objCount; i++)
  18. {
  19. TrackObject obj = new TrackObject();
  20. obj.type = (TrackObjectsType)data[index];
  21. Debug.LogError(obj.type);
  22. index += 2;
  23. obj.x = int.Parse(data[index + 1].ToString("X2") + data[index].ToString("X2"), System.Globalization.NumberStyles.HexNumber);
  24. Debug.LogError("X:"+obj.x);
  25. index += 2;
  26. obj.y = int.Parse(data[index + 1].ToString("X2") + data[index].ToString("X2"), System.Globalization.NumberStyles.HexNumber);
  27. Debug.LogError("Y:" + obj.y);
  28. index += 2;
  29. obj.rotation = data[index + 1] * 360f / 244f + data[index] / 244f;
  30. Debug.LogError("rot:" + obj.rotation);
  31. index += 2;
  32. trackObjects.Add(obj);
  33. }
  34.  
  35. public struct TrackObject
  36. {
  37. public TrackObjectsType type;
  38. public int x, y;
  39. public float rotation;
  40. }
  41.  
  42. public enum TrackObjectsType
  43. {
  44. Start = 0,
  45. Wall,
  46. Bush,
  47. Fence
  48. }
  49.  
  50.  

Script2 - for example i call it "TrackLoading.cs":


 
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5.  
  6. public class Test : MonoBehaviour
  7. {
  8. void Start()
  9. {
  10. files = System.IO.Directory.GetFiles(Application.streamingAssetsPath, "*.trk");
  11. //files = new string[] {
  12. Next();
  13. }
  14. public void Next()
  15. {
  16. if (index >= files.Length) return;
  17. TrackData data = new TrackData(files[index]);
  18.  
  19. }
  20. }
  21.  
  22.  

Alles funktioniert tadellos.... Datei laden, auslesen, Liste füllen. Alles da.

Ich möchte aber nun in der test.cs auf das Listenobjekte zugreifen und obj.type, obj.x und obj.y auslesen damit ich die entsprechenden Objekte spawnen lassen kann. Ich schaffe es nicht :(

 


danke

 

mike

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Den Code besser in <> packen, ich kann es kaum lesen mit dem Dunklen Forum-Layout.
Nachdem ich es kurz überflogen habe, es fehlen diverse Codeteile, aber 2 Sachen fallen mir bereits auf.

Deine Klassen sollten genauso heißen wie deine Skriptfiles, d.h. TrackData.cs und deine untere Klassen sollte nicht "Test" heißen, sondern "TrackLoading".

Zurück zum Thema. In der Klasse "Test" (bzw. "TrackLoading") musst du einfach nur ein public Accessor oder Instanzvariable einführen. Hier ein Beispiel für Ersteres.

Die Daten kannst du nun über eine Instanz der Klasse "TrackLoading" lesen. Dafür das Skript "TrackLoading" auf ein Gameobjekt in der Szene ziehen, eine andere Klasse kann nun eine Referenz auf dieses Objekt herstellen. Zugriff auf die Daten bekommst du über "Tracks", "Tracks" ist dabei eine Liste aus "TrackData":
 

public class Test : Monobehaviour {

public TrackLoading TrackLoader; // GameObjekt mit TrackLoading auf diesen Slot ziehen

  void Start() {
     foreach (TrackData data in TrackLoader.Tracks)
     { 
       print(data.trackObjects.Count);
     } 
  }

}


Man könnte TrackLoading auch in eine statische Klasse umwandeln. Dann müsstest du keine Instanz der Klasse in deiner Szene erzeugen und man könnte die Daten einfach mit "TrackLoading.Tracks" abfragen (ohne die Klasse in die Szene auf ein GameObjekt zu ziehen).

Hier aber nun die Klasse die noch einem GameObjekt in der Szene zugewiesen werden muss:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class TrackLoading : MonoBehaviour
{
  
  [SerializeField] protected List<TrackData> m_TrackData = new List<TrackData>();

  // Exposed properties
  public List<TrackData> Tracks {  get { return m_TrackData; } set { m_TrackData = value; } }

  void Start()
  {
     foreach (string file in System.IO.Directory.GetFiles(Application.streamingAssetsPath, "*.trk"))
     { 
       print("Reading file " + file);
       TrackData data = new TrackData(file);
       m_TrackData.Add(data);
     }
   }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...