public GameObject GenerateUnityObject(TimeLineData playable, Context ctx) { int startFrame = playable.AbsoluteTimeOffset - playable.TrimIn; int frameCount = playable.GetFrameCount(stage.fps) + playable.TrimIn + playable.TrimOut; var playableObj = MakePlayableBaseObject(playable, ref ctx, startFrame / ctx.fps, frameCount / ctx.fps); var pathForName = AnimationUtility.CalculateTransformPath(playableObj.transform, ctx.rootTransform); // GROUP var groupTrack = ctx.parentTimeline.CreateTrack <GroupTrack>(null, playable.displayName); ctx.ctx.AddObjectToAsset(pathForName + "_GroupTrack", groupTrack); // ANIMATION var animationTrack = ctx.parentTimeline.CreateTrack <AnimVRTrack>(groupTrack, pathForName + "_animation"); ctx.ctx.AddObjectToAsset(pathForName + "_animation", animationTrack); var animationClip = animationTrack.CreateDefaultClip(); animationClip.duration = playable.GetFrameCount(stage.fps) / stage.fps; animationClip.start = playable.TrimIn / stage.fps; typeof(TimelineClip).GetProperty("preExtrapolationMode").SetValue(animationClip, LOOP_MAPPING[playable.LoopIn], null); typeof(TimelineClip).GetProperty("postExtrapolationMode").SetValue(animationClip, LOOP_MAPPING[playable.LoopOut], null); var animAsset = animationClip.asset as AnimVRFramesAsset; animAsset.FPS = stage.fps; if (playable.Frames.Count > 0) { animAsset.FadeIn = playable.Frames[0].FadeModeIn; animAsset.FadeOut = playable.Frames[0].FadeModeOut; } ctx.director.SetGenericBinding(animAsset, playableObj); ctx.ctx.AddObjectToAsset(pathForName + "_animAsset", animAsset); int frameIndex = -1; foreach (var frame in playable.Frames) { if (!frame.isInstance) { var frameObj = GenerateUnityObject(frame, ctx, ++frameIndex); if (frameIndex != 0) { frameObj.SetActive(false); } frameObj.transform.SetAsLastSibling(); } animAsset.FrameIndices.Add(frameIndex); } return(playableObj); }
public GameObject GenerateUnityObject(TimeLineData playable, int frameOffset, AssetImportContext ctx, TimelineAsset parentTimeline, TrackAsset parentTrack, Transform parent) { var playableObj = MakePlayableBaseObject(playable, parent); var pathForName = AnimationUtility.CalculateTransformPath(playableObj.transform, stageTransform); // GROUP var groupTrack = parentTimeline.CreateTrack <GroupTrack>(parentTrack, playable.displayName); ctx.AddSubAsset(pathForName + "_GroupTrack", groupTrack); // ANIMATION var animationTrack = parentTimeline.CreateTrack <AnimVRTrack>(groupTrack, pathForName + "_animation"); ctx.AddSubAsset(pathForName + "_animation", animationTrack); var animationClip = animationTrack.CreateDefaultClip(); animationClip.duration = playable.GetFrameCount(stage.fps) / stage.fps; animationClip.start = (playable.AbsoluteTimeOffset + frameOffset) / stage.fps; typeof(TimelineClip).GetProperty("preExtrapolationMode").SetValue(animationClip, LOOP_MAPPING[playable.LoopIn], null); typeof(TimelineClip).GetProperty("postExtrapolationMode").SetValue(animationClip, LOOP_MAPPING[playable.LoopOut], null); var animAsset = animationClip.asset as AnimVRFramesAsset; animAsset.FPS = stage.fps; director.SetGenericBinding(animAsset, playableObj); ctx.AddSubAsset(pathForName + "_activeAsset", animAsset); // ACTIVATION var frameTrack = parentTimeline.CreateTrack <ActivationTrack>(groupTrack, pathForName + "_track"); ctx.AddSubAsset(pathForName + "_track", frameTrack); director.SetGenericBinding(frameTrack, playableObj); var frameClip = frameTrack.CreateDefaultClip(); frameClip.start = playable.LoopIn != AnimVR.LoopType.OneShot ? 0 : animationClip.start; frameClip.duration = playable.LoopOut != AnimVR.LoopType.OneShot ? parentTimeline.fixedDuration - frameClip.start : (animationClip.start - frameClip.start) + animationClip.duration; ctx.AddSubAsset(pathForName + "_activeAsset", frameClip.asset); int frameIndex = -1; foreach (var frame in playable.Frames) { if (!frame.isInstance) { var frameObj = GenerateUnityObject(frame, ctx, parentTimeline, playableObj.transform, ++frameIndex); if (frameIndex != 0) { frameObj.SetActive(false); } frameObj.transform.SetAsLastSibling(); } animAsset.FrameIndices.Add(frameIndex); } return(playableObj); }