2017-10-01 2 views
0

Ich bin neu in UniRx, also experimentiere ich gerade. Ich versuche, einen Spawner zu machen, indem ich ein GameObject ein neues Objekt erstellen lasse, wenn das vorherige zerstört wurde.UniRx Fehlerbehebung Verzögerung/Gas mit meinem Objekt Spawner

Einige davon funktionieren, aber wenn ich das Objekt zerstöre, wird es nicht jedes Mal neu erstellt. Meine Gedanken sind, dass solange ich es innerhalb der angegebenen Abklingzeit zerstöre, es neu erstellt wird, aber ich würde es gerne in der Lage sein, es zu töten, wenn es mit einer Verzögerung spawnt, die der zufälligen Abklingzeit entspricht.

Ich versuche, zerstörte Objekte mit einem Array zu verfolgen, um es auf eine bestimmte Anzahl von Objekten zu beschränken.

Ich habe versucht, Delay anstelle von Throttle mit dem gleichen Ergebnis zu verwenden.

private ReactiveProperty<GameObject[]> spawnedObjects; 

public void spawnNewObject(int index) 
{ 
    if (spawnedObjects.Value[index] == null) 
    { 
     GameObject newSpawn = Instantiate(spawnObject, transform.position + offset, Quaternion.identity, transform); 
     spawnedObjects.Value[index] = newSpawn; 
    } 
} 

private void setupSpawner() 
{ 
    for (int i = 0; i < spawnedObjects.Value.Length; i++) 
    { 
     int j = i; 
     spawnedObjects 
      .ObserveEveryValueChanged(spawns => spawns.Value[j]) 
      .Throttle(System.TimeSpan.FromSeconds(Random.Range(timeFromTo.x, timeFromTo.y))) 
      .Subscribe(_ => spawnNewObject(j)); 
    } 
} 

Antwort

0

Es scheint ObserveEveryValueChanged nicht den Wert immer null, so hatte nicht beobachtet ich eine Abhilfe zu machen, die ich jetzt zu beobachten Active und statt zu zerstören ich es auf false gesetzt, dann während des Laich außer Kraft setze ich das Element mit das neue und zerstöre das alte, das scheint mit dem Beobachter gut zu funktionieren :)

protected ReactiveProperty<GameObject[]> spawnedObjects; 

public virtual void spawnNewObject(int index) 
{ 
    if (spawnedObjects.Value[index] != null) 
    { 
     GameObject old = spawnedObjects.Value[index]; 
     GameObject newSpawn = Instantiate(spawnObject, transform.position + offset, Quaternion.identity, transform); 
     spawnedObjects.Value[index] = newSpawn; 
     Destroy(old); 
    } 
} 

public virtual void setupSpawner() 
{ 
    for (int i = 0; i < spawnedObjects.Value.Length; i++) 
    { 
     int j = i; 
     spawnedObjects 
      .ObserveEveryValueChanged(spawns => spawns.Value[j].activeSelf) 
      .Where(active => active == false) 
      .Throttle(System.TimeSpan.FromSeconds(Random.Range(timeFromTo.x, timeFromTo.y))) 
      .Subscribe(_ => 
      { 
       spawnNewObject(j); 
      }); 
    } 
}