Beispiel #1
0
        private void OnGUI()
        {
            GUILayout.BeginHorizontal();
            GUILayout.Label("舞蹈名称");
            m_name = GUILayout.TextField(m_name);
            GUILayout.EndHorizontal();
            m_targetDancer  = (GameObject)EditorGUILayout.ObjectField("舞者模型", m_targetDancer, typeof(GameObject), false);
            m_animationClip = (AnimationClip)EditorGUILayout.ObjectField("舞蹈动画", m_animationClip, typeof(AnimationClip), false);
            m_audioClip     = (AudioClip)EditorGUILayout.ObjectField("舞蹈音乐", m_audioClip, typeof(AudioClip), false);
            if (GUILayout.Button("生成"))
            {
                AssetDatabase.CreateFolder(Path.Combine("Assets", "Builds"), m_name);

                AssetDatabase.CreateFolder(Path.Combine("Assets", "Builds", m_name), "Animations");
                AssetDatabase.CreateFolder(Path.Combine("Assets", "Builds", m_name), "Audios");
                AssetDatabase.CreateFolder(Path.Combine("Assets", "Builds", m_name), "Prefabs");

                var p1 = Copy(m_animationClip, "Animations");
                var p2 = Copy(m_audioClip, "Audios");

                TimelineAsset timeline   = new TimelineAsset();
                var           animTrack  = timeline.CreateTrack <AnimationTrack>();
                var           audioTrack = timeline.CreateTrack <AudioTrack>();
                var           danceTrack = timeline.CreateTrack <DanceTrack>();

                var animClip = timeline.GetRootTrack(0).CreateClip <AnimationPlayableAsset>();
                var anim     = AssetDatabase.LoadAssetAtPath <AnimationClip>(p1);
                (animClip.asset as AnimationPlayableAsset).clip = anim;
                animClip.start    = 0;
                animClip.duration = anim.length;

                var audioClip = timeline.GetRootTrack(1).CreateClip <AudioPlayableAsset>();
                var audio     = AssetDatabase.LoadAssetAtPath <AudioClip>(p2);
                (audioClip.asset as AudioPlayableAsset).clip = audio;
                audioClip.start    = 0;
                audioClip.duration = audio.length;

                GameObject root = new GameObject(m_name);
                root.transform.position = Vector3.zero;
                root.AddComponent <DanceGameDisk>();

                GameObject reference = GameObject.Instantiate <GameObject>(m_targetDancer);
                reference.name = "Reference";
                reference.transform.SetParent(root.transform);
                reference.transform.localPosition = Vector3.zero;
                reference.transform.localRotation = Quaternion.identity;
                reference.transform.localScale    = Vector3.one;

                GameObject masks = new GameObject("MaskRoot");
                masks.transform.SetParent(root.transform);
                masks.transform.localPosition = Vector3.zero;
                masks.transform.localRotation = Quaternion.identity;
                masks.transform.localScale    = Vector3.one;

                AssetDatabase.CreateAsset(timeline, Path.Combine("Assets", "Builds", m_name, "Animations", m_name) + ".playable");
                var dir = root.AddComponent <PlayableDirector>();
                dir.playableAsset = timeline;
                dir.SetGenericBinding(animTrack, reference);
            }
        }
Beispiel #2
0
            //Finds the TimelineClip corresponding to a playable asset in a timeline
            public static TimelineClip GetClip(TimelineAsset timeline, IPlayableAsset Clip)
            {
                if (timeline != null)
                {
                    for (int i = 0; i < timeline.rootTrackCount; i++)
                    {
                        TimelineClip clip = GetClipInAllTracks(timeline.GetRootTrack(i), Clip);

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

                return(null);
            }
Beispiel #3
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();
        }
    public void BuildTimeline()
    {
        Debug.Log("Buidilng Timeline");
        TimelineAsset timelineAsset = (TimelineAsset)timeline.playableAsset;

        //TODO: make it so that it deletes all tracks and rebuilds them every each time
        for (int i = 0; i < timelineAsset.rootTrackCount; i++)
        {
            timelineAsset.DeleteTrack(timelineAsset.GetRootTrack(0));
        }
        for (int i = 0; i < timelineAsset.outputTrackCount; i++)
        {
            timelineAsset.DeleteTrack(timelineAsset.GetOutputTrack(0));
        }

        ControlTrack controlTrack = (ControlTrack)timelineAsset.CreateTrack(typeof(ControlTrack), null, "Control Track");

        clipToTime = new Dictionary <ClipSettings, double>();

        // map all timeline clips first
        for (int i = 0; i < timelineClips.Count; i++)
        {
            TimelineClip         tc  = controlTrack.CreateDefaultClip();
            ControlPlayableAsset cpa = tc.asset as ControlPlayableAsset;
            cpa.sourceGameObject.exposedName = UnityEditor.GUID.Generate().ToString();
            timeline.SetReferenceValue(cpa.sourceGameObject.exposedName, timelineClips[i].timelineTrack.gameObject);

            if (i != 0)
            {
                tc.start = tc.start + 1;
            }

            clipToTime.Add(timelineClips[i], tc.start);

            tc.duration = timelineClips[i].timelineTrack.duration;
        }

        //map remix clips
        int j = 0;

        foreach (TimelineClip tc in controlTrack.GetClips())
        {
            foreach (TriggerMapping triggerMapping in timelineClips[j].triggers)
            {
                TimeMachineTrack timeMachineTrack = (TimeMachineTrack)timelineAsset.CreateTrack(typeof(TimeMachineTrack), null, "Trigger Track");
                if (triggerMapping.type == TriggerType.CONTINUOUS)
                {
                    TimelineClip     triggerCip = timeMachineTrack.CreateDefaultClip();
                    TimeMachineAsset tma        = triggerCip.asset as TimeMachineAsset;

                    tma.action          = TimeMachineBehavior.TimeMachineAction.JumpToTime;
                    tma.condition       = TimeMachineBehavior.Condition.TriggerOff;
                    tma.timeToJumpTo    = (float)clipToTime[triggerMapping.targetTrack];
                    triggerCip.start    = tc.start;
                    triggerCip.duration = tc.duration;


                    tma.trigger.exposedName = UnityEditor.GUID.Generate().ToString();
                    // tma.timeToJumpTo = triggerMapping.timeToJumpTo;
                    timeline.SetReferenceValue(tma.trigger.exposedName, triggerMapping.trigger);
                }
                else
                {
                    TimelineClip     triggerCip = timeMachineTrack.CreateDefaultClip();
                    TimeMachineAsset tma        = triggerCip.asset as TimeMachineAsset;

                    tma.action          = TimeMachineBehavior.TimeMachineAction.JumpToTime;
                    tma.condition       = TimeMachineBehavior.Condition.TriggerOff;
                    tma.timeToJumpTo    = (float)clipToTime[triggerMapping.targetTrack];
                    triggerCip.start    = tc.end;
                    triggerCip.duration = 1;

                    tma.trigger.exposedName = UnityEditor.GUID.Generate().ToString();
                    timeline.SetReferenceValue(tma.trigger.exposedName, triggerMapping.trigger);
                }
            }
            j++;
        }
        Debug.Log("Finished");
    }