UnityTimelineは、何を可能にするのか?

土井英範氏(以下、土井):よろしくお願いします。

(会場拍手)

株式会社Aimingでリードソフトウェアエンジニアをやっております。土井と申します。お見知りおきください。よろしくお願いします。

もともとconnpass上で告知していた登壇者は平野という者でしたが、風邪をひいてしまいまして(笑)。僕がピンチヒッターで出ることになりました。平野の登壇を楽しみにしていた方は本当ごめんなさい。代わりにしゃべらせてください。よろしくお願いします。

タイトルなんですが、『UnityTimelineをつかって演出の幅を広げよう』です。Unityを使ってらっしゃる方、どのくらいいらっしゃいますか?

(会場挙手)

あ、ほぼ。大丈夫ですね。

演出といえば、まずカットシーンが最近ではよく要件に上がると思います。カットシーンという、ゲーム中で時間が決まったアニメーションを再生したいと。

また、同じカットシーンでも、ゲームの進行状況に合わせて違うキャラクターを表示したり。こんな要件があるかなと思います。

Unityの2017.1からTimeline機能というものが標準で搭載されるようになりました。カットシーンは一般的に、まずデザイナーさんがモデルデータと、Mayaなどの上でアニメーションを付けたものを時間を決めて作って、全部の時間軸上でムービーが完成する、みたいなものをUnityに取り込んで、それをアニメーターで再生するという流れだったかと思います。

ただ、修正や調整、キャラクターを差し替えるといった要件が出たときは大変です。エンジニアが自分たちで要件に合わせて実装を追加していかなければいけません。

ですが、UnityTimelineを使うと、プログラムは書かなければいけませんが、ちょっと楽になるよ、という話を紹介させてください。

趣味のタイトルにTimelineを導入してみた

その話の前に、仕事ではありませんが個人で作っているタイトルがあります。ずっと「半年後出る」と言い続けて1年半くらい経っちゃってるんですけど。こういうものがあります。とりあえず再生しますね。

(動画)

今、鳥が飛び立つシーンなんですが、これはTimelineで動いています。カメラが切り替わったりとか、ここまでTimelineです。ここから動的制御になり、キャラクターが動かせるようになります。そのうち、いつか出ると思うので、ぜひ出たらプレイしてみてください(笑)。

(会場笑)

よく見ますよね。ムービーシーンがゲーム中に再生される。でもそのゲームのエンジンを使って描画されるようなムービーをどう表現するか、というところでTimelineを使っています。

実際このデータを見てみると、こんな感じです。

昔フラッシュってありましたよね。フラッシュだと時間軸に並べてなにかを表示したり消したり、アニメーションさせていました。そんな機能がUnityに標準で搭載されるようになりました。

Timelineを使ってできるようになること

UnityのTimelineを使ってどんなことができるのかと言うと、先ほどお見せしたように、Unityの実行中にリアルタイムにムービーを再生できます。

あとは、先ほどラインが何トラックかあったと思いますが、鳥はこういう動き、カメラはこういう動き、みたいにキャラクターの動きを視覚的に表現ができるようになります。

UnityEditorが再生しなくてもエディター上で編集しながらプレビューできるので、調整がすごく楽になりますね。

最後に、アニメーションを使いまわせます。Mayaで時間が固定されたデータを吐き出すと、それが1本のアニメーションデータになりますが、例えば「歩く」など、カットシーン中に2回「歩く」が出てきたら、そこは同じUnity上の歩くモーションをセットして使い回すことができます。

Unity上で部品をつなぎ合わせてムービーを作りましょう、みたいな機能だと思っていただけるといいかなぁと思いますね。

AnimatorとTimelineを比較

今まではAnimatorという機能がありましたが、比較してみます。

Animatorはアニメーションという状態を持っていて、歩くとか走るとか、それを切り替えるという機能になります。これはスクリプトから制御したりしますよね。Timelineは、アニメーションを時間軸に応じて切り替える機能です。つまり、考え方がぜんぜん違うものだと理解しやすいです。

あとは、Timelineのすごいところなんですが、スクリプトで拡張できるんです。さきほどのトラックの部分って自分で何個かスクリプトを書くと、自分のプロジェクトに合った制御方法を取ることができます。

例えば画面の暗転ってよくやりますよね。あれをTimeline上にトラック1個つ作って、暗転、フェードイン、フェードアウトみたいなものを作ると、どこでも使いまわせるような処理になったり。

シーン上にパスを描いて、空間上にパスを引いて、そこに沿って動くようなオブジェクトを作ったときに、Timeline上でパスの0点から終点まである時間をかけて動く、といったことも視覚的に表現できます。

