はじめに
タイムライン勉強メモです。
場面によって同じメソッドをタイミングを変えて実行したかったので調査しました。
手順概要
1.タイムライン新規作成
2.Signalを新規作成
3.タイムライン上にSignalを配置
4.実行したい処理を作成
5.タイムラインの呼び出し設定
6.実行確認
1.タイムライン新規作成
プロジェクトウインドウ>+ボタン>タイムライン
タイムラインの名前はTimelineTest1にしました。
タイムラインを複数作成
同様にタイムラインを2つ新規作成します。
名前はTimelineTest2とTimelineTest3にしました。
2.Signalを新規作成
タイムライン上に配置するSignalを新規作成します。
このSignalがタイムラインに配置されたタイミングでメソッドを呼び出します。
プロジェクトウインドウ>+ボタン>Signal
Signalの名前はSignalTestにしました。
3.タイムライン上にSignalを配置
タイムラインウインドウをTimelineTest1をクリックして開きます。
マーカーボタンを押してマーカーウインドウを表示します。
先ほど作成したシグナルのSignalTestをドラッグアンドドロップし、
メソッドを呼び出したいタイミングに配置します。
タイムライン「TimelineTest2」「TimelineTest3」でも同様にシグナルを設定します。
4.実行したい処理を作成
処理するスクリプト内容を作成します。
今回はSignalScriptという名前でスクリプトを新規作成し、
下記の内容で作成しました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SignalScript : MonoBehaviour
{
public void SignalScriptTest()
{
Debug.Log("メソッドを実行しました。");
}
}
空のゲームオブジェクトを作成し、このスクリプトを割り当てておきます。
5.タイムラインの呼び出し設定
5-1.タイムラインを使い分けるスクリプトの作成
EventManagerという名前でスクリプトを作成しました。
タイムラインを再生するPlayableDirectorコンポーネントへ
指定したタイムラインを再生させる内容になります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
[RequireComponent(typeof(PlayableDirector))]
public class EventManager : MonoBehaviour
{
[SerializeField] private TimelineAsset[] timelines;
private PlayableDirector director;
void Start()
{
director = this.GetComponent<PlayableDirector>();
}
public void EventPlay(int id)
{
switch (id)
{
case 1:
director.Play(timelines[0]);
break;
case 2:
director.Play(timelines[1]);
break;
case 3:
director.Play(timelines[2]);
break;
}
}
}
[RequireComponent(typeof(PlayableDirector))]
を付けることで、このスクリプトをゲームオブジェクトに割り当てた際に
必要なPlayableDirectorというコンポーネントを自動的に同じオブジェクトへ追加します。
自分でPlayableDirectorコンポーネントを付けても良いのですが、
付け忘れ防止のため書いています。
5-2.インスペクター設定
空のオブジェクトを作成し、名前をEventManagerに変えて
先ほど作ったスクリプトを割り当てます。
5-3.タイムライン割り当て
EventManagerの配列にそれぞれのタイムラインを割り当てます。
5-4.SignalReceiverコンポーネント追加
シグナルの信号を受け取るSignalReceiverを追加します。
SignalReceiverはPlayableDirectorで再生されているタイムラインの
シグナルを受け取るものです。
5-5.SignalReceiver設定
今回はシグナルが配置されたタイミングで
SignalScriptのSignalScriptTest()メソッドをを実行したいので
このように設定します。
5-6.ボタンの配置
ボタンを押した時にタイムラインを切り替えて再生したいので
ボタンを3つ配置します。
5-7.ボタンの設定
ボタンにEventManagerオブジェクトのEventManagerスクリプト>EventPlayを割り当てます。
引数はボタンごとに1、2、3を割り当てます。
6.実行確認
タイムラインが動いているのを見るには
ゲームビューのボタンを押してから
EventManagerオブジェクトをクリックすると確認できます。
(最初からEventManagerオブジェクトをチェックしていると
一旦他のオブジェクトなどをクリックする必要があります。)
おわりに
Signal Trackというのをタイムラインに配置して実行したかったのですが、
タイムラインを再生してから、タイムラインのSignal TrackにSignalReceiverを
割り当てないと実現できなさそうでした。
実行中に割り当てる方法がわからなかったのでわかる方教えてください。
Unity本を出版しました!
突然ですが、Unity本を出版しました!
こちらを読むことで、スクリプトの基礎固めができます!
現在、kindle unlimitedで読み放題設定中です。今のうちにどうぞ!
もっと早く教えてほしかった!Unity C#入門
参考
www.ame-name.com
teratail.com