public static void Create(BGMList.Param param)
    {
        //TimelineAssetの生成
        TimelineAsset timeline = Initialize <TimelineAsset>(param.dictKey);

        AudioTrack[]     audioTracks = timeline.GetRootTracks() as AudioTrack[];
        List <AudioClip> audioClips  = AssetLoader.LoadAll <AudioClip>("BGM/" + param.dictKey); //ここでファイル名でソートさせる必要がありそう

        foreach (AudioTrack audioTrack in audioTracks)
        {
            timeline.DeleteTrack(audioTrack);
        }
        //AudioTrackの作成
        for (int i = 0; i <= param.subTrackTimeMarkers.Count; i++)
        {
            timeline.CreateTrack <AudioTrack>();
        }
        audioTracks = timeline.GetRootTracks() as AudioTrack[];
        //AudioClipの割り当て
        //メイントラック
        audioTracks[0].CreateClip(audioClips[0]);
        IEnumerable <TimelineClip> timelineClips = audioTracks[0].GetClips();

        foreach (TimelineClip clip in timelineClips)
        {
            clip.clipIn   = 0;
            clip.duration = audioClips[1].length;
            clip.start    = 0;
        }
        timeline.CreateMarkerTrack();
        //ループマーカーの追加
        timeline.markerTrack.CreateMarker(typeof(LoopStartMarker), param.loopTimeMarkers.loopStartTime);
        timeline.markerTrack.CreateMarker(typeof(LoopEndMarker), param.loopTimeMarkers.loopEndTime);
        //セクションマーカーの追加
        if (param.sectionMarkers.Count > 0)
        {
            foreach (double sectionmarker in param.sectionMarkers)
            {
                timeline.markerTrack.CreateMarker(typeof(SectionMarker), sectionmarker);
            }
        }
        if (param.subTrackTimeMarkers.Count <= 0)
        {
            return;
        }
        //サブトラックの割り当て
        for (int i = 1; i <= param.subTrackTimeMarkers.Count; i++)
        {
            audioTracks[i].CreateClip(audioClips[i]);
            timelineClips = audioTracks[i].GetClips();


            foreach (TimelineClip clip in timelineClips)
            {
                clip.clipIn   = 0;
                clip.duration = param.subTrackTimeMarkers[i - 1].endTime - param.subTrackTimeMarkers[i - 1].startTime;
                clip.start    = param.subTrackTimeMarkers[i - 1].startTime;
            }
        }
    }
        //----------------------------

        public static void CleanupTimelineAsset(TimelineAsset tA)
        {
            Object[]             assets            = AssetDatabase.LoadAllAssetsAtPath(AssetDatabase.GetAssetPath(tA));
            bool                 needsSave         = false;
            List <AnimationClip> allAnimationClips = new List <AnimationClip> ();

            GetAllAnimationClipsRecursive(tA.GetRootTracks(), allAnimationClips);
            foreach (Object asset in assets)
            {
                AnimationClip animClip = asset as AnimationClip;
                if (animClip == null || AssetDatabase.IsMainAsset(asset))
                {
                    continue;
                }
                if (allAnimationClips.Contains(animClip))
                {
                    continue;
                }
                Object.DestroyImmediate(asset, true);
                needsSave = true;
            }
            if (needsSave)
            {
                AssetDatabase.SaveAssets();
            }
        }
Beispiel #3
0
 private static void SetExpandedStates(TimelineAsset asset, HashSet <TrackAsset> expanded)
 {
     foreach (TrackAsset track in asset.GetRootTracks())
     {
         SetExpandedStates(track, expanded);
     }
 }
