ゆいブロ

自分の好きなことや知見をまとめていくブログです。

スポンサーリンク

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

はじめに

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

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

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

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

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

/// <summary>
/// T型のバインドタイプを持ったトラックにT型のオブジェクトの参照を渡す
/// </summary>
///
/// <param name="bindObject"> バインドするオブジェクト </param>
public void BindObject<T>( T bindObject ) where T : UnityEngine.Object
{
    foreach( TrackAsset trackAsset in ( GetPlayableDirector().playableAsset as TimelineAsset ).GetOutputTracks() )
    {
        foreach( PlayableBinding binding in trackAsset.outputs )
        {
            if( binding.outputTargetType == typeof( T ) )
            {
                GetPlayableDirector().SetGenericBinding( binding.sourceObject, bindObject );
            }
        }
    }
}

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


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

    return null;
}

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

/// <summary>
/// タイムラインクリップの全取得
/// </summary>
///
/// <param name="trackName"> トラック名 </param>
///
/// <returns>
/// タイムラインクリップリスト
/// </returns>
public List<TimelineClip> FindTimelineClipList( string trackName )
{
    // タイムラインアセットに変換
    TimelineAsset timelineAsset = GetPlayableDirector().playableAsset as TimelineAsset;

    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;
    }
    else
    {
        return null;
    }
}

Virtual Cameraの取得

/// <summary>
/// ヴァーチャルカメラを検索してリストに追加する
/// </summary>
private List<CinemachineVirtualCamera> FindVirtualCameras()
{
    List<CinemachineVirtualCamera> timelineVirtualCameras = new List<CinemachineVirtualCamera>();
    
    foreach( TrackAsset trackAsset in ( GetPlayableDirector().playableAsset as TimelineAsset ).GetOutputTracks() )
    {
        if( trackAsset is CinemachineTrack )
        {
            foreach( TimelineClip timelineClip in trackAsset.GetClips() )
            {
                CinemachineShot cinemachineShot = null;
                cinemachineShot = timelineClip.asset as CinemachineShot;

                if( cinemachineShot != null )
                {
                    bool result;
                    CinemachineVirtualCamera cinemachineVirtualCamera = GetPlayableDirector().GetReferenceValue( cinemachineShot.VirtualCamera.exposedName, out result ) as CinemachineVirtualCamera;

                    if( result )
                    {
                        timelineVirtualCameras.Add( cinemachineVirtualCamera );
                    }
                }
            }
        }
    }

    return timelineVirtualCameras;
}