Editor에서 Script로 Timelineasset 메모 생성

이것은 Editor에서 Script로 Timeline Assiet을 제작할 때의 요점 노트입니다
Unity2017.1.0f3
(ver가 상승하면 API가 다양하게 변하거나 증가할 수 있음)

요점


TrackAsset은 Timelineasset입니다.CreateTrack을 통해 생성
PlayableAsset 및 Recordable의 Animation Clip은 AssetDatabase입니다.AddObject ToAsset을 사용하여 Timeline Asset을 만든 아이
https://docs.unity3d.com/ScriptReference/AssetDatabase.AddObjectToAsset.html
(통상 UI 작업에 추가된 PlayableAsset은 asset.hideFlags = HideFlags.HideInHierrache;)

Timeline 구성



참조: http://www.shibuya24.info/entry/timeline_basis

TimlineAsset


TrackAsset을 관리하는 리더
그리고 전체적인 재생 시간을 설정해야 돼요.
https://docs.unity3d.com/2017.1/Documentation/ScriptReference/Timeline.TimelineAsset.html

TrackAsset


장면의 Object와 바인딩
Timeline Clip을 묶어서 저장해 두세요.
물려받은 다양한 종류가 있어요.
https://docs.unity3d.com/2017.1/Documentation/ScriptReference/Timeline.TrackAsset.html

TimelineClip + PlayableAsset


Timeline Clip은 언제부터 언제까지 어떻게 섞는지 정보만 가지고 있습니다.
https://docs.unity3d.com/2017.1/Documentation/ScriptReference/Timeline.TimelineClip.html
PlayableAsset에는 TimelineClip이 구체적으로 무엇을 하는지 정보가 있습니다.
예를 들어 Animation PlayableAsset의 경우 "어느 위치에서 어떤 애니메이션을 하는지"
https://docs.unity3d.com/2017.1/Documentation/ScriptReference/Timeline.AnimationPlayableAsset.html

견본


시험을 준비하다


AssetDatabase가 제작되었습니다.SaveAssets() 및 AssetDatabase입니다.Refresh() 없이는 Unity를 감지할 수 없습니다.

Timelineasset 생성 및 저장

       public static TimelineAsset CreateTimelineAsset(string path) {
              var timelineAsset = ScriptableObject.CreateInstance<TimelineAsset>();
              AssetDatabase.CreateAsset(timelineAsset, path);
              return timelineAsset;
       }

Timelineasset에 TrackAsset 추가


어떤 트랙의 아이가 되고 싶으면 Parent를 지목하세요.
Grop Track 같은 친자관계를 전제로 하는 Track입니다.
       public static T CreateTrackAsset<T>(TimelineAsset timelineAsset, string trackName, TrackAsset parent = null) where T : TrackAsset {
              return (T)timelineAsset.CreateTrack(typeof(T), parent, trackName);
       }

PlayableAsset을 생성하여 TimelineAsset의 하위 항목에 추가

       public static T CreatePlayableAsset<T>(TimelineAsset timelineAsset, string playableAssetName) where T : PlayableAsset {
              var playableAsset = (T)ScriptableObject.CreateInstance(typeof(T));
              playableAsset.name = playableAssetName;
              playableAsset.hideFlags = HideFlags.HideInHierarchy;
              AssetDatabase.AddObjectToAsset(playableAsset, timelineAsset);
              return playableAsset;
       }

TimelineClip 생성 및 TrackAsset에 추가

       public static TimelineClip CreateTimelineClip(TrackAsset parent, PlayableAsset playableAsset) {
              var timelineClip = parent.CreateDefaultClip();
              timelineClip.asset = playableAsset;
              return timelineClip;
       }

Animation Track의 Recordable Animation Clip 추가



편집 가능한 Animation Clip으로 추가
더 좋은 방법이 있을지도 몰라요.
       public static void AddAnimationClip(AnimationTrack trackAsset, TimelineClip timelineClip, AnimationClip clip) {
              if (timelineClip.asset as AnimationPlayableAsset == null) {
                     Debug.LogError("null AnimationPlayableAsset");
                     return;
              }
              var setClipFieldInfo = typeof(TrackAsset).GetField("m_AnimClip", BindingFlags.NonPublic | BindingFlags.Instance);
              setClipFieldInfo.SetValue(trackAsset, clip);
              var setRecordableFieldInfo = typeof(TimelineClip).GetField("m_Recordable", BindingFlags.NonPublic | BindingFlags.Instance);
              setRecordableFieldInfo.SetValue(timelineClip, true);
              (timelineClip.asset as AnimationPlayableAsset).clip = clip;
              AssetDatabase.AddObjectToAsset(clip, trackAsset.timelineAsset);
       }

생성 테스트

    [MenuItem("Test/TimelineCreateTest")]
    static void TimelineCreateTest() {
        var timelineAsset = CreateTimelineAsset("Assets/test.playable");
        var groupTrack = CreateTrackAsset<GroupTrack>(timelineAsset, "Parent");
        var animationTrack = CreateTrackAsset<AnimationTrack>(timelineAsset, "Child", groupTrack);
        var animationPlayableAsset = CreatePlayableAsset<AnimationPlayableAsset>(timelineAsset, "AnimationPlayableAsset");
        var timelineClip = CreateTimelineClip(animationTrack, animationPlayableAsset);

        AddRecordableAnimationClip(animationTrack, timelineClip, new AnimationClip { name = "TestRecordable" });
        AssetDatabase.SaveAssets();
    }

좋은 웹페이지 즐겨찾기