Beispiel #4
0
 public static void EnumerateTracks(TimelineAsset timeline, Action <TrackAsset> act)
 {
     foreach (var track in timeline.GetRootTracks())
     {
         EnumerateTracks(track, act);
     }
 }
        public static void RunOnRootTracks(TimelineAsset timelineAsset, Action <TrackAsset> @Action)
        {
            IEnumerable <TrackAsset> tracks = timelineAsset.GetRootTracks();

            foreach (TrackAsset track in tracks)
            {
                @Action.Invoke(track);
            }
        }
        // 导出rootTrack
        private void ExportRootTrack(JSONObject rootTrackIndexArr, JSONObject trackListArr, JSONObject clipListArr)
        {
            IEnumerable <TrackAsset> trackAssetList = timelineAsset.GetRootTracks();
            List <int> indexList = ExportTrackList(trackAssetList, trackListArr, clipListArr);

            foreach (int index in indexList)
            {
                rootTrackIndexArr.Add(index);
            }
        }
        /// <summary>
        ///  From a given timeline asset, see if we can find a track with the matching name
        /// </summary>
        public static TrackAsset FindTrackByName(TimelineAsset timelineAsset, string name)
        {
            var trackList = timelineAsset.GetRootTracks();
            var thisTrack = FindTrackByNameInternal(trackList, name);

            if (thisTrack == null)
            {
                UnityEngine.Debug.Log("Could not find track in Timeline with name: " + name);
            }
            return(thisTrack);
        }
Beispiel #8
0
        internal static int CalcAnimClipHash(TimelineAsset asset)
        {
            int hash = 0;

            foreach (var t in asset.GetRootTracks())
            {
                if (t != null)
                {
                    hash ^= CalcAnimClipHash(t);
                }
            }
            return(hash);
        }
Beispiel #9
0
 public static void SetAllClipDurations(this TimelineAsset timeline, double duration)
 {
     foreach (var track in timeline.GetRootTracks())
     {
         foreach (var clip in track.GetClips())
         {
             if (clip.asset is IExpandableClip playable && playable.inheritDuration)
             {
                 clip.timeScale = 1;
                 clip.start     = 0;
                 clip.duration  = duration;
             }
         }
     }
 }
        public void ResetExternally()
        {
            var tracksToDelete = executeTimeline.GetRootTracks();

            foreach (var track in tracksToDelete)
            {
                executeTimeline.DeleteTrack(track);
            }

            executeTimeline = null;
            steerTrack      = null;
            lerpTrack       = null;
            attachTrack     = null;
            ctrack          = null;
        }
Beispiel #11
0
 public static bool TryGetClip <T>(this TimelineAsset timeline, out T clipAsset)
     where T : UnityEngine.Object
 {
     foreach (var track in timeline.GetRootTracks())
     {
         foreach (var clip in track.GetClips())
         {
             clipAsset = clip.asset as T;
             if (clipAsset != default)
             {
                 return(true);
             }
         }
     }
     clipAsset = default;
     return(false);
 }
Beispiel #12
0
            //Finds the TimelineClip corresponding to a playable asset in a timeline
            public static TimelineClip GetClip(TimelineAsset timeline, IPlayableAsset Clip)
            {
                if (timeline != null)
                {
                    foreach (TrackAsset track in timeline.GetRootTracks())
                    {
                        TimelineClip clip = GetClipInAllTracks(track, Clip);

                        if (clip != null)
                        {
                            return(clip);
                        }
                    }
                }

                return(null);
            }
Beispiel #13
0
        AnimationTrack GetOrCreateAnimationTrack(string name, TimelineAsset timeline, Action <AnimationTrack> prepareFunc = null)
        {
            var track = timeline.GetRootTracks().OfType <AnimationTrack>()
                        .FirstOrDefault(t => t != null && t.name == name);

            if (track != null)
            {
                if (prepareFunc != null)
                {
                    prepareFunc(track);
                }
            }
            else
            {
                track = timeline.CreateTrack <AnimationTrack>(null, name);
            }
            return(track);
        }
        /**************
        * UTA Getters *
        **************/
        private List <TimelineAsset> GetAllUTATimelines()
        {
            List <TimelineAsset> res = new List <TimelineAsset>();

            string[] guids = AssetDatabase.FindAssets("t:timelineasset", new string[] { "Assets" });
            foreach (string guid in guids)
            {
                TimelineAsset a = AssetDatabase.LoadAssetAtPath <TimelineAsset>(AssetDatabase.GUIDToAssetPath(guid));
                foreach (TrackAsset track in a.GetRootTracks())
                {
                    if (track.GetType().IsAssignableFrom(typeof(UTAPlayableTrack)))
                    {
                        res.Add(a);
                        break;
                    }
                }
            }

            return(res);
        }
