【Unity】TimelineをScriptから扱うときのTips

スポンサーリンク
スポンサーリンク

はじめに

TimelineをScript制御する上で必要となるメソッドを紹介します。

なお、コード中に出てくるGetPlayableDirector()は、PlayableDirectorを取得するメソッドですので各自実装するか置き換えてください。

トラック名で検索したトラックにオブジェクトをバインドさせる

C#
/// <summary>
/// オブジェクトをタイムラインのトラックにバインドさせる
/// </summary>
///
/// <paramname="trackName"> トラック名 </param>
/// <paramname="sourceComponent"> 紐づけたいオブジェクト </param>
publicvoidBindTrack(string trackName,UnityEngine.Object sourceObject)
{
   foreach(PlayableBinding bindinGetPlayableDirector().playableAsset.outputs )
    {
       if( bind.streamName== trackName )
        {
           GetPlayableDirector().SetGenericBinding( bind.sourceObject, sourceObject );
           break;
        }
    }
}

特定の型をバインドタイプとしてもつトラックにオブジェクトをバインドさせる

C#
/// <summary>
/// T型のバインドタイプを持ったトラックにT型のオブジェクトの参照を渡す
/// </summary>
///
/// <paramname="bindObject"> バインドするオブジェクト </param>
publicvoidBindObject<T>(T bindObject )whereT :UnityEngine.Object
{
   var outputTracks= (GetPlayableDirector().playableAssetasTimelineAsset).GetOutputTracks();
   foreach(TrackAsset trackAssetin outputTracks )
    {
       foreach(PlayableBinding bindingin trackAsset.outputs )
        {
           if( binding.outputTargetType==typeof(T ) )
            {
               GetPlayableDirector().SetGenericBinding( binding.sourceObject, bindObject );
            }
        }
    }
}

指定トラックのクリップを取得する

C#
/// <summary>
/// タイムラインクリップの取得
/// </summary>
///
/// <paramname="trackName"> トラック名 </param>
/// <paramname="clipName"> クリップ名 </param>
///
/// <returns>
/// タイムラインクリップ
/// </returns>
publicTimelineClipFindTimelineClip(string trackName,string clipName )
{
   TimelineAsset timelineAsset=GetPlayableDirector().playableAssetasTimelineAsset;
   
   if( timelineAsset!=null )
    {
       // トラックからクリップリストの取得
       IEnumerable<TrackAsset> tracks= timelineAsset.GetOutputTracks();
       foreach(TrackAsset trackin tracks )
        {
           if( string.IsNullOrEmpty( trackName )==false&& track.name!= trackName )
            {
               continue;
            }
           
           foreach(TimelineClip timelineClipin track.GetClips() )
            {
               if( timelineClip.displayName== clipName )
                {
                   return timelineClip;
                }
            }
        }
    }
   
   returnnull;
}

指定トラックのクリップを全取得する

C#
/// <summary>
/// タイムラインクリップの全取得
/// </summary>
///
/// <paramname="trackName"> トラック名 </param>
///
/// <returns>
/// タイムラインクリップリスト
/// </returns>
publicList<TimelineClip>FindTimelineClipList(string trackName )
{
   // タイムラインアセットに変換
   TimelineAsset timelineAsset=GetPlayableDirector().playableAssetasTimelineAsset;
   if( timelineAsset!=null )
    {
       // トラックからクリップリストの取得
       IEnumerable<TrackAsset> tracks= timelineAsset.GetOutputTracks();
       TrackAsset track= tracks.FirstOrDefault( e=> e.name== trackName );
       IEnumerable<TimelineClip> clips= track.GetClips();
       List<TimelineClip> result= clips.ToList();
       return result;
    }

   returnnull;
}

Virtual Cameraの取得

C#
/// <summary>
/// ヴァーチャルカメラを検索してリストに追加する
/// </summary>
privateList<CinemachineVirtualCamera>FindVirtualCameras()
{
   List<CinemachineVirtualCamera> timelineVirtualCameras=newList<CinemachineVirtualCamera>();
   var outputTracks= (GetPlayableDirector().playableAssetasTimelineAsset).GetOutputTracks();
   foreach(TrackAsset trackAssetin outputTracks )
    {
       if( trackAssetisCinemachineTrack )
        {
           foreach(TimelineClip timelineClipin trackAsset.GetClips() )
            {
               CinemachineShot cinemachineShot=null;
                cinemachineShot= timelineClip.assetas CinemachineShot;
               if( cinemachineShot!=null )
                {
                   bool result;
                   CinemachineVirtualCamera cinemachineVirtualCamera=GetPlayableDirector().GetReferenceValue( cinemachineShot.VirtualCamera.exposedName,out result )asCinemachineVirtualCamera;
                   if( result )
                    {
                        timelineVirtualCameras.Add( cinemachineVirtualCamera );
                    }
                }
            }
        }
    }
   return timelineVirtualCameras;
}

コメント

  1. […] 【Unity】TimelineをScriptから扱うときのTips […]

タイトルとURLをコピーしました