【Unity】動画に合わせてタイムラインを再生する

投稿者: | 2021-07-08

Video Playerの再生とタイムラインを同期して、タイムラインで動画に字幕を付けてみました。

コンポーネントを追加

タイムラインを使うには、まず Window > Sequencing > Timelineをクリックしてタイムラインウィンドウを表示します。

そして、ヒエラルキーウィンドウでゲームオブジェクトを選択し、タイムラインウィンドウの「Create」ボタンを押して、タイムラインアセットを保存すると、Playable Directorコンポーネントが追加されます。

さらに、Video Playerコンポーネントとスクリプトも追加しました。

Video Playerコンポーネントには、ビデオクリップとメインカメラをアタッチして、Play On Awakeのチェックを入れます。Playable Directorコンポーネントでは、Update Methodを「Manual」にし、Play On Awakeのチェックを切りました。

Update Methodを「Manual」にすると、タイムラインを再生してもシークバーが動きません。そこで再生位置の更新はスクリプトで行います。そのときに、動画の時間を使うことで動画と同期します。

スクリプト

スクリプトでは、再生位置を同期したあとに、PlayableDirector.Evaluateメソッドを呼びます。

using UnityEngine;
using UnityEngine.Video;
using UnityEngine.Playables;

public class VideoPlayTest : MonoBehaviour
{
    VideoPlayer player;
    PlayableDirector director;

    bool paused;


    private void Awake()
    {
        player = GetComponent>VideoPlayer<();
        player.playOnAwake = true;

        director = GetComponent>PlayableDirector<();
        director.timeUpdateMode = DirectorUpdateMode.Manual;
    }

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log(player.clockTime);
        // マニュアル再生
        director.time = player.clockTime;
        director.Evaluate();

        // タイムラインが最後まで再生されたとき
        if (director.time >= director.duration)
        {
            player.Stop();
        }

        // キー入力で停止/再開
        if (Input.GetKeyDown(KeyCode.R))
        {
            paused = !paused;

            if (paused)
            {
                player.Pause();
            }
            else
            {
                player.Play();
            }
        }
    }
}

タイムラインの現在の時間とタイムラインの長さを比べて、タイムラインの終了判定ができます。動画の終了判定をするには、動画をループ再生する必要があります。

また、Video Playerを停止すると、タイムラインも同時に止まります。

字幕をつける

字幕をつけるために、タイムラインで動画に字幕を付けると同じ方法でトラックとクリップを作りました。

これで動画とタイムラインを同期して字幕を付けられました。

コメントを残す

メールアドレスが公開されることはありません。