#開発環境
Unity2018.2.3f1
VisualStudio2017Community
C# ver7.2?
#お詫び
ここでの記事で行ったことは、あくまでもEditor上での挙動での確認だったため、起こりえたことであって、
何かしらの媒体にて吐き出した際に、Evenetでの呼び出しが行われることが、少なくとも、このVerでは、起こらないものでした。なので、以下の内容は、UnityEditor上ではイベントチェックがうごいてしまうように見えてしまう失敗談(書き方はそのように書いてませんが)なので、ご注意の上お読みください。
#この記事の対象者
UnityのTimeLine機能をつかって、無理やりでも何かしらのイベントを起こす仕組みを考えたい人
とりあえずTimeLineを触りたい人
#注意書き
この記事に書いている内容は、本来であるつくり方から逸脱している可能性はあります。
そのため、あくまで、そんな使い方もできなくはない。ホンマでっか!の精神で参考にしていただけると幸いです。
また、それを実現するのに、こういうやり方あるよっていうのがあれば教えて下さい。
よろしくお願いいたします。
#今回この記事を書くにあたって実装したもの
図でざっくり表すと以下のような感じ
最初のTimeLine1の流れているタイミングで、特定の期間のみ、条件を判定して、そのタイミングから、次のタイミングへと遷移を行うと
いった感じの構造です。
#内容
どうやってイベントを発生させるか?アニメーションイベント単体のものに、呼び出す関数を設定してあげて
そのタイミングまでに、変わったかどうかを管理している側で呼び出された際に、
そのタイミングで、TimeLine2を再生するか?TimeLine3を再生するか?を決める感じになります。
なので、具体的なクラスとしては以下のようになります
//以下の参照に切り替えるようのTimeLineを設定しておく。
[SerializeField]
private PlayableDirector timeline2;
[SerializeField]
private PlayableDirector timeline3;
なお、これは、勝手に再生を行わないように、PlayableDirector自身のenableはfalseの状態で、
Hielarchyに配置されているものとします。
そして、このクラスに対して、
//イベントチェックを行う
public void EventCheak()
{
if(状態をみたしているか?)
{
timeline2.enable = true;
timeline.time = 0;//再生位置を調整
timeline.Play();//再生
}
else
{
timeline3を上記のように行う。
}
}
この関数をAnimationから呼び出すようにしています。
これが呼び出されていた際に、イベントとして判断してあげることができます。
場合によっては、そのイベントによって、このManagerのクラスが、再生するタイムラインを再生する感じになります。
##AnimationからEvent呼び出しを行う
では、これをどのようにTimeLineに組み込むか?
手順として、私がやったのは以下の手順
1.適当なGameObject作成(Event確認が必要な関数を保有するGameOBject)
2.TimeLineにAnimationTrackを追加し、先ほどのObjectを入れ、CreateAnimation onGameObjectを選択
3.Record状態に行い適当に、何かRecordしたのち、ダブルクリックしてAnimationの編集画面を出す
4.Animationの編集画面にて、AddEventを行う。
で可能です。
#最後に
この方法は、短期的に行う分には、一つの方法ではあるのですが、長期的、プロダクト的には、不向きな作りにはなる方法かと思います。