Beispiel #15
0
    static void ParseScreenplay()
    {
        Clear();

        // load file
        var      selectedFilepath = EditorUtility.OpenFilePanel("Select Screenplay", "", "txt");
        FileInfo fileInfo         = new FileInfo(selectedFilepath);
        string   timeText         = System.DateTime.Now.ToString("hh.mm.ss"); // get time so we can mark where these changes were made

        // create playabledirector in scene
        currentPlayableGameObject = new GameObject();

        currentPlayableGameObject.name = fileInfo.Name.Replace(".txt", string.Empty) + " " + timeText + " Timeline";
        currentDataSlate = currentPlayableGameObject.AddComponent <screenwriterDataSlate> ();
        currentPlayable  = currentPlayableGameObject.AddComponent <PlayableDirector> ();

        // create timeline asset
        TimelineAsset currentTimeline = ScriptableObject.CreateInstance("TimelineAsset") as TimelineAsset;

        AssetDatabase.CreateAsset(currentTimeline, "Assets/Timelines/" + fileInfo.Name.Replace(".txt", string.Empty) + " " + timeText + ".playable");

        currentTimeline = (TimelineAsset)AssetDatabase.LoadAssetAtPath("Assets/Timelines/" + fileInfo.Name.Replace(".txt", string.Empty) + " " + timeText + ".playable", typeof(TimelineAsset));

        currentPlayable.playableAsset = currentTimeline;

        masterTrack = currentTimeline.CreateTrack <GroupTrack> (null, "Master Group");
        currentTimeline.CreateTrack <ControlTrack> (masterTrack, "Shots");
        currentTimeline.CreateTrack <ControlTrack> (masterTrack, "Lighting");
        //      currentTimeline.CreateTrack<SignalTrack> (null, "Track");
        //      currentTimeline.CreateTrack<AnimationTrack> (null, "Track");

        string filePath = fileInfo.FullName;

        line = null;
        StreamReader reader = new StreamReader(filePath);

        using (reader) {
            do
            {
                thirdLastLine = lastLine;
                lastLine      = line;
                line          = reader.ReadLine();
                if (System.String.IsNullOrEmpty(line) == false)
                {
                    // this is where we actually parse the screenplay

                    lineCount++;
                    //  print ("Parsing line #" + lineCount);

                    // capital letters checker
                    char[] possibleCharacter = line.ToCharArray();
                    int    capitalization    = 0;
                    for (int i = 0; i < possibleCharacter.Length; i++)
                    {
                        if (System.Char.IsUpper(possibleCharacter[i]))
                        {
                            capitalization++;
                        }
                    }

                    // location, time of day
                    if (line.Contains("EXT") || line.Contains("INT"))
                    {
                        char splitChar = '-';

                        string[] splitString = line.Split(splitChar);

                        currentDataSlate.TryAddLocation(splitString[0]);
                        currentLocation = splitString[0];

                        currentDataSlate.TryAddLightingScenario(splitString[1]);
                        currentLightingScenario = splitString[1];
                        continue;
                    }

                    // character check - all capitals and no :
                    if (capitalization > possibleCharacter.Length * 0.8f && line.Contains(":") == false)
                    {
                        currentDataSlate.TryAddCharacter(line);
                        currentCharacter = line;
                        continue;
                    }

                    // extra actor instructions check - has ()
                    if (line.Contains("("))
                    {
                        currentMood = line;
                        continue;
                    }

                    // transition data - contains : and is caps
                    if (line.Contains(":") && capitalization > possibleCharacter.Length * 0.5f)
                    {
                        continue;
                    }

                    // at this point there arent many edge cases left - check if we have a actor guidelines or an actor name above us to see if this is dialogue
                    if (lastLine != null)
                    {
                        if (lastLine.Contains("(") || currentDataSlate.characters.Contains(lastLine))
                        {
                            //dialogue callback

                            // check if we already have a character group
                            bool alreadyCreatedCharacter = false;
                            IEnumerable <TrackAsset> duplicateCharacterCheck = currentTimeline.GetRootTracks();
                            foreach (TrackAsset track in duplicateCharacterCheck)
                            {
                                print(track.name);
                                if (track.name == currentCharacter)
                                {
                                    alreadyCreatedCharacter = true;
                                }
                            }

                            if (alreadyCreatedCharacter == false)
                            {
                                TrackAsset characterTrack      = currentTimeline.CreateTrack <GroupTrack> (null, currentCharacter);
                                TrackAsset possibleSignalTrack = currentTimeline.CreateTrack <SignalTrack> (characterTrack, currentCharacter + " Signals");
                                TrackAsset animationTrack      = currentTimeline.CreateTrack <AnimationTrack> (characterTrack, currentCharacter + " Animation Overrides");
                            }

                            IEnumerable <TrackAsset> allTracksForActors = currentTimeline.GetOutputTracks();
                            foreach (TrackAsset track in allTracksForActors)
                            {
                                if (track.name == currentCharacter + " Signals")
                                {
                                    IMarker newMarker = track.CreateMarker <SignalEmitter> (currentTimelineScrub);
                                }
                                if (track.name == currentCharacter + " Animation Overrides")
                                {
                                    TimelineClip newClip = track.CreateDefaultClip();
                                    newClip.start       = currentTimelineScrub;
                                    newClip.duration    = Convert.ToDouble(line.Length) / 12.0;
                                    newClip.displayName = "Dialogue Animation";
                                }
                            }
                        }
                    }

                    // shot callback
                    IEnumerable <TrackAsset> allTracksForActions = currentTimeline.GetOutputTracks();
                    foreach (TrackAsset track in allTracksForActions)
                    {
                        if (track.name == "Shots")
                        {
                            GameObject cameraInstance = PrefabUtility.InstantiatePrefab(currentDataSlate.cameraPrefab) as GameObject;
                            cameraInstance.name             = "Shot Camera";
                            cameraInstance.transform.parent = currentPlayableGameObject.transform;

                            //   TimelineClip newClip = track.CreateDefaultClip ();
                            //

                            TimelineClip         tlClip = track.CreateClip <ControlPlayableAsset> ();
                            ControlPlayableAsset clip   = tlClip.asset as ControlPlayableAsset;
                            clip.sourceGameObject.exposedName = UnityEditor.GUID.Generate().ToString();
                            currentPlayable.SetReferenceValue(clip.sourceGameObject.exposedName, cameraInstance);

                            tlClip.clipIn      = currentTimelineScrub;
                            tlClip.duration    = Convert.ToDouble(line.Length) / 12.0;
                            tlClip.displayName = line;
                        }
                        if (track.name == "Lighting")
                        {
                            TimelineClip newClip = track.CreateDefaultClip();
                            newClip.displayName = currentLightingScenario;
                            newClip.clipIn      = currentTimelineScrub;
                            newClip.duration    = Convert.ToDouble(line.Length) / 12.0;
                        }
                    }

                    currentTimelineScrub = currentTimeline.duration;
                }
            }while (line != null);
            reader.Close();
        }
    }
        public DragAndDropVisualMode HandleTrackDrop(TreeViewItem parentItem, TreeViewItem targetItem, bool perform, DropPosition dropPos)
        {
            ((TimelineTreeView)m_Window.treeView.gui).showInsertionMarker = false;
            var trackDragData = (TimelineDragData)DragAndDrop.GetGenericData(k_GenericDragId);
            bool validDrag = ValidDrag(targetItem, trackDragData.draggedItems);
            if (!validDrag)
                return DragAndDropVisualMode.None;


            var draggedTracks = trackDragData.draggedItems.OfType<TimelineGroupGUI>().Select(x => x.track).ToList();
            if (draggedTracks.Count == 0)
                return DragAndDropVisualMode.None;

            if (parentItem != null)
            {
                var parentActor = parentItem as TimelineGroupGUI;
                if (parentActor != null && parentActor.track != null)
                {
                    if (parentActor.track.lockedInHierarchy)
                        return DragAndDropVisualMode.Rejected;

                    if (draggedTracks.Any(x => !TimelineCreateUtilities.ValidateParentTrack(parentActor.track, x.GetType())))
                        return DragAndDropVisualMode.Rejected;
                }
            }

            var insertAfterItem = targetItem as TimelineGroupGUI;
            if (insertAfterItem != null && insertAfterItem.track != null)
            {
                ((TimelineTreeView)m_Window.treeView.gui).showInsertionMarker = true;
            }

            if (dropPos == DropPosition.Upon)
            {
                var groupGUI = targetItem as TimelineGroupGUI;
                if (groupGUI != null)
                    groupGUI.isDropTarget = true;
            }

            if (perform)
            {
                PlayableAsset targetParent = m_Timeline;
                var parentActor = parentItem as TimelineGroupGUI;

                if (parentActor != null && parentActor.track != null)
                    targetParent = parentActor.track;

                TrackAsset siblingTrack = insertAfterItem != null ? insertAfterItem.track : null;

                // where the user drops after the last track, make sure to place it after all the tracks
                if (targetParent == m_Timeline && dropPos == DropPosition.Below && siblingTrack == null)
                {
                    siblingTrack = m_Timeline.GetRootTracks().LastOrDefault(x => !draggedTracks.Contains(x));
                }

                if (TrackExtensions.ReparentTracks(TrackExtensions.FilterTracks(draggedTracks).ToList(), targetParent, siblingTrack, dropPos == DropPosition.Above))
                {
                    m_Window.state.Refresh();
                }
            }

            return DragAndDropVisualMode.Move;
        }
    public static void DupTimeline()
    {
        // Fetch playable director, fetch timeline
        GameObject       playableDirectorObj = UnityEditor.Selection.activeObject as GameObject;
        PlayableDirector playableDirector    = playableDirectorObj.GetComponent <PlayableDirector>();
        TimelineAsset    timelineAsset       = playableDirector.playableAsset as TimelineAsset;

        // Duplicate
        string path    = AssetDatabase.GetAssetPath(timelineAsset);
        string newPath = path.Replace(".", "(Clone).");

        if (!AssetDatabase.CopyAsset(path, newPath))
        {
            if (showLogs)
            {
                Debug.LogError("Couldn't Clone Asset");
            }
            return;
        }

        // Copy Bindings
        TimelineAsset newTimelineAsset = AssetDatabase.LoadMainAssetAtPath(newPath) as TimelineAsset;

        PlayableBinding[] oldBindings = timelineAsset.outputs.ToArray();
        PlayableBinding[] newBindings = newTimelineAsset.outputs.ToArray();
        for (int i = 0; i < oldBindings.Length; i++)
        {
            playableDirector.playableAsset = timelineAsset;
            Object boundTo = playableDirector.GetGenericBinding(oldBindings[i].sourceObject);

            playableDirector.playableAsset = newTimelineAsset;
            playableDirector.SetGenericBinding(newBindings[i].sourceObject, boundTo);
        }

        // Copy Exposed References
        playableDirector.playableAsset = newTimelineAsset;
        foreach (TrackAsset newTrackAsset in newTimelineAsset.GetRootTracks())
        {
            foreach (TimelineClip newClip in newTrackAsset.GetClips())
            {
                foreach (FieldInfo fieldInfo in newClip.asset.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly))
                {
                    if (fieldInfo.FieldType.IsGenericType && fieldInfo.FieldType.GetGenericTypeDefinition() == typeof(ExposedReference <>))
                    {
                        // Fetch Old Exposed Name
                        object       exposedReference = fieldInfo.GetValue(newClip.asset);
                        PropertyName oldExposedName   = (PropertyName)fieldInfo.FieldType
                                                        .GetField("exposedName")
                                                        .GetValue(exposedReference);
                        bool isValid;

                        // Fetch Old Exposed Value
                        Object oldExposedValue = playableDirector.GetReferenceValue(oldExposedName, out isValid);
                        if (!isValid)
                        {
                            if (showLogs)
                            {
                                Debug.LogError("Failed to copy exposed references to duplicate timeline. Could not find: " + oldExposedName);
                            }
                            return;
                        }

                        // Replace exposedName on struct
                        PropertyName newExposedName = new PropertyName(UnityEditor.GUID.Generate().ToString());
                        fieldInfo.FieldType
                        .GetField("exposedName")
                        .SetValue(exposedReference, newExposedName);

                        // Set ExposedReference
                        fieldInfo.SetValue(newClip.asset, exposedReference);

                        // Set Reference on Playable Director
                        playableDirector.SetReferenceValue(newExposedName, oldExposedValue);
                    }
                }
            }
        }
    }
