個人アプリ開発で月収5万円目指す

アプリ個人開発 まるブログ

アプリ開発覚え書き

【Unity】複数のタイムラインを使い分けて好きなタイミングでスクリプトを実行する

はじめに

タイムライン勉強メモです。
場面によって同じメソッドをタイミングを変えて実行したかったので調査しました。

手順概要

1.タイムライン新規作成
2.Signalを新規作成
3.タイムライン上にSignalを配置
4.実行したい処理を作成
5.タイムラインの呼び出し設定
6.実行確認

1.タイムライン新規作成

プロジェクトウインドウ>+ボタン>タイムライン


タイムラインの名前はTimelineTest1にしました。
タイムライン2

タイムラインを複数作成

同様にタイムラインを2つ新規作成します。
名前はTimelineTest2とTimelineTest3にしました。
f:id:marumaro7:20210302062116p:plain

2.Signalを新規作成

タイムライン上に配置するSignalを新規作成します。
このSignalがタイムラインに配置されたタイミングでメソッドを呼び出します。

プロジェクトウインドウ>+ボタン>Signal
タイムライン3

Signalの名前はSignalTestにしました。

3.タイムライン上にSignalを配置

タイムラインウインドウをTimelineTest1をクリックして開きます。

f:id:marumaro7:20210302063752p:plain

マーカーボタンを押してマーカーウインドウを表示します。 f:id:marumaro7:20210302063941p:plain

先ほど作成したシグナルのSignalTestをドラッグアンドドロップし、
メソッドを呼び出したいタイミングに配置します。 f:id:marumaro7:20210302064118p:plain

タイムライン「TimelineTest2」「TimelineTest3」でも同様にシグナルを設定します。

4.実行したい処理を作成

処理するスクリプト内容を作成します。 今回はSignalScriptという名前でスクリプトを新規作成し、 下記の内容で作成しました。

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

public class SignalScript : MonoBehaviour
{
    public void SignalScriptTest()
    {
        Debug.Log("メソッドを実行しました。");
    }
}

空のゲームオブジェクトを作成し、このスクリプトを割り当てておきます。 f:id:marumaro7:20210302065527p:plain

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;//PlayableDirector型の変数directorを宣言

    void Start()
    {
        //同じオブジェクトに付いているPlayableDirectorコンポーネントを取得
        director = this.GetComponent<PlayableDirector>();        
    }

    //イベント再生メソッド ボタンに割り当てる
    public void EventPlay(int id)
    {

        //ボタンの引数によってタイムラインを指定して再生
        switch (id)
        {
            case 1:
                // 再生したいタイムラインをPlayableDirectorに再生させる
                director.Play(timelines[0]);                
                break;
            case 2:
                // 再生したいタイムラインをPlayableDirectorに再生させる
                director.Play(timelines[1]);                
                break;
            case 3:
                // 再生したいタイムラインをPlayableDirectorに再生させる
                director.Play(timelines[2]);                
                break;
        }
    }
}
[RequireComponent(typeof(PlayableDirector))]

を付けることで、このスクリプトをゲームオブジェクトに割り当てた際に
必要なPlayableDirectorというコンポーネントを自動的に同じオブジェクトへ追加します。
自分でPlayableDirectorコンポーネントを付けても良いのですが、
付け忘れ防止のため書いています。

5-2.インスペクター設定

空のオブジェクトを作成し、名前をEventManagerに変えて 先ほど作ったスクリプトを割り当てます。

f:id:marumaro7:20210302070341p:plain

5-3.タイムライン割り当て

EventManagerの配列にそれぞれのタイムラインを割り当てます。 f:id:marumaro7:20210302053659p:plain

5-4.SignalReceiverコンポーネント追加

シグナルの信号を受け取るSignalReceiverを追加します。
SignalReceiverはPlayableDirectorで再生されているタイムラインの
シグナルを受け取るものです。

f:id:marumaro7:20210302070859p:plain

5-5.SignalReceiver設定

今回はシグナルが配置されたタイミングで
SignalScriptのSignalScriptTest()メソッドをを実行したいので
このように設定します。 f:id:marumaro7:20210302071146p:plain

5-6.ボタンの配置

ボタンを押した時にタイムラインを切り替えて再生したいので
ボタンを3つ配置します。

f:id:marumaro7:20210302054048p:plain

5-7.ボタンの設定

ボタンにEventManagerオブジェクトのEventManagerスクリプト>EventPlayを割り当てます。 引数はボタンごとに1、2、3を割り当てます。

f:id:marumaro7:20210302071519p:plain

6.実行確認

タイムラインが動いているのを見るには
ゲームビューのボタンを押してから
EventManagerオブジェクトをクリックすると確認できます。
(最初からEventManagerオブジェクトをチェックしていると
一旦他のオブジェクトなどをクリックする必要があります。)

おわりに

Signal Trackというのをタイムラインに配置して実行したかったのですが、
タイムラインを再生してから、タイムラインのSignal TrackにSignalReceiverを
割り当てないと実現できなさそうでした。

実行中に割り当てる方法がわからなかったのでわかる方教えてください。

参考

www.ame-name.com teratail.com