Played, Paused, StoppedはそれぞれのタイミングをObservable化したもの.
PlayAsStream
はタイムラインの一覧の流れをStreamとして扱えるようにしたものです.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UniRx;
public static class PlayableDirectorExt {
public static IObservable<PlayableDirector> PlayedAsObservable (this PlayableDirector src) {
return Observable.FromEvent<PlayableDirector>(h => src.played += h, h => src.played -= h);
}
public static IObservable<PlayableDirector> PausedAsObservable (this PlayableDirector src) {
return Observable.FromEvent<PlayableDirector>(h => src.paused += h, h => src.paused -= h);
}
public static IObservable<PlayableDirector> StoppedAsObservable (this PlayableDirector src) {
return Observable.FromEvent<PlayableDirector>(h => src.stopped += h, h => src.stopped -= h);
}
/// <summary>
/// WrapModeがNoneのときのみ使える.
/// 再生から終了までをStreamとみなす.
/// Disposeで止まる
/// 再生中ならリスタートする.
/// </summary>
public static IObservable<PlayableDirector> PlayAsStream (this PlayableDirector src) {
return Observable.Create<PlayableDirector>(observer => {
if(src.state == PlayState.Playing)
src.Stop();
src.Play ();
var disposable = src.StoppedAsObservable()
.Subscribe(x=>{
observer.OnNext(x);
observer.OnCompleted();
});
return Disposable.Create(() => {
disposable.Dispose();
if(src.state == PlayState.Playing)
src.Stop();
});
});
}
}
Stoppedの呼ばれるタイミング
WrapModeがNoneであれば,
- 再生終了時
- GameObjectごとDestroyしたとき
に呼ばれることが確認できました.
しかし,コンポーネントのenabledがfalseになったときは呼ばれません.
これは中断扱いとなります.