MENU
2024.01.06 サイトデザインをリニューアル中です

【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
{
    var outputTracks = (GetPlayableDirector().playableAsset as TimelineAsset).GetOutputTracks();
    foreach( TrackAsset trackAsset in outputTracks )
    {
        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;
    }

    return null;
}

Virtual Cameraの取得

/// <summary>
/// ヴァーチャルカメラを検索してリストに追加する
/// </summary>
private List<CinemachineVirtualCamera> FindVirtualCameras()
{
    List<CinemachineVirtualCamera> timelineVirtualCameras = new List<CinemachineVirtualCamera>();
    var outputTracks = (GetPlayableDirector().playableAsset as TimelineAsset).GetOutputTracks();

    foreach( TrackAsset trackAsset in outputTracks )
    {
        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;
}
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (1件)

コメントする

目次