ほかにも、アニメーションの再生やオーディオの再生にも対応しています。最近はCinemachineというカメラの制御用のアセットが出ていまして、それを導入すると、先ほどのカメラを切り替えといった制御も時間軸でコントロールできます。

実際問題、スクリプトで書けてしまうので、スクリプトで書いてしまえばどんなことでも時間で制御できます。

細かい解説はググったらいろいろ出てくるので(笑)。キーワードやできることだけ覚えて帰っていただけたら今後につながるかなと思い、ここまで紹介させていただきました。

Timelineが苦手なこと

先ほどの作る段階でいろいろハマったところがあるので、紹介させていただきます。まず「Timelineでなんでもできるじゃん」って最初は思ってたんですが、やってみるとできないこと、向いていないことがけっこうありました。

例えば条件分岐して違うアニメーションを差し替えましょう、みたいなことはしんどいです。無理やりやったらできますが、これはやめたほうがいいですね。Animatorを素直に使って、それをスクリプト側で制御するほうが楽です。

あと再生時間が固定でないもの。例えばAポイント、Bポイントのどちらかに主人公がいて、終点が決まってるとしたら、距離が違います。歩く速度が一緒であればそのアニメーションの再生時間って変わりますよね。近いほうがより早く終わります。こういう処理は向いていません。素直にスクリプトで制御したほうがいいと思います(笑)。

実行時に依存を解決する

ここからエンジニア向きの話になりますが、実行したときにいろいろな依存するオブジェクトを解決していかなければなりません。

例えばキャラクターを差し替えるという話だと、どのキャラクターを? という話が出てくると思いますが、TimelineのデータはUnityで言うとAssetBase、プロジェクトのフォルダに管理されるものなので、シーン上に配置されたものを使うのがちょっと苦手です。

解決方法はいろいろありますが、PlayableDirectorってトラックの左部分にいろいろ挿せるんです。ここは直接シーン上にオブジェクトを挿すことができます。Playableと言われているようなクラスを継承しているものは全部ここに挿せます。

トラックに配置される個々のクリップデータにもいろいろとオブジェクトを紐付けられるんですが、ここはちょっと大変です。自分でスクリプトを書いて、ExposedReference()というものを使ってプロパティを定義すると、実行時にシーン上にあるオブジェクトを拾ってきます。

MonoBehaviorでいうところのSerializeFieldのようなものがTimelineのクリップ用に用意されています。これなかなか最初はわからなくて、検索しても昔は出てきませんでした。ですので、キーワードを覚えてもらえるといいかなと思います。

Prefabにカットシーンを保存するには

あとは、Prefabにしたいという要件があります。シーンを再生するとき、Timelineの情報を保存したPrefabをシーンにInstantiateして再生すると、実行時にTimelineのPrefab情報はシーンにあるものって、そもそもありません。

紐付けが切れている状態でPrefabに保存されます。これは実行後にシーン上のオブジェクトを紐付けるスクリプトを自分で書かなければいけません。

Timelineのディレクターという再生するためのコンポーネントに、Bindingsというところがあります。Bindingsに、先ほどの紐付けが切れたものが下のほうにあるので、そこを実行時にこういうSetGenerictBindingというUnityのAPIを使うことで解決するので、これは自前でどうにかしなければいけません。

ただ、これを1度書いてしまうと、あとはPrefab化していろんなムービーを差し替えたりとかしやすくなります。

実は、これにすごく詰まったんですよ。1ヶ月か2ヶ月くらいよくわかりませんでした。僕は毎日家に帰ってジョナサンに行って、ジョナサンで2時間くらいプログラミングをしています。どんだけ好きなんだと(笑)。なのでこれは仕事と関係ありません。

Timelineという選択肢を活かすために

あと、Timeline Readyなアセットが最近増えてきています。ちょっと宣伝させてもらいたいんですけど(笑)。僕が作ったアセットがあるので、興味のある方はご購入ください。

(会場笑)

これは何かと言うと、先ほどのデモでは、鳥を動かしながら強制スクロールみたいなシーンがありましたが、あそこで動くパスを空間上に引いて、そのパス上を時間軸に沿って動くようなパスを作って、それをTimelineで位置を制御できるようなアセットを作っています。

後半はエンジニア向きの話をしましたが、現場でいろいろカットシーン作るのとか、ワークフローに悩むと思います。Unityの2017以降ではTimelineという選択肢があるという前提で、どういった機能が必要か。

そもそも標準でできるのか、標準以外の機能をエンジニアが作らなければいけないのか、みたいな相談をしてやっていくと、カットインのワークフローがすごくスムーズになったり工数が減ったりするのではないかと思います。

以上、Timelineの紹介でした。ありがとうございました。

(会場拍手)