Beispiel #18
0
        private void OnGUI()
        {
            GUILayout.BeginVertical();
            //
            GUILayout.BeginHorizontal();
            //区域B 展示区域
            int  x         = 0;
            int  y         = 0;
            int  size      = 60;
            int  padding   = 10;
            int  maxCount  = 600 / (size + padding);
            int  count     = 0;
            Rect rect      = Rect.zero;
            Rect labelRect = Rect.zero;

            GUILayout.BeginArea(new Rect(padding, padding, 600, 600));
            GUILayout.BeginScrollView(new Vector2(300, 0),
                                      GUILayout.Width(600), GUILayout.ExpandHeight(true));

            var nodeInfos = BGMSwitchHelper.config.topics;

            if (nodeInfos != null)
            {
                foreach (var nodeInfo in nodeInfos)
                {
                    if (nodeInfo == null)
                    {
                        return;
                    }
                    rect = new Rect(x, y, size, size);
                    string topicname = nodeInfo.topicname;
                    if (GUI.Button(rect, topicname))
                    {
                        System.Random random = new System.Random();
                        int           rat    = random.Next(nodeInfo.items.Count);
                        Debug.Log("rat: " + rat);
                        string    id        = nodeInfo.items[rat].id;
                        AudioClip audioclip = Resources.Load <AudioClip>(id);

                        if (audioclip == null)
                        {
                            Debug.LogError("audioclip is null. path: " + id);
                        }
                        else
                        {
                            TimelineAsset     timelineAsset = BGMSwitchHelper.bgmPlayableDirector.playableAsset as TimelineAsset;
                            List <TrackAsset> lstTrackAsset = timelineAsset.GetRootTracks().ToList <TrackAsset>();
                            for (int i = 0; i < lstTrackAsset.Count; i++)
                            {
                                TrackAsset trackAsset = timelineAsset.GetRootTrack(i);
                                timelineAsset.DeleteTrack(trackAsset);
                            }
                            var track = timelineAsset.CreateTrack <AudioTrack>(null, "bgmTrack");
                            BGMSwitchHelper.bgmPlayableDirector.SetGenericBinding(track, BGMSwitchHelper.BMGMgrGo);


                            var clip = track.CreateClip(audioclip);
                            clip.displayName = audioclip.name;
                            AudioPlayableAsset clipasset = clip.asset as AudioPlayableAsset;
                            clipasset.loop = true;
                            AssetDatabase.SaveAssets();
                        }

                        Close();
                    }

                    x += size + padding;
                    count++;
                    if ((count + 1) % maxCount == 0)
                    {
                        x  = 0;
                        y += size + padding;
                    }
                }
            }

            GUILayout.EndScrollView();
            GUILayout.EndArea();
            GUILayout.EndHorizontal();

//             if (GUILayout.Button("Generate"))
//             {
//
//             }


            GUILayout.EndVertical();
        }
