しがないエンジニアのブログ

技術的な内容をメモ代わりにつらつら

[Unite2018] スクリプトによるTimelineがっつり拡張入門

公式サイト

http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session56

講演者

森 俊之 (ユニティ・テクノロジーズ・ジャパン合同会社)

SlideShare

https://www.slideshare.net/UnityTechnologiesJapan/unite-2018-tokyotimeline/UnityTechnologiesJapan/unite-2018-tokyotimeline

※本公演は多数のアニメーションGIF, ムービーを含んでいるため Slide Share での再現はできませんでした
下記URLより講演スライド(Power Point)とサンプルプロジェク トをダウンロードしご確認ください
http://prt.nu/0/timeline

概要

  • Timelineのおさらい
  • スクリプトでの拡張が必要になるとき
  • Timeline拡張の方法
  • さらなるスクリプト
    • After Effectからコンバート

f:id:turgure:20180624092129p:plain


内容

  • Timelineのおさらい
    • Animation track
      • bindしたGameObjectのパラメータを時間経過に従ってアニメーション
      • transform, colorなど様々なフィールドを書き換え可能
      • 自作シェーダのパラメータも対応可能
    • データ構造と用語の説明
      • playable拡張子
      • Track
        • コントロールするオブジェクトをバインド、クリップを保存
          f:id:turgure:20180626090346p:plain
      • Binding
      • Clip
        • キーフレームでコントロールするデータ値
        • 時間ごとのColor, position, rotationなどが入っている
          f:id:turgure:20180626090417p:plain


  • スクリプト拡張が必要になるとき
    • どんなとき?
      • インタラクティブなものを加えたいとき
        • ex) THE PHANTOM KNOWLEDGE
          • シーン遷移など
      • Gameobjectにないパラメータをコントロールするとき
      • Animation Trackでは操作が複雑になってしまうとき
        • ex) Fader
          • Animation Trackを使う場合
            • 5ステップくらい
            • 時間を変えたい場合作り直しが必要
          • カスタムトラックで作る
            • 3ステップ
            • 作り直しの必要がない
      • そもそもUnityに機能がないとき
        • ex) 連番画像はストリーミング処理したい
          • 画像を2Dスプライトに変換しない
            • スプライト画像は実行ファイルの起動時に読み込まれるため、起動時間が馬鹿にならないことがある


  • Timelineの拡張方法
    • Animation TrackとMonobehaviorをかませて管理
      • Monobehaviorに擬似的なフィールドを作って適用
      • Post Effectやプロジェクト全体設定を変えたいときに有効
      • 典型的な例
    • Control Track
      • ITimeControlインターフェースをMonobehaviorに実装
      • 複雑なパラメータが必要ないときにおすすめ
      • ex) スタートやエンドでとにかくコールバックがあればいいとき
        • デモ中の制御が必要ない
        • イベント再開までTimelineの更新停止も可能
      • ex) 時間が決まればsetTime()内に関数的にかける処理
        • カメラの軌道をプログラムで書く
        • UVスクロールやフェードアニメーション
        • Clipの長さが取れないとき
      • カスタムPlayable Track
        • 専用のトラックを構築
        • トラック全域に渡って対応可能なMixer.ProcessFrame()
      • 5つのクラスで構成
        • Track    どんなオブジェクトがバインドできるか
        • Clip     どんなパラメータを扱うか
        • Behavior   クリップ単位の補間
        • Mixer    トラック単位の補間
        • Drawer   グラフィックを美しく
          • Asset Storeで”Default Payables”で検索
            • 最初は自力で書いたほうがいい
        • 先にBehaviorとMixerについて
          • Behavior   クリップごとに作成されてフレームごとの処理
          • Mixer    トラックごとに作成されてフレームごとの処理
          • 両方ともProcessFrame()で処理
          • BehaviorのProcessFrame()を利用することはほぼない!
            • ex) 処理落ちした場合
              • 回復したフレームが処理終了後の場合コールされない
                • Mixer.ProcessFrame()のみ使う!
        • カスタムトラック
          • Track
            • 何がバインドできるのか定義
            • どんなクリップが貼れるのか定義
            • トラックの色
            • Mixerを管理
            • タイムラインで変更されるパラメータ定義
          • Clip
            • キーフレームに入れたいデータを定義
            • ClipCapsを定義
            • ClipのBehavior生成
          • Behavior
            • Clipの情報を解釈して処理
              • ProcessFrame()はあまり使わないほうが良い
          • Mixer
            • トラック全体に渡ってProcessFrame()が呼ばれる
            • Clipのミキシングが可能
      • Recordボタンやカーブ編集は?
        • いくつかのルール
        • 補間処理はUnityに任せる
          • playable.GetInputWeight(int)
          • durationを縮めた場合は最後まで再生されない
          • DefaultPlayableで作ったものはこのタイプ
            • ルール1. Clip内のパラメータ
              • Clip内にBehaviorを持つ
              • クリップ内のBehaviorは必ずpublic!
            • ルール2. カスタムDrawer推奨
              • Inspectorをすっきりさせる


  • Playable Track
    • これのProcessFrame()はBehaviorのもの
    • 要注意


  • さらなるスクリプト
    • ScriptからのTimelineを構築
      • ex) After Effectからコンバート
        • スクリプトのみでTimeline構築
        • UIのEventSystemCanvasスクリプトから構築
        • The PhantomKnowledgeで使ったMovie Proxy Pluginwを使用
        • 連番画像アニメーション限定
        • 試し方
          • AEで AEProject/testProject.aep を読み込む
          • AEで AEPlugins/AEJson.jsx スクリプト実行
            (環境設定でプラグインの書き込み許可を忘れずに)
          • 任意の場所に json ファイルを保存
          • Unity 側でメニューからMovieProxy/Sample/Import AE Timelineを選択
          • 先にセーブした jsonファイルを指定して読み込み