Jump to content
Unity Insider Forum

Array mit Float Zusatzwert


Kojote

Recommended Posts

Du würfelst eine Zufallszahl zwischen 0 und der Summe der Wahrscheinlichkeiten, dann iterierst du über dein Array, bis die Summe aller bisher gesehenen Wahrscheinlichkeiten größer als deine Zufallszahl sind.

var sumOfChances = spawnablePrefabs.Sum(item => item.spawnChance);

Das hier kannst du direkt vor dem Folgenden machen, aber eleganter wäre es in Start() und dann in ein privates Feld gespeichert, vorausgesetzt, die Werte ändern sich zur Laufzeit nicht mehr.

public GameObject GetRandomPrefab()
{
  var roll = Random.Range(0f, sumOfChances);
  
  var currentChanceSum = 0f;
  
  foreach (var item in spawnablePrefabs)
  {
    currentChanceSum += item.spawnChance;
    if (currentChanceSum >= roll)
    {
      return item.prefab;
    }
  }
  
  return spawnablePrefabs[spawnablePrefabs.Length].prefab;
}

Die letzte Zeile ist als Sicherheits-Fallback für den Fall von floating point-Ungenauigkeiten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Auf jeden Fall erst mal vielen Dank! :)

Ich habs mal eingebaut, teste es gleich mal aus, aber so richtig verstehe ich die Methode nicht. 😕

Wir bilden im Start die Summe aller Chancen, OK. Danach bilden wir einen Zufallswert zwischen 0 und der Summe aller Chancen. Am Ende gibt return ein GameObject zurück, welches dann gespawnt werden soll. Aber was genau macht dann Forech?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das geht solange alle Elemente der Liste durch und addiert dabei die jeweilige Spawn-Chance, bis diese Summe größer dem Zufallswert ist. Es könnte helfen, wenn du dir das mit ganzen Zahlen vorstellst.

item: 0       | 1       | 2 | 3 | 4
roll: 0 1 2 3 | 4 5 6 7 | 8 | 9 | 10 11 12

Roll 0-3 bedeutet Item 0, 4-7 bedeutet Item 1, usw.

Du gehst von links nach rechts durch. Dein Roll ist, sagen wir, 8. currentChanceSum ist 0.

Erster Schleifendurchlauf: currentChanceSum (0) >= 8? Nein. Also rechnest du currentChanceSum += 4 (die Chance von Item 0).

Zweiter Schleifendurchlauf: currentChanceSum (4) >= 8? Nein. Also rechnest du currentChanceSum += 4 (die Chance von Item 1).

Dritter Schleifendurchlauf: currentChanceSum (8) >= 8? Ja. Also bist du bei Item 2 fertig und gibst es zurück.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...