Beispiel #19
0
 public static TimelineClip GetClipForAsset(TimelineAsset timelineAsset, UnityEngine.Object playableAsset)
 {
     return(timelineAsset.GetRootTracks()
            .SelectMany(track => GetClipsInTrack(track, clip => clip.asset == playableAsset))
            .FirstOrDefault());
 }
Beispiel #20
0
        public static GroupTrack GetGroupTrackWithName(TimelineAsset timeline, string name)
        {
            IEnumerable <TrackAsset> tracks = timeline.GetRootTracks();

            return(tracks.OfType <GroupTrack>().FirstOrDefault(groupTrack => groupTrack.name.Equals(name)));
        }
Beispiel #21
0
 public static void RunOnAllTracks(TimelineAsset timelineAsset, Action <TrackAsset> Action, bool runOnGroupTracks)
 {
     RunOnTrackIEnumerable(timelineAsset.GetRootTracks(), Action, runOnGroupTracks);
 }
Beispiel #22
0
 public static T RunOnAllTracksReturn <T> (TimelineAsset timelineAsset, Func <TrackAsset, object> @Func, bool runOnGroupTracks)
 {
     return((T)RunOnTrackIEnumerableReturn(timelineAsset.GetRootTracks(), @Func, runOnGroupTracks));
 }