美文网首页
unity TimeLine播放多个音效

unity TimeLine播放多个音效

作者: WOTTOW | 来源:发表于2019-07-30 21:31 被阅读0次

    在unity中,TimeLine的功能还是非常的强大,可以做动画和视屏。
    在项目中遇到一个场景要用到非常多个对话,而且在播放完一个对话时,需要停顿一下。我感觉有点繁琐。
    在unity中PlayableDirector是存放TimeLine的,通过这个组件获取TimeLine中的每个片段的全部属性 。
    我是要与多个TimeLine进行切换,并播放操作,还是挺简单的。

    
     public PlayableDirector Director;
    
        public Dictionary<string, PlayableBinding> bindingDict = new Dictionary<string, PlayableBinding>();
    
        public List<TimelineAsset> wordTimeAsset = new List<TimelineAsset>();
           
        private string bindingDictName= "Audio";
    
        //变量
        private  int index=0;
        private  double time=0;
        TrackAsset currentTrack;
    
        //赋值变量
        private bool Limit = false;
        private bool Over = false;
    
        public int CcurrentIndex=0;
    
        private void Start()
        {
            CcurrentIndex = (int)PlayerUIButton.seletItem;
            InitAttributes();
    
            EventCenter.AddListener(SeletType.TimeLinePlay, TimeLinePlay);                          //注册播放TimeLine
            EventCenter.AddListener(SeletType.TimeLineReset, ResetTimeLine);                     //注册重置TimeLine
            EventCenter.AddListener(SeletType.TriggerPlay, TriggerPlay);                                 //注册触发播放音效
            EventCenter.AddListener(SeletType.ReplaceTimeLine, ReplaceTmeLine);               //注册替换TimeLine的方法
        }
    
        private void Update()
        {
            //if (Input.GetKeyDown(KeyCode.A))
            //{
            //    TimeLinePlay();
            //}
            //if (Input.GetKeyDown(KeyCode.B))
            //{
            //    ClickButtonPlay();
            //}
            //if (Input.GetKeyDown(KeyCode.C))
            //{
            //    ResetTimeLine();
            //}
    
            //if (Input.GetKeyDown(KeyCode.D))
            //{
            //    PlayerUIButton.seletItem = SeletItem.FallingWater;
            //    ReplaceTmeLine();
            //}
            if (CcurrentIndex != (int)PlayerUIButton.seletItem)
            {
                ReplaceTmeLine();
                CcurrentIndex = (int)PlayerUIButton.seletItem;
            }
    
            if (!Limit)
            {
                if (Director.time >= time)
                {
                    Director.Pause();
                    Over = true;
                    PlayNextAudio();
                    Limit = true;
                }
                else
                {
                    Over = false;
                }
            }
        }
    
        /// <summary>
        /// 替换TimeLine
        /// </summary>
        public void ReplaceTmeLine()
        {
            ResetTimeLine();                                 //保险没有重置TimeLine
            int Index = (int)PlayerUIButton.seletItem;
            Director.playableAsset = wordTimeAsset[Index];
            InitAttributes();
            index = 0;
        }
    
        /// <summary>
        /// 触发播放 
        /// </summary>
        public void  TriggerPlay()
        {
            ClickButtonPlay();
        }
    
        /// <summary>
        /// 重置TimeLine
        /// </summary>
        public  void ResetTimeLine()
        {
            Over = false;
            index = -1;   //音频的index 
            time = 0;     //时间
            Director.Stop();
        }
    
        /// <summary>
        /// 播放音效
        /// </summary>
        public void TimeLinePlay()
        {
            Limit = false;
            Director.Play();
        }
        
        /// <summary>
        /// 点击Button播放音效
        /// </summary>
        public void ClickButtonPlay()
        {
            Limit = false;
            if (!Over)
            {
                Director.time = time;
                PlayNextAudio();
            }
            Director.Play();
        }
    
        /// <summary>
        /// 初始化
        /// </summary>
        private void InitAttributes()
        {
            bindingDict.Clear();
            foreach (PlayableBinding pb in Director.playableAsset.outputs)
            {
                if (!bindingDict.ContainsKey(pb.streamName))
                {
                    bindingDict.Add(pb.streamName, pb);
                }
            }
            currentTrack = bindingDict["Audio0"].sourceObject as TrackAsset;
            time = currentTrack.duration;
        }
    
        /// <summary>
        /// 播放下一个音效
        /// 默认是从第二个Bindings开始播放
        /// </summary>
        public void PlayNextAudio()
        {
            index =(int)Mathf.Repeat((float)++index, (float)bindingDict.Count);
            string name = bindingDictName + index;
            var track = bindingDict[name].sourceObject as TrackAsset;
            time += track.duration;
        }
    

    相关文章

      网友评论

          本文标题:unity TimeLine播放多个音效

          本文链接:https://www.haomeiwen.com/subject/rcborctx.html