見出し画像

はじめてのUnityのTimeline~スクリプトトラックの追加~

この記事ははじめてのUnityのTimelineの続きです。

画像1

前回の記事で、UnityのTimeline導入とユニティちゃんをTimelineで走らせることができました。

今回はスクリプトによって更に制御を入れていきます。

1.Timelineのトラックの種類

Timelieには下記の5つのトラックを配置することができます。

・Activation Track (対象オブジェクトの アクティブ化/非アクティブ化)
・Animation Track (対象オブジェクトの モーション制御/移動/回転など)
・Audio Track (オーディオ制御)
・Control Track (オブジェクトの生成)
Playable Track (スクリプト処理)←今回はコレ!

そうです。Timelieにはスクリプトを配置することができます。

Playable Trackに追加できるスクリプトにはPlayableAssetクラス、もしくはPlayableBehaviourクラスを継承したクラスを使うといいです。

PlayableAssetクラスは、アセット部分を補うクラスで実際にトラックに追加されるものです。(正しくは、PlayableAssetのサブクラスをトラックにドラッグ&ドロップすることでアセットが生成されます)また、PlayableBehaviourに参照オブジェクトを渡す役割を担っています。

PlayableBehaviourクラスはPlayableAssetクラス内で生成されます。このクラスには以下のような関数が用意されています。この関数内に任意の処理を書くことができるわけです。便利~~~~!

・OnGraphStart(タイムライン開始時実行)
・OnGraphStop(タイムライン停止時実行)
・OnBehaviourPlay(PlayableTrack再生時実行)
・OnBehaviourPause(PlayableTrack停止時実行)
・PrepareFrame(PlayableTrack再生時毎フレーム実行)

説明が長々となってしまいましたが、実際に作ってみましょう。

2.PlayableAssetクラスとPlayableBehaviourクラスの作成

2つのクラスを作成していきます。

まずはPlayableAssetクラスを作成します。[Playables] → [Playable Asset C# Script]より、「UnityChanPlayableAsset.cs」を作成しましょう。

デフォルトで用意されているCreatePlayableメソッドの中身を書き換えます。この「PlayableBehaviourを作る→オブジェクト設定→それをもとにScriptPlayableをつくってリターン」の流れが一般的のようです。

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

[System.Serializable]
public class UnityChanPlayableAsset : PlayableAsset
{
   [SerializeField] ExposedReference<GameObject> charaObj;

   public override Playable CreatePlayable(PlayableGraph graph, GameObject go)
   {
       // 今回作成するPlayableBehaviourクラス
       UnityChanPlayableBehaviour behaviour = new UnityChanPlayableBehaviour();

       // charaObjの設定
       behaviour.charaObj = charaObj.Resolve( graph.GetResolver() );
       return ScriptPlayable<UnityChanPlayableBehaviour>.Create( graph, behaviour );
   }
}

次にPlayableBehaviourクラスを作成します。[Playables] → [Playable Behaviour C# Script]より、「UnityChanPlayableBehaviour.cs」を作成しましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
public class UnityChanPlayableBehaviour : PlayableBehaviour
{
   public GameObject charaObj;
   Vector3 startPos = new Vector3( 0, 0, -5 );
   Vector3 endPos = new Vector3( 0, 0, 0 );
   // タイムライン開始時に呼ばれる
   public override void OnGraphStart( Playable playable )
   {
   }
   // タイムライン停止時に呼ばれる
   public override void OnGraphStop( Playable playable )
   {
   }
   // PlayableTrack再生時に呼ばれる
   public override void OnBehaviourPlay( Playable playable, FrameData info )
   {
   }
   // PlayableTrack停止時に呼ばれる
   public override void OnBehaviourPause( Playable playable, FrameData info )
   {
   }
   // PlayableTrack再生時フレーム毎に呼ばれる
   public override void PrepareFrame( Playable playable, FrameData info )
   {
       if( charaObj == null ) return;
       var currentTime = (float)playable.GetTime() / (float)playable.GetDuration();
       var currentPos = Vector3.Lerp( startPos, endPos, currentTime );
       charaObj.transform.localPosition = currentPos;
   }
}

3.Playable Trackの追加

先ほど作成したクラスを実際にトラックに追加します。

その前に、Hierarchyを以下のように編集する必要があります。これはSD_unitychan_humanoidに元々設定されているアニメーションとスクリプトによる制御(localPositionの移動)が衝突するのを防ぐためです。

画像2

準備が出来たら、Timelineウインドウを右クリックし、Playable Trackを追加します。さらにトラックを右クリックし[Add Unity Chan Plahyable Asset]を選択し、Runningアニメーションと同じ長さに調整します。

画像3

トラック上のUnityChanPlahyableAssetを選択し、Inspector上のCharaObjにHierarchyの[UnitychanRoot]を設定します。

画像4

再生すると、UnityChanPlayableBehaviourで設定した通り、ユニティちゃんのlocalPositionがフレームごとに更新され、前進してくれます!

お疲れ様でした!

画像5


この記事が気に入ったらサポートをしてみませんか?