Jump to content
Unity Insider Forum

Array Automatisch an Stelle i füllen


Singular

Recommended Posts

Hallo zusammen,

dieses Mal eine relativ simple Sache, die mir aber gerade Kopfzerbrechen verursacht auf deren Lösung ich gerade einfach nicht komme.

Ich möchte, dass zum Beginn meines Spiels nach einer zufälligen Zeit der erste Gegner auftaucht. Diese Zeit steht in einem ein Dimensionalen Array.

Allerdings kann ich schon die erste Zahl des Arrays nicht füllen. Entweder bin ich gerade zu Müde oder ich habe etwas grundlegendes nicht verstanden:

[...]

    private int i;
    private int[] rnd;
    private bool end;
    

    void Awake()
    {
        rnd[i] = Random.Range(2, 5);  //für diese Zeile kommt bereits der Fehler
        i++;
        rnd[i] = Random.Range(5, 10);
        i++;
        rnd[i] = Random.Range(10, 18);
        i++;
        rnd[i] = Random.Range(18, 24);
        i++;
        rnd[i] = Random.Range(24, 30);
        i++;
        rnd[i] = Random.Range(30, 38);
    }

    void Start()
    {
        gameManager = GetComponent<GameManager>();
        i = 0;
    }
          
[...]

Ich bekomme die Fehlermeldung "NullReferenceException: Object reference not set to an instance of an object"

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du eine Zahlenvariable hast, dann weist du ihr mit = einen Wert zu. Das gleiche gilt bei Objektvariablen:

var auto = new Auto();

Wenn du das nie tust und so eine Objektvariable keinen Wert kriegt, dann steht da "null" drin, also "nichts". Und mit "nichts" kann man nicht arbeiten:

auto.Brumm(); // NullReferenceException, wenn "auto" nie eine Referenz zugewiesen bekommen hat

Arrays sind auch Objekte. Du musst daher erst ein Array erstellen, damit du dieses auch befüllen kannst. Die Variable selbst ist kein Array.

rnd = new int[6];

Wie du siehst, muss man beim Erstellen direkt angeben, wie viele Elemente im Array Platz haben sollen. Wenn du das nicht willst, kannst du stattdessen eine Liste nehmen, die können dynamisch wachsen.

List<int> randomNumbers = new List<int>();
randomNumbers.Add(Random.Range(2, 5));
randomNumbers.Add(Random.Range(5, 10));
// ...

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Arrays können ihre Größe niemals verändern. Aber das, was du beschreibst, ist ja, ein ganz neues Array zu erstellen. Das kann dann in der Tat eine andere Größe haben. Das Gesamtkonzept ist damit exakt das einer ArrayList. Das ist einfach ein Objekt, das intern ein Array hat und wenn das zu klein wird, macht es ein neues, größeres und kopiert die Elemente aus dem alten rüber. List<T> ist eine ArrayList. Da brauchste also nicht das Rad neu zu erfinden :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay. Was ist denn die bessere Lösung. Ich denke mal für mein Beispiel oben ist ein Array besser. Wann macht es dann mehr Sinn eine Liste zu nehmen? Wenn ich beispielsweise schaue welche Objekte in der nähe meines Objektes sind (OverlappedSphere) speichere ich das auch in einem Array. Macht dann dort eine Liste mehr Sinn?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 37 Minuten schrieb Singular:

Wann macht es dann mehr Sinn eine Liste zu nehmen?

Wenn du über die Laufzeit hinweg immer wieder Elemente hinzufügst und/oder rausnimmst.

vor 38 Minuten schrieb Singular:

Wenn ich beispielsweise schaue welche Objekte in der nähe meines Objektes sind (OverlappedSphere) speichere ich das auch in einem Array.

Jetzt kommen wir in etwas... interessante Gebiete der Spieleprogrammierung. Da will man evtl. ein bisschen an Performance denken. Da die Erklärung vermutlich ein bisschen länger wäre, gibt's die nur auf Anfrage, aber du willst bei den Physics-Metheden ggf. immer die "NonAlloc"-Version benutzen. Da baust du dann ein großes Array wo hin und benutzt das immer wieder.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 weeks later...

Archiviert

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

×
×
  • Neu erstellen...