Skip to content

Instantly share code, notes, and snippets.

@hacha
Last active August 29, 2015 14:16
Show Gist options
  • Save hacha/bc6791e7bfa7aaf20a11 to your computer and use it in GitHub Desktop.
Save hacha/bc6791e7bfa7aaf20a11 to your computer and use it in GitHub Desktop.
生成されて10秒後に消滅するボール、みたいなものをUniRxで記述したもの
using UnityEngine;
using System;
using UniRx;
public class Ball : MonoBehaviour
{
void Awake ()
{
// var stream = Observable
// .EveryUpdate ()
// .Delay(TimeSpan.FromSeconds(10))
// .Take (1)
// ;
// var subscription = stream.Subscribe( _ => Destroy(gameObject) );
// stream.Subscribe(_ => subscription.Dispose() );
// 削除しちゃうなら別に明示的にDispose()しなくてよかったみたい。
// なので下記になった。シンプル
Observable.Timer(TimeSpan.FromSeconds(10)).Subscribe( _ => Destroy(gameObject) );
}
}
@neuecc
Copy link

neuecc commented Mar 13, 2015

なるほー。

_ => Destroy(gameObject) の部分は一回しか呼ばれない&この辞典でgameObjectはDestoryされている。
ということになると思います。
別の何かが、そのBallを破壊してるのではかなー、と思うのですがどうでしょう?
もしそうなら単純な対策は

_ =>
{
    if(gameObject != null) Destroy(gameObject)
}

ですが、 Timerのライフサイクルを考えると、例えばシーン変更とか(Ballは破壊される!)の時とかも、このTimerは残り続けちゃうんですよね。
というわけで、どっかで集中的に CompositeDisposableで管理していて、Subscribe().AddTo(composite); して、
comositeをまとめてDispose(かClear)っていうのも手法としてよくあります。

@hacha
Copy link
Author

hacha commented Mar 20, 2015

なるほど、Timerそのものが残ってたってことなんですね!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment