| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677 | using FairyGUI;using UnityEngine;using UI.Main;using System.Collections;using System.Collections.Generic;using System.Text.RegularExpressions;using System;namespace GFGGame{    public delegate void OnCompleteStoryDialogCall(bool isSkip, object param);    public class StoryDialogView : BaseView    {        private UI_StoryDialogUI _ui;        private UI_CompArrow _arrow;        private GameObject _sceneObject;        private GameObject _scenePrefab;        private GameObject _npcHead;        private DressUpObjUI _dressUpObjUI;        private GoWrapper _npcWrapper;        private GTextField _wordTextField;        //剧情完成回调        private OnCompleteStoryDialogCall _onCompleteStoryDialogCall;        private object _onCompleteStoryDialogCallParam;        //回顾        private List<string> _dialogListLookBack;        //自动播放        private int _speedAutoPlay = 1;        private bool _autoPlay = false;        //剧情状态        private List<StoryDialogCfg> _stepListToRead;        private StoryDialogCfg _currentStepCfg;        private string _nextStepId;        private string[] _wordList;        private int _wordIndex = 0;        private bool _isShowLetters;        private string _currentWords;        private string _stroyStartID;        //屏幕效果中        private Action<object> _onScreenEffectComplete;        public override void Dispose()        {            base.Dispose();            if (_sceneObject != null)            {                GameObject.Destroy(_sceneObject);                _sceneObject = null;            }            _dressUpObjUI?.Dispose();            _dressUpObjUI = null;            _wordTextField = null;            _arrow = null;            _isShowLetters = false;            SceneController.DestroyObjectFromView(_npcHead, _npcWrapper);            _onScreenEffectComplete = null;            Timers.inst.Remove(UpdateLetters);            if (_ui != null)            {                _ui.Dispose();                _ui = null;            }        }        protected override void Init()        {            base.Init();            packageName = UI_StoryDialogUI.PACKAGE_NAME;            _ui = UI_StoryDialogUI.Create();            viewCom = _ui.target;            isfullScreen = true;            _scenePrefab = GFGAsset.Load<GameObject>(ResPathUtil.GetPrefabPath("SceneStoryDialog"));        }        protected override void OnInit()        {            base.OnInit();            _ui.m_dialogText.target.visible = false;            _ui.m_dialogName.target.visible = false;            _ui.m_dialogHead.target.visible = false;            _ui.m_list.visible = false;            _ui.m_btnNext.width = GRoot.inst.width;            _ui.m_btnNext.height = GRoot.inst.height;            _ui.m_btnNext.AddRelation(GRoot.inst, RelationType.Size);            _ui.m_btnBack.onClick.Add(OnClickBtnBack);            _ui.m_btnNext.onClick.Add(OnClickBtnNext);            _ui.m_btnLookBack.onClick.Add(OnClickBtnLookBack);            _ui.m_btnSkip.onClick.Add(OnBtnSkip);            _ui.m_list.onClickItem.Add(OnClickListItem);            _ui.m_btnSpeedUp.onClick.Add(OnClickBtnSpeedUp);            _ui.m_btnAutoPlay.onClick.Add(OnClickBtnAutoPlay);        }        protected override void OnShown()        {            base.OnShown();            if (_sceneObject == null)            {                _sceneObject = GameObject.Instantiate(_scenePrefab);            }            if (_dressUpObjUI == null)            {                _dressUpObjUI = new DressUpObjUI();            }            _speedAutoPlay = FightDataManager.Instance.dialogSpeed;            _autoPlay = false;            UpdateSpeedUpBtn();            _dialogListLookBack = new List<string>();            object[] datas = viewData as object[];            _stroyStartID = (string)datas[0];            bool skipable = (bool)datas[1];            _onCompleteStoryDialogCall = (OnCompleteStoryDialogCall)datas[2];            if (datas.Length > 3)            {                _onCompleteStoryDialogCallParam = datas[3];            }            //            // StoryChapterCfg chapterCfg0 = StoryChapterCfgArray.Instance.GetCfg(MainStoryDataManager.currentChapterCfgId);            // List<StoryLevelCfg> storyLevelCfg0 = StoryLevelCfgArray.Instance.GetCfgsBytypeAndsubTypeAndchapterId(chapterCfg0.type, chapterCfg0.subType, chapterCfg0.id);            StoryChapterCfg chapterCfg = StoryChapterCfgArray.Instance.GetCfg(MainStoryDataManager.currentChapterCfgId);            StoryLevelCfg storyLevelCfg = chapterCfg == null ? null : StoryLevelCfgArray.Instance.GetCfgsBytypeAndsubTypeAndchapterId(chapterCfg.type, chapterCfg.subType, chapterCfg.id)[0];            if (LauncherConfig.netType == LauncherConfig.EnumNetType.TEMP && chapterCfg != null && storyLevelCfg != null && MainStoryDataManager.currentChapterCfgId == 10001 && storyLevelCfg.order == 1 && !InstanceZonesDataManager.CheckLevelPass(storyLevelCfg.id))            {                // 临时设置都可以跳过对话                skipable = false;            }            else            {                skipable = true;            }            _ui.m_btnSkip.visible = skipable;            ShowNextStep(_stroyStartID);            _ui.m_c1.selectedIndex = 0;            _ui.m_btnAutoPlay.selected = false;            if (_stroyStartID == MainStoryDataManager.priorId)            {                _ui.m_c1.selectedIndex = 1;                // _ui.m_btnAutoPlay.selected = true;                OnClickBtnAutoPlay();                _speedAutoPlay = 1;                FightDataManager.Instance.dialogSpeed = _speedAutoPlay;            }            if (!InstanceZonesDataManager.CheckLevelPass(100001001)) _ui.m_btnBack.visible = false;        }        protected override void OnHide()        {            base.OnHide();            Timers.inst.Remove(UpdateLetters);            Timers.inst.Remove(UpdateShake);            Timers.inst.Remove(OnScreenEffectComplete);            Timers.inst.Remove(ShowNextWords);            ScreenBlackController.Instance.HideBlack();            StopAutoPlay();            if (_sceneObject != null)            {                GameObject.Destroy(_sceneObject);                _sceneObject = null;            }            MusicManager.Instance.Play(ResPathUtil.GetMusicPath(ConstMusicName.DEFAULT));            _onCompleteStoryDialogCall = null;            _onCompleteStoryDialogCallParam = null;        }        private void OnClickBtnBack()        {            // this.Hide();            ViewManager.GoBackFrom(typeof(StoryDialogView).FullName);            // Over(false);        }        private void OnClickBtnNext()        {            // StopAutoPlay();            if (_onScreenEffectComplete != null)            {                Timers.inst.Remove(OnScreenEffectComplete);                _onScreenEffectComplete.Invoke(null);            }            else            {                ShowNextWords();            }        }        private void OnClickBtnLookBack()        {            if (_ui.m_btnSkip.enabled)            {                ViewManager.Show(ViewName.STORY_LOOK_BACK_VIEW, _stroyStartID);            }            else            {                ViewManager.Show(ViewName.STORY_LOOK_BACK_VIEW, _dialogListLookBack);            }        }        private void OnBtnSkip()        {            Over(true);        }        private void OnClickListItem(EventContext context)        {            UI_ListDialogItem dialogItem = UI_ListDialogItem.Proxy(context.data as GObject);            _dialogListLookBack.Add(dialogItem.m_txtContent.text);            string stepID = (string)dialogItem.target.data;            if (stepID == null)            {                stepID = "0";            }            UI_ListDialogItem.ProxyEnd();            OnStepComplete(stepID);        }        private void OnClickBtnSpeedUp()        {            //如果没有自动播放先开始自动播放            if (!_autoPlay)            {                _ui.m_btnAutoPlay.selected = true;                OnClickBtnAutoPlay();            }            _speedAutoPlay = _speedAutoPlay * 2;            if (_speedAutoPlay > GameConst.MAX_SPEED_AUTO_PLAY)            {                _speedAutoPlay = 1;            }            FightDataManager.Instance.dialogSpeed = _speedAutoPlay;            UpdateSpeedUpBtn();        }        private void OnClickBtnAutoPlay()        {            _autoPlay = _ui.m_btnAutoPlay.selected;            if (_autoPlay)            {                ShowNextWords();            }        }        private void InitStepListById(string dialogID)        {            var temp = StoryDialogCfgArray.Instance.GetCfgsByid(dialogID);            _stepListToRead = new List<StoryDialogCfg>(temp);        }        private void ShowNextStep(string nextStepId)        {            if (nextStepId != null)            {                InitStepListById(nextStepId);            }            if (_stepListToRead != null && _stepListToRead.Count > 0)            {                StoryDialogCfg storyDialogCfg = (StoryDialogCfg)_stepListToRead[0];                _stepListToRead.RemoveAt(0);                InitStepContent(storyDialogCfg);            }            else            {                Over();            }        }        private void OnStepComplete(string nextStepId = null)        {            _nextStepId = nextStepId;            _ui.m_dialogText.target.visible = false;            _ui.m_dialogName.target.visible = false;            _ui.m_dialogHead.target.visible = false;            float delay = 0;            //屏幕效果            if (_currentStepCfg != null)            {                if (_currentStepCfg.blackScreenDur > 0)                {                    delay = _currentStepCfg.blackScreenDur;                    ScreenBlackController.Instance.ShowBlack(delay, this.viewCom, 0);                }                else if (_currentStepCfg.blankScreenDur > 0)                {                    delay = _currentStepCfg.blankScreenDur;                    UpdatePic("0");                }            }            if (delay > 0)            {                //转换成秒                delay = delay / 1000f;                _onScreenEffectComplete = OnScreenEffectComplete;                Timers.inst.Add(delay, 1, OnScreenEffectComplete);            }            else            {                OnScreenEffectComplete();            }        }        private void OnScreenEffectComplete(object param = null)        {            _onScreenEffectComplete = null;            if (_nextStepId == "0")            {                Over();            }            else            {                ShowNextStep(_nextStepId);            }        }        private void InitStepContent(StoryDialogCfg storyDialogCfg)        {            _currentStepCfg = storyDialogCfg;            UpdateMusic(storyDialogCfg.musicRes);            UpdateBg(storyDialogCfg.bgRes);            UpdatePic(storyDialogCfg.picRes);            PlayEffect(storyDialogCfg.effectInfoArr);            PlayShake(storyDialogCfg.shakeInfoArr);            string content = storyDialogCfg.content;            content = storyDialogCfg.content.Replace("self", RoleDataManager.roleName);            if (content.IndexOf("//") >= 0)            {                showList(content);            }            else            {                ShowDialog(storyDialogCfg);            }        }        private void showList(string content)        {            StopAutoPlay();            _ui.m_btnAutoPlay.enabled = false;            _wordTextField = null;            _ui.m_dialogText.target.visible = false;            _ui.m_dialogName.target.visible = false;            _ui.m_dialogHead.target.visible = false;            _ui.m_list.visible = true;            _ui.m_list.RemoveChildrenToPool();            string[] list = Regex.Split(content, "//");            _ui.m_list.itemRenderer = (int index, GObject item) =>            {                string itemInfo = list[index];                string[] itemInfoList = Regex.Split(itemInfo, "=");                UI_ListDialogItem dialogItem = UI_ListDialogItem.Proxy(item);                dialogItem.m_txtContent.text = itemInfoList[0];                dialogItem.target.data = itemInfoList.Length > 1 ? itemInfoList[1] : null;                UI_ListDialogItem.ProxyEnd();            };            _ui.m_list.numItems = list.Length;        }        private void ShowDialog(StoryDialogCfg storyDialogCfg)        {            _ui.m_btnAutoPlay.enabled = true;            _ui.m_list.visible = false;            var content = storyDialogCfg.content.Replace("self", RoleDataManager.roleName);            string words = content;            string roleName = storyDialogCfg.name;            string headRes = storyDialogCfg.head;            string headAniRes = storyDialogCfg.headAni;            if (roleName == "self")            {                roleName = RoleDataManager.roleName;            }            //回顾            if (roleName != null)            {                _dialogListLookBack.Add("[color=#FDA2B1]" + roleName + "[/color]");            }            if (!string.IsNullOrEmpty(headAniRes) || storyDialogCfg.suitId > 0)            {                //显示对话框半身像                _ui.m_dialogText.target.visible = false;                _ui.m_dialogName.target.visible = false;                _ui.m_dialogHead.target.visible = true;                _ui.m_dialogHead.m_txtName.text = roleName;                _ui.m_dialogHead.m_comphead.m_head.visible = false;                _ui.m_dialogHead.m_comphead.m_holder.visible = true;                var headAniCfg = HeadAniCfgArray.Instance.GetCfg(headAniRes);                if (headAniCfg != null && !string.IsNullOrEmpty(headAniCfg.headAni))                {                    //独立动画                    _ui.m_dialogHead.m_compDressUp.target.visible = false;                    _ui.m_dialogHead.m_comphead.target.visible = true;                    string resPath = ResPathUtil.GetViewEffectPath("ui_nzbq", headAniCfg.headAni);                    SceneController.AddObjectToView(null, _npcWrapper, _ui.m_dialogHead.m_comphead.m_holder, resPath, out _npcHead, out _npcWrapper);                }                else                {                    //换装                    _ui.m_dialogHead.m_compDressUp.target.visible = true;                    _ui.m_dialogHead.m_comphead.target.visible = false;                    _dressUpObjUI.ResetSceneObj(80, true, false, null, false);                    if (storyDialogCfg.suitId > 0)                    {                        _dressUpObjUI.dressUpObj.PutOnSuitCfg(storyDialogCfg.suitId, false, new int[] { ConstDressUpItemType.BEI_JING }, false, false);                    }                    else                    {                        _dressUpObjUI.dressUpObj.PutOnDressUpData(CustomSuitDataManager.GetCurrentSuitData().dressUpData);                        if (_dressUpObjUI.dressUpObj.actionId > 0)                        {                            _dressUpObjUI.dressUpObj.CancelAction(true);                        }                    }                    if (headAniCfg != null && headAniCfg.faceId > 0)                    {                        //表情                        _dressUpObjUI.dressUpObj.AddOrRemove(headAniCfg.faceId, false);                        _dressUpObjUI.UpdateWrapper(_ui.m_dialogHead.m_compDressUp.m_holder);                    }                }                _wordTextField = _ui.m_dialogHead.m_txtContent;                _arrow = _ui.m_dialogHead.m_iconNext;            }            else if (!string.IsNullOrEmpty(headRes))            {                _ui.m_dialogText.target.visible = false;                _ui.m_dialogName.target.visible = false;                _ui.m_dialogHead.target.visible = true;                _ui.m_dialogHead.m_txtName.text = roleName;                _ui.m_dialogHead.m_comphead.m_head.visible = true;                _ui.m_dialogHead.m_comphead.m_holder.visible = false;                _ui.m_dialogHead.m_comphead.m_head.url = ResPathUtil.GetNpcHeadPath(headRes);                _wordTextField = _ui.m_dialogHead.m_txtContent;                _arrow = _ui.m_dialogHead.m_iconNext;            }            else if (!string.IsNullOrEmpty(roleName))            {                _ui.m_dialogText.target.visible = false;                _ui.m_dialogName.target.visible = true;                _ui.m_dialogHead.target.visible = false;                _ui.m_dialogName.m_txtName.text = roleName;                _wordTextField = _ui.m_dialogName.m_txtContent;                _arrow = _ui.m_dialogName.m_iconNext;            }            else            {                _ui.m_dialogText.target.visible = true;                _ui.m_dialogName.target.visible = false;                _ui.m_dialogHead.target.visible = false;                _wordTextField = _ui.m_dialogText.m_txtContent;                _arrow = _ui.m_dialogText.m_iconNext;            }            _wordList = Regex.Split(words, "&&");            _wordIndex = 0;            ShowNextDialog();        }        private void ShowNextDialog()        {            if (_wordList != null && _wordList.Length > _wordIndex)            {                string itemInfo = _wordList[_wordIndex];                string[] itemInfoList = Regex.Split(itemInfo, "=");                _currentWords = itemInfoList[0];                if (itemInfoList.Length > 1)                {                    _wordTextField.data = itemInfoList[1];                }                else                {                    _wordTextField.data = null;                }                StartShowLetters();            }            else            {                OnStepComplete();            }        }        private void ShowCurrentWords()        {            _arrow.target.visible = true;            Timers.inst.Remove(UpdateLetters);            _wordTextField.text = _currentWords;            _dialogListLookBack.Add(_currentWords);            _isShowLetters = false;            _wordIndex++;            if (_autoPlay)            {                Timers.inst.Add(GameConst.NEXT_WORDS_INTERVAL_MAX / _speedAutoPlay, 1, ShowNextWords);            }        }        private void ShowNextWords(object param = null)        {            if (_wordTextField != null)            {                if (_isShowLetters)                {                    ShowCurrentWords();                }                else                {                    string stepID = (string)_wordTextField.data;                    if (stepID != null)                    {                        OnStepComplete(stepID);                    }                    else                    {                        ShowNextDialog();                    }                }            }        }        private void StartShowLetters()        {            _isShowLetters = true;            _arrow.target.visible = false;            _wordTextField.verticalAlign = VertAlignType.Top;            _wordTextField.text = "";            ArrayList letters = StoryUtil.GetLettersList(_currentWords);            Timers.inst.Add(GameConst.LETTERS_INTERVAL_MAX / _speedAutoPlay, 0, UpdateLetters, letters);        }        private void UpdateLetters(object param)        {            ArrayList letters = (ArrayList)param;            if (letters == null || letters.Count <= 0)            {                ShowCurrentWords();            }            else            {                string letter = (string)letters[0];                letters.RemoveAt(0);                _wordTextField.text = _wordTextField.text + letter;            }        }        private void UpdateBg(string value)        {            if (value.Length > 0)            {                SceneController.UpdateDialogBg(value, _sceneObject);            }        }        private void UpdatePic(string value)        {            if (value.Length > 0)            {                SceneController.UpdateDialogPic(value, _sceneObject);            }        }        private void UpdateMusic(string value)        {            if (value.Length > 0)            {                if (value == "0")                {                    MusicManager.Instance.Stop();                }                else                {                    MusicManager.Instance.Play(ResPathUtil.GetMusicPath(value, "mp3"));                }            }        }        private void PlayEffect(string[] infos)        {        }        private void PlayShake(int[] shakeInfoArr)        {            if (shakeInfoArr != null && shakeInfoArr.Length > 0)            {                Vector3 position = _sceneObject.transform.position;                position.x = (float)shakeInfoArr[0] / GameConst.PIXELS_PER_UNITY_UNIT;                position.y = (float)shakeInfoArr[1] / GameConst.PIXELS_PER_UNITY_UNIT;                _sceneObject.transform.position = position;                float attenuationX = (float)shakeInfoArr[2] / GameConst.PIXELS_PER_UNITY_UNIT;                float attenuationY = (float)shakeInfoArr[3] / GameConst.PIXELS_PER_UNITY_UNIT;                float interval = (float)shakeInfoArr[4] / 1000;                float duration = (float)shakeInfoArr[5] / 1000;                int repeat = Mathf.RoundToInt(duration / interval);                Timers.inst.Add(interval, 0, UpdateShake, new float[] { attenuationX, attenuationY });            }        }        private void UpdateShake(object param)        {            float[] attenuations = param as float[];            float attenuationX = attenuations[0];            float attenuationY = attenuations[1];            Vector3 position = _sceneObject.transform.position;            bool done = false;            bool doneX = false;            float absX = Mathf.Abs(position.x);            if (absX > attenuationX)            {                int dir = (int)(position.x / absX);                position.x = Mathf.Abs(position.x) - attenuationX;                position.x *= -1 * dir;            }            else            {                doneX = true;                position.x = 0;            }            bool doneY = false;            float absY = Mathf.Abs(position.y);            if (absY > attenuationY)            {                int dir = (int)(position.y / absY);                position.y = Mathf.Abs(position.y) - attenuationY;                position.y *= -1 * dir;            }            else            {                doneY = true;                position.y = 0;            }            done = doneX && doneY;            _sceneObject.transform.position = position;            if (done)            {                Timers.inst.Remove(UpdateShake);            }        }        private void Over(bool isSkip = false)        {            if (_onCompleteStoryDialogCall != null)            {                _onCompleteStoryDialogCall(isSkip, _onCompleteStoryDialogCallParam);            }        }        private void UpdateSpeedUpBtn()        {            if (_speedAutoPlay > 1)            {                _ui.m_btnSpeedUp.text = "x" + _speedAutoPlay;            }            else            {                _ui.m_btnSpeedUp.text = "";            }        }        private void StopAutoPlay()        {            _autoPlay = false;            _ui.m_btnAutoPlay.selected = false;            Timers.inst.Remove(ShowNextWords);        }    }}
 |