LoginSignup
7
6

More than 5 years have passed since last update.

PlayableDirectorのイベントをObservable化する

Posted at

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になったときは呼ばれません.
これは中断扱いとなります.

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6