UnityのTimeLineでオーディオ再生するためにやったこと

UnityにはTimelineという機能があります。

アニメーションやオーディオ再生など一連の動きをシーケンスとしてまとめて、再生や停止ができるという便利な機能です。

Timlineでのオーディオ再生はAudioSourceを使うのが主流みたいですが、せっかくなので作ったAudioManagerスクリプトを使った再生ができるようにしてみます。

Unityでオーディオを管理する その2 〜スクリプト作成〜
Unityでオーディオ再生を管理するためのシステムを作成中です。今回は実際にスクリプトを作成していきます。SQLを連携させて、BGMやSEの再生を一手に引き受ける、シングルトンのクラスを作成していきます。

AudioManagerを実行するためには、Timeline上でスクリプトを実行する必要があるのですが、これがなかなかわかりにくかったので今回手順をまとめてみました。

バージョンによっても仕様がコロコロ変わっているみたいなので要注意。私の使っている環境は2017.2.0f3です

2017.2.0f3での手順

2017.2.0f3ではスクリプトごとにいちいちBehaviorとAssetという2つのファイルを作成しないといけないのでちょっと面倒です。まあ一度作ってしまえば便利ではあるので我慢して作ります。

どうやらAssetからBehaviorへGameobject経由で情報を渡して、所定の処理を行っているみたいなのですが、正直詳しい仕組みはよくわからないので詳しく知りたいのであれば参照サイトを見ることをおすすめします。

Unity2017.1b4のタイムラインでScriptを動かす - Qiita
雑メモです。噂のTimelineをUnity2017.1のベータ4で触ってみたんですが、なんかどんどん仕様が変わってるようで、ダウンロードしたサンプルコードが動かなかったり、ネット上に正しい情報も…

BhaviorとAssetの二つのファイルをつくる

ヒエラルキー上で「右クリック」→「Create」→「Playables」を選択して、「Playable Behavior C# Script」と「Playable Asset C# Script」の二つを作成します。

スクリプトを記述する

作成したファイルを開くと、下のようなスクリプトが記述されていますので、その中に注釈をつけている部分を追記します。

Asset側

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;

[System.Serializable]
public class (関数名) : PlayableAsset
{
//--------------以下の部分を追記する-----------------
public ExposedReference (適当なオブジェクト名:obj);
[SerializeField]
AudioLists AudioLists;//enum再生リスト取得用
//-------------------------------------------------

// Factory method that generates a playable based on this asset
public override Playable CreatePlayable(PlayableGraph graph, GameObject go)
 {
//--------------以下の部分を追記する-----------------

///とりあえず必要なおまじない
(behavior側の関数名) (適当な名前:audio_behavior) = new (behavior側の関数名)();
audio_behavior.(behavior側で宣言するオブジェクト) = obj.Resolve(graph.GetResolver());
///引数を渡すために追記した部分、enumリストから文字列を渡している
audio_behavior.behavior_audio_list = AudioLists.ToString();

///デフォルトで入っている以下の一文を変更
///return Playable.Create(graph);
///             ↓
return ScriptPlayable<behavior側の関数名>.Create(graph, audio_behavior);
//----------------------------------------------------

}
}

いかがでしょうか?私には何やってるのかさっぱりわかりません。私の環境ではとりあえずこれで動くようになりました。Behavior側の関数や変数を記述しなければならず、ごちゃごちゃしてかなりややこしいので注意してください。

以前enumの紹介をしたので、今回も利用できるように記述していますが、実装していない方はenumとコメントがついている部分を、直接文字列を指定するように変更してください。

Unityでオーディオを管理する その3 〜DBからリストを作成する〜
前回作成したAudioManagerを使いやすくするために、Enumを使って、データベースからオートでリストを作成するスクリプトを作成します。これでデータベースのデータを更新すれば、勝手にリストに追加されるようになります。

Behavior側

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;

// A behaviour that is attached to a playable
public class (関数名) : PlayableBehaviour

//--------------以下の部分を追記する-----------------
public GameObject (behavior側で宣言するオブジェクト);
public string behavior_audio_list;///enumリスト取得用
//--------------------------------------------------
{
// Called when the owning graph starts playing
///Timeline再生直後に実行
public override void OnGraphStart(Playable playable) {

}
// Called when the owning graph stops playing
///Timelineが停止した直後に実行
public override void OnGraphStop(Playable playable) {
}
// Called when the state of the playable is set to Play
///配置したアセットがスタートした直後 今回はここに記述する
public override void OnBehaviourPlay(Playable playable, FrameData info) {
//--------------以下の部分を追記する-----------------
AudioManager.Instance.PlaySound(behavior_audio_list);
//--------------------------------------------------
}
// Called when the state of the playable is set to Paused
///配置したアセットが停止した時
public override void OnBehaviourPause(Playable playable, FrameData info) {
}
// Called each frame while the state is set to Play
///Timeline再生中の毎フレーム
public override void PrepareFrame(Playable playable, FrameData info) {

}
}

Behavior側はそんなにめんどくさくはないです。enumを使ったリスト選択をしない場合、behavior_audio_listは使えませんので、適宜書き換えてご使用ください。

※public関数が多くなるのでNameSpaceを使っておくと変数名が衝突しないかもしれません。

スクリプトはこれで完成です。

Timelineでの使い方

使い方は簡単です。

作成したAsset側のファイルをTimeline上にドラッグアンドドロップしてあげるだけで使えるようになります。

こんなかんじでトラック上にオブジェクトが配置されます。今回はアセットスタート時のみにスクリプトを記述しましたが、例えばアセットの開始地点で再生・終了地点でストップというような記述をすれば、DAWのような感覚で視覚的にオーディオを配置できます。色々工夫して便利なアセットを作ってみてください。

PlayableDirectorやTimelineの詳しい使い方についてはここでは割愛します。

最後に

一度できてしまえば楽ではあるのですが、作るときは結構めんどうでした。なにせ今回の仕様では再生・停止など機能ごとに作らなければならない上に、変数がごちゃごちゃしてこんがらがるのでやたらに時間がかかってしまいました。

できるだけ分かりやすくなるように色分け等しましたがやっぱり分かりにくいので、他のサイトなどを参考にしつつ、ものにしてみてください。