UniRx使用我的对象生成器

时间:2017-10-01 11:18:27

标签: c# unity3d unity5 reactive-programming

我是UniRx的新手,所以现在我只是在试验。我试图通过让GameObject创建一个新对象来创建一个spawner,如果前一个被破坏了。

其中一些有效,但是当我销毁对象时,它不会每次都重新创建。 我的想法是,只要我在给定的冷却时间内将其摧毁,它就会重新创建,但是我希望能够在它产生的同时产生延迟与随机冷却时间相匹配的时间。

我试图用数组跟踪被破坏的对象,以将其限制为一定数量的对象。

我尝试使用Delay而不是Throttle得到相同的结果。

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));
    }
}

1 个答案:

答案 0 :(得分:0)

似乎ObserveEveryValueChanged没有观察到值变为null,所以我不得不做一个解决方法,我现在正在观察activeSelf而不是销毁我将它设置为false,然后在spawn中我用新的覆盖元素和摧毁旧的,这似乎与观察者一起工作:)

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);
            });
    }
}