using FairyGUI; using UnityEngine; using UI.Main; using System.Collections; using System.Collections.Generic; using System.Text.RegularExpressions; using System; using YooAsset; using GFGGame.Launcher; using UnityEngine.UI; using System.Threading.Tasks; 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 _animObject; private EffectUI _effectUI1; private EffectUI _effect; private DressUpObj _dressUpObj; private GameObject _dressUpSceneObj; private GameObject _selfHeadImgObj; private GTextField _wordTextField; //剧情完成回调 private OnCompleteStoryDialogCall _onCompleteStoryDialogCall; private object _onCompleteStoryDialogCallParam; //回顾 private List _dialogListLookBack; //自动播放 private int _speedAutoPlay = 1; private bool _autoPlay = false; //剧情状态 private List _stepListToRead; private StoryDialogCfg _currentStepCfg; private string _nextStepId; private string[] _wordList; private int _wordIndex = 0; private bool _isShowLetters; private bool _canClickBtnNext; private string _currentWords; private string _storyStartID; private string lastTextFieldType; // 上一段文本框的类型 private bool IsTeaParty; //是否是茶话会里的对话 private bool _work; // 对话系统运行状态,true:正常运行; false:停止运行 TypingFadeEffectPro _typingEffect; //屏幕效果中 private Action _onScreenEffectComplete; public override void Dispose() { if (_sceneObject != null) { PrefabManager.Instance.Restore(_sceneObject); _sceneObject = null; } if(_animObject != null) { PrefabManager.Instance.Restore(_animObject); _animObject = null; } _wordTextField = null; _arrow = null; _isShowLetters = false; EffectUIPool.Recycle(_effectUI1); _effectUI1 = null; EffectUIPool.Recycle(_effect); _effect = null; _onScreenEffectComplete = null; _typingEffect = null; if (_ui != null) { _ui.Dispose(); _ui = null; } base.Dispose(); } protected override void OnInit() { base.OnInit(); packageName = UI_StoryDialogUI.PACKAGE_NAME; _ui = UI_StoryDialogUI.Create(); viewCom = _ui.target; isfullScreen = true; isReturnView = true; _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_mask1.height = (GRoot.inst.height - 1920) / 2; _ui.m_mask2.height = (GRoot.inst.height - 1920) / 2; _ui.m_mask1.y = -ViewGlobal.GetRealTopOffset(); _ui.m_mask2.y = GRoot.inst.height - _ui.m_mask2.height - ViewGlobal.GetRealTopOffset(); _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(); // 初始化 _work = true; MusicManager.Instance.Stop(); MusicManager.Instance.SetVolume(0); _ui.m_hideAnimMask.Play(); if (_sceneObject == null) { _sceneObject = PrefabManager.Instance.InstantiateSync(ResPathUtil.GetPrefabPath("SceneStoryDialog")); } if (_dressUpObj == null) { _dressUpObj = new DressUpObj(); } CreateHeadImg(); _speedAutoPlay = FightDataManager.Instance.dialogSpeed; lastTextFieldType = ""; UpdateSpeedUpBtn(); _dialogListLookBack = new List(); object[] datas = viewData as object[]; _storyStartID = (string)datas[0]; bool skipable = (bool)datas[1]; _onCompleteStoryDialogCall = (OnCompleteStoryDialogCall)datas[2]; if (datas.Length > 3) { _onCompleteStoryDialogCallParam = datas[3]; } IsTeaParty = (bool)datas[4]; _autoPlay = _lastStartAutoPlay; //修改需求,所有关卡打开跳过(第一关除外) skipable = true; if (MainStoryDataManager.currentLevelCfgId == 100001001 && !InstanceZonesDataManager.CheckLevelPass(MainStoryDataManager.currentLevelCfgId)) { skipable = false; } _ui.m_btnSkip.visible = skipable; _ui.m_c1.selectedIndex = 0; if (_storyStartID == MainStoryDataManager.priorId) { _ui.m_c1.selectedIndex = 1; OnClickBtnAutoPlay(); _speedAutoPlay = 1; FightDataManager.Instance.dialogSpeed = _speedAutoPlay; } // 茶会修改参数 if (IsTeaParty) { _autoPlay = true; _ui.m_c1.selectedIndex = 2; _speedAutoPlay = 1; } _ui.m_btnAutoPlay.selected = _autoPlay; _ui.m_btnBack.visible = InstanceZonesDataManager.CheckLevelPass(100001001); StoryDialogDataManager.Instance.Clear(); InitStepListById(_storyStartID); // 检查资源的初始化 Timers.inst.StartCoroutine(CheckResLoad()); } private bool _lastStartAutoPlay = false; protected override void OnHide() { base.OnHide(); _work = false; Timers.inst.Remove(UpdateShake); Timers.inst.Remove(OnScreenEffectComplete); Timers.inst.Remove(OnWait); ScreenBlackController.Instance.HideBlack(); // 不是茶话会,则记录上一次自动播放按钮的状态 if (!IsTeaParty) { _lastStartAutoPlay = _autoPlay; } StopAutoPlay(); VoiceManager.Instance.StopVoice(); if (_sceneObject != null) { PrefabManager.Instance.Restore(_sceneObject); _sceneObject = null; } if (_animObject != null) { PrefabManager.Instance.Restore(_animObject); _animObject = null; } EffectUIPool.Recycle(_effect); _effect = null; _dressUpObj.TakeOffAll(); MusicManager.Instance.PlayCroutine(ResPathUtil.GetMusicPath(ConstMusicName.DEFAULT)); _onCompleteStoryDialogCall = null; _onCompleteStoryDialogCallParam = null; StoryDialogDataManager.Instance.Clear(); GuideController.TryCompleteGuide(ConstGuideId.ENTER_CHAPTER_5, 3); DestroyHeadImg(); } protected override void TryCompleteGuide() { base.TryCompleteGuide(); GuideController.TryCompleteGuide(ConstGuideId.ENTER_CHAPTER_5, 3); } private void OnClickBtnBack() { Over(false); } private void OnClickBtnNext() { if (!_canClickBtnNext || IsTeaParty) { return; } StopAutoPlay(); if (_onScreenEffectComplete != null) { Timers.inst.Remove(OnScreenEffectComplete); _onScreenEffectComplete.Invoke(null); } else { ShowNextWords(); } } private void OnClickBtnLookBack() { StopAutoPlay(); if (_ui.m_btnSkip.visible) { ViewManager.Show(_storyStartID); } else { ViewManager.Show(_dialogListLookBack); } } private void OnBtnSkip() { _work = false; 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(); //if (_speedAutoPlay > 1) //{ // VoiceManager.Instance.StopVoice(); //} } 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(temp); } private void ShowNextStep(string nextStepId) { if (!_work) { return; } if (nextStepId != null) { InitStepListById(nextStepId); } if (_stepListToRead != null && _stepListToRead.Count > 0) { StoryDialogCfg storyDialogCfg = (StoryDialogCfg)_stepListToRead[0]; _stepListToRead.RemoveAt(0); Timers.inst.StartCoroutine(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; bool isWait = false; //屏幕效果 if (_currentStepCfg != null) { if (_currentStepCfg.blackScreenDur > 0) { delay = _currentStepCfg.blackScreenDur; ScreenBlackController.Instance.ShowBlack(delay, this.viewCom, 0); } if (_currentStepCfg.blankScreenDur > 0) { isWait = true; delay = _currentStepCfg.blankScreenDur; UpdatePic("0"); } } if (delay > 0 && !isWait) { //转换成秒 delay = delay / 1000f; _onScreenEffectComplete = OnScreenEffectComplete; Timers.inst.Add(delay, 1, OnScreenEffectComplete); StoryDialogDataManager.Instance.dialogShowDelay = 0.6f; } else if (isWait) { float waitTime = delay / 1000f; _canClickBtnNext = false; Timers.inst.Add(waitTime, 1, OnWait); if (_autoPlay) { //转换成秒 delay = delay / 1000f; _onScreenEffectComplete = OnScreenEffectComplete; Timers.inst.Add(delay, 1, OnScreenEffectComplete); StoryDialogDataManager.Instance.dialogShowDelay = 0.6f; } else if(_currentStepCfg.effectInfoArr.Length > 0) { delay = delay / 1000f; _onScreenEffectComplete = OnScreenEffectComplete; Timers.inst.Add(delay, 1, OnScreenEffectComplete); StoryDialogDataManager.Instance.dialogShowDelay = 0.6f; } else { _onScreenEffectComplete = OnScreenEffectComplete; StoryDialogDataManager.Instance.dialogShowDelay = 0.6f; } } else { OnScreenEffectComplete(); } } private void OnWait(object param = null) { _canClickBtnNext = true; Timers.inst.Remove(OnWait); } private void OnScreenEffectComplete(object param = null) { _onScreenEffectComplete = null; if (_nextStepId == "0") { Over(); } else { ShowNextStep(_nextStepId); } } private IEnumerator InitStepContent(StoryDialogCfg storyDialogCfg) { if (!_work) { yield break; } _canClickBtnNext = false; StoryDialogDataManager.Instance.waitPicFade = false; _ui.m_hide.Play(); // 隐藏遮罩 HideAllDialogUI(); // Init resource _currentStepCfg = storyDialogCfg; UpdateMusic(storyDialogCfg.musicRes); UpdateBg(storyDialogCfg.bgRes); UpdatePic(storyDialogCfg.picRes, storyDialogCfg.faceRes, storyDialogCfg.emojiRes); UpdateAnim(storyDialogCfg.aniRes); UpdateRoleObj(storyDialogCfg.name); PlayEffect(storyDialogCfg.effectInfoArr); PlayShake(storyDialogCfg.shakeInfoArr); string content = storyDialogCfg.content; content = storyDialogCfg.content.Replace("self", RoleDataManager.roleName); while (StoryDialogDataManager.Instance.waitBgChange) { //Debug.Log("等待背景转换"); yield return new WaitForEndOfFrame(); } if(StoryDialogDataManager.Instance.dialogShowDelay > 0) { yield return new WaitForSeconds(StoryDialogDataManager.Instance.dialogShowDelay); StoryDialogDataManager.Instance.dialogShowDelay = 0f; } _canClickBtnNext = true; if (content.IndexOf("//") >= 0) { ShowList(content); } else { Timers.inst.StartCoroutine(ShowDialog(storyDialogCfg)); } } private void ShowList(string content) { StopAutoPlay(); _ui.m_btnAutoPlay.enabled = false; _wordTextField = null; _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 HideAllDialogUI() { _ui.m_dialogText.target.visible = false; _ui.m_dialogName.target.visible = false; _ui.m_dialogHead.target.visible = false; _ui.m_list.visible = false; } /// /// 初始化对话框/语音/CG等 /// /// /// private IEnumerator ShowDialog(StoryDialogCfg storyDialogCfg) { if (!_work) { yield break; } if (storyDialogCfg.showChangeName == 1 && StorageDataManager.Instance.GetStorageValue(ConstStorageId.CHANGE_NAME) == 0) { GameController.ShowCreateRole(); StoryDialogDataManager.Instance.waiting = true; while (StoryDialogDataManager.Instance.waiting) { yield return new WaitForEndOfFrame(); } //if (_autoPlay) //{ // _ui.m_btnAutoPlay.selected = false; // OnClickBtnAutoPlay(); //} } _ui.m_loaMask.url = ResPathUtil.GetSceneBgPath(storyDialogCfg.maskRes); _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; string[] effectInfo = storyDialogCfg.effectInfoArr; VoiceManager.Instance.StopVoice(); // 如果没开倍速才加载语音 if(_speedAutoPlay == 1 || !_autoPlay) { // 如果配置了语音,读取语音 VoiceManager.Instance.LoadRes(ResPathUtil.GetVoicePath(storyDialogCfg.voiceRes)); } _wordList = Regex.Split(words, "&&"); // 有对话 if (_wordList.Length > 0 && !_wordList[0].Equals("")) { if (roleName == "self") { roleName = RoleDataManager.roleName; } //回顾 if (roleName != null) { _dialogListLookBack.Add("[color=#FDA2B1]" + roleName + "[/color]"); } if (!string.IsNullOrEmpty(headAniRes) || storyDialogCfg.suitId > 0) { //显示对话框半身像 _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; _ui.m_dialogHead.m_txtContent.text = ""; 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; _effectUI1 = EffectUIPool.CreateEffectUI(_ui.m_dialogHead.m_comphead.m_holder, "ui_nzbq", headAniCfg.headAni); } else { //换装 _ui.m_dialogHead.m_comphead.target.visible = false; //_dressUpObjUI.ResetSceneObj(80, true, false, sceneObject.transform.Find("Scene").gameObject, false); GRoot.inst.touchable = false; _dressUpObj.setSceneObj(_dressUpSceneObj, false, false, null, false, ChangeHeadImgLayer); if (storyDialogCfg.suitId > 0) { _dressUpObj.PutOnSuitCfg(storyDialogCfg.suitId, false, new int[] { ConstDressUpItemType.SHOU_CHI_WU }, false, false); } else { _dressUpObj.PutOnDressUpData(CustomSuitDataManager.GetCurrentSuitData().dressUpData, new int[] { ConstDressUpItemType.SHOU_CHI_WU }); if (_dressUpObj.actionId > 0) { _dressUpObj.CancelAction(true, new int[] { ConstDressUpItemType.SHOU_CHI_WU }); } } if (headAniCfg != null && headAniCfg.faceId > 0) { //表情 _dressUpObj.AddOrRemove(headAniCfg.faceId, true); } _ui.m_dialogHead.m_compDressUp.target.visible = true; } _ui.m_dialogHead.target.visible = true; _wordTextField = _ui.m_dialogHead.m_txtContent; _arrow = _ui.m_dialogHead.m_iconNext; lastTextFieldType = "head"; } else if (!string.IsNullOrEmpty(headRes)) { _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; lastTextFieldType = "head"; } else if (!string.IsNullOrEmpty(roleName)) { _ui.m_dialogName.target.visible = true; if (IsTeaParty) { var roleContainerList = LeagueDataManager.Instance.RoleContainerList; var teapartyRoleCfg = TeapartyRoleCfgArray.Instance.GetCfgsByid(LeagueDataManager.Instance.TeaPartyId); int roleIndex = Convert.ToInt32(roleName); _ui.m_dialogName.m_txtName.text = teapartyRoleCfg[roleIndex - 1].name; _ui.m_dialogName.m_bgType.selectedIndex = 1; _ui.m_dialogName.m_showArrow.selectedIndex = 1; if (roleIndex <= roleContainerList.Count && roleContainerList[roleIndex - 1].MaxScoreRoleName != null && roleContainerList[roleIndex - 1].MaxScoreRoleName != "" && _ui.m_dialogName.m_txtName.text != "") { _ui.m_comPlayName.visible = true; _ui.m_txtPlayName.text = roleContainerList[roleIndex - 1].MaxScoreRoleName; if (_ui.m_txtPlayName.text == RoleDataManager.roleName) _ui.m_dialogName.m_bgType.selectedIndex = 0; } else _ui.m_comPlayName.visible = false; } else { _ui.m_dialogName.m_bgType.selectedIndex = 0; _ui.m_dialogName.m_showArrow.selectedIndex = 0; _ui.m_dialogName.m_txtName.text = roleName; } _wordTextField = _ui.m_dialogName.m_txtContent; _arrow = _ui.m_dialogName.m_iconNext; if (!lastTextFieldType.Equals("name")) { lastTextFieldType = "name"; StoryDialogDataManager.Instance.waiting = true; _ui.m_t0.Play(() => { StoryDialogDataManager.Instance.waiting = false; }); } } else { if (IsTeaParty) _ui.m_dialogText.m_showArrow.selectedIndex = 1; else _ui.m_dialogText.m_showArrow.selectedIndex = 0; _ui.m_dialogText.target.visible = true; _wordTextField = _ui.m_dialogText.m_txtContent; _arrow = _ui.m_dialogText.m_iconNext; lastTextFieldType = "text"; _ui.m_comPlayName.visible = false; } _wordIndex = 0; _typingEffect = new TypingFadeEffectPro(_wordTextField); _typingEffect.typeFinishedAction = ShowCurrentWords; ShowNextDialog(); } else { OnStepComplete(); //if (effectInfo.Length > 0) //{ // // 等待CG播放完毕直接进入下一段 // Timers.inst.StartCoroutine(WaitCGAnimFinish(effectInfo[0], int.Parse(effectInfo[1]))); //} //// 播放效果等 //else //{ // OnStepComplete(); //} } } /// /// 延迟显示头像,防止换装异步加载/换表情 未完成时显示了头像 /// private async void ShowSelfHeadImg() { _ui.m_dialogHead.m_compDressUp.target.visible = false; await Task.Delay(80); _ui.m_dialogHead.m_compDressUp.target.visible = true; } 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; } Timers.inst.StartCoroutine(StartShowLetters()); } else { OnStepComplete(); } } private void ShowCurrentWords() { //_arrow.target.visible = true; //Timers.inst.Remove(UpdateLetters); StopTyping(); _typingEffect?.Cancel(); _wordTextField.text = _currentWords; _dialogListLookBack.Add(_currentWords); _isShowLetters = false; _wordIndex++; if (_autoPlay) { float interval = Mathf.Max(VoiceManager.Instance.GetClipRemainingLength(), GameConst.NEXT_WORDS_INTERVAL_MAX / _speedAutoPlay); Timers.inst.Add(interval, 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 IEnumerator StartShowLetters() { _isShowLetters = true; _arrow.target.visible = false; _wordTextField.verticalAlign = VertAlignType.Top; _wordTextField.text = ""; _canClickBtnNext = false; while (StoryDialogDataManager.Instance.waitPicFade || StoryDialogDataManager.Instance.waiting) { //Debug.Log("等待立绘/动画结束"); yield return new WaitForEndOfFrame(); } _canClickBtnNext = true; _wordTextField.text = _currentWords; StartTyping(); } /// /// 开启打字机显示 /// private void StartTyping() { _typingEffect.SetSpeed(_speedAutoPlay); _typingEffect.Start(); // 如果配置了语音,则播放语音 VoiceManager.Instance.PlayVoice(); } private void StopTyping() { _typingEffect.Cancel(); } private void UpdateBg(string value) { if (value.Length > 0) { SceneController.UpdateDialogBg(value, _sceneObject); } } private void UpdatePic(string value, string faceValue = "", string emojiValue = "") { if (IsTeaParty) { return; } if (value.Length > 0) { SceneController.UpdateDialogPic(value, _sceneObject); } if (faceValue.Length > 0) { SceneController.InitPicFace(faceValue, _sceneObject); } if (emojiValue.Length > 0) { UpdateLiveEmoji(emojiValue); } } private void UpdateLiveEmoji(string EmojiRes) { if (EmojiRes.Length > 0 && !IsTeaParty) { SceneController.UpdateEmojiAni(EmojiRes, ref _animObject); } } private void UpdateAnim(string value) { if (value.Length > 0 && !IsTeaParty) { if (value == "0") { //SceneController.ControlBgVisible(_sceneObject, true); _ui.m_hideAnimMask.Play(); SceneController.UpdateDialogAnim(value, ref _animObject); } // 播放动画 else { SceneController.UpdateDialogAnim(value, ref _animObject); _animObject.SetActive(false); _canClickBtnNext = false; _ui.m_showMask.Play(() => { //_canClickBtnNext = true; if (_animObject != null) { _ui.m_hideMask.Play(); _ui.m_showAnimMask.Play(); _animObject.SetActive(true); } //SceneController.ControlBgVisible(_sceneObject, false); }); } } } private void UpdateRoleObj(string value) { if (IsTeaParty) { var roleContainerList = LeagueDataManager.Instance.RoleContainerList; MyDressUpHelper.dressUpObj.setSceneObj(_sceneObject, false, false); for (int i = 0; i < roleContainerList.Count; i++) { if (value == (i + 1).ToString() && roleContainerList[i].EquipIds.Count > 0) { MyDressUpHelper.dressUpObj.PutOnItemList(roleContainerList[i].EquipIds); return; } } MyDressUpHelper.dressUpObj.PutOnDefaultDressUpData(IsTeaParty); } } private void UpdateMusic(string value) { if (value.Length > 0) { if (value == "0") { MusicManager.Instance.Stop(); } else { MusicManager.Instance.PlayCroutine(ResPathUtil.GetMusicPath(value, "mp3"), false, 0.1f); } } } private void PlayEffect(string[] value) { if (value.Length > 0) { if (value[0] == "0") { EffectUIPool.Recycle(_effect); _effect = null; } else { EffectUIPool.Recycle(_effect); _effect = null; string effectPath = string.Format("ui_Juqing/{0}", value[0]); _effect = EffectUIPool.CreateEffectUI(_ui.m_effect, effectPath, value[0]); _ui.m_effect.visible = true; } } } 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 done = true) { if (_onCompleteStoryDialogCall != null) { _onCompleteStoryDialogCall(done, _onCompleteStoryDialogCallParam); } this.Hide(); } private void UpdateSpeedUpBtn() { if (_speedAutoPlay > 1) { _ui.m_btnSpeedUp.text = "x" + _speedAutoPlay; } else { _ui.m_btnSpeedUp.text = ""; } _typingEffect?.SetSpeed(_speedAutoPlay); } private void StopAutoPlay() { _autoPlay = false; _ui.m_btnAutoPlay.selected = false; Timers.inst.Remove(ShowNextWords); } private IEnumerator WaitCGAnimFinish(string resName, int times = 1) { GameObject cg = PrefabManager.Instance.InstantiateSync("test"); Animator animator = cg.GetComponentInChildren(); AnimatorStateInfo info = animator.GetCurrentAnimatorStateInfo(0); yield return new WaitForSeconds(info.length * times); //while (info.normalizedTime < 0.95) //{ // info = animator.GetCurrentAnimatorStateInfo(0); // yield return new WaitForSeconds(0.1f); //} PrefabManager.Instance.Restore(cg); OnStepComplete(); } /// /// 检查资源加载是否完成 /// private IEnumerator CheckResLoad() { List resList = new List(); for (int i = 0; i < _stepListToRead.Count; i++) { StoryDialogCfg cfg = _stepListToRead[i]; if (cfg.bgRes.Length > 0 && cfg.bgRes != "0") { string bgRes = ResPathUtil.GetSceneBgPath(cfg.bgRes); if (!resList.Contains(bgRes)) { resList.Add(bgRes); } } if (cfg.aniRes.Length > 0 && cfg.aniRes != "0") { string res = cfg.aniRes.Split('/')[1]; string aniRes = ResPathUtil.GetStoryDialogCGPath(cfg.aniRes, res); if (!resList.Contains(aniRes)) { resList.Add(aniRes); } } if (cfg.emojiRes.Length > 0 && cfg.emojiRes != "0") { string EmojiPath = string.Format("DressUp/{0}", cfg.emojiRes); string aniRes = ResPathUtil.GetEmojiResPath(EmojiPath, cfg.emojiRes); if (!resList.Contains(aniRes)) { resList.Add(aniRes); } } } ResourceDownloaderOperation downloaderOperation = YooAssets.CreateBundleDownloader(resList.ToArray(), 3, 3); if (downloaderOperation.TotalDownloadCount == 0) { ShowNextStep(_storyStartID); yield break; } // 开始加载资源 ViewManager.Show(); LoadingView.Instance.SetDesc("正在加载剧情资源..."); downloaderOperation.OnDownloadErrorCallback = (fileName, error) => { Debug.LogError($"加载{fileName}失败 {error}"); }; downloaderOperation.OnDownloadProgressCallback = (totalDownloadCount, currentDownloadCount, totalDownloadSizeBytes, currentDownloadSizeBytes) => { string currentSizeMB = (currentDownloadSizeBytes / 1048576f).ToString("f1"); string totalSizeMB = (totalDownloadSizeBytes / 1048576f).ToString("f1"); var progress = (float)currentDownloadSizeBytes / totalDownloadSizeBytes; //LauncherView.Instance.SetDesc($"正在下载资源,{currentDownloadCount}/{totalDownloadCount}", $"{currentSizeMB}MB/{totalSizeMB}MB", true); LoadingView.Instance.SetProgress((int)(progress * 100)); }; downloaderOperation.BeginDownload(); yield return downloaderOperation; // 检测下载结果 if (downloaderOperation.Status != EOperationStatus.Succeed) { Alert.Show("下载失败!请检查网络状态后重试。") .SetLeftButton(true, "返回", (data) => { ViewManager.Hide(); Hide(); }); yield break; } // 加载完成 LoadingView.Instance.SetProgress(100, () => { ViewManager.Hide(); ShowNextStep(_storyStartID); } ); } private RenderTexture renderTexure; private void CreateHeadImg() { // 创建render texture renderTexure = new RenderTexture(550, 760, 24); // 换装父节点 + 相机 _dressUpSceneObj = PrefabManager.Instance.InstantiateSync(ResPathUtil.GetPrefabPath("StoryDialogSelfImg/StoryDialogDressUpObj")); Camera camera = _dressUpSceneObj.transform.Find("Camera").GetComponent(); camera.targetTexture = renderTexure; // 创建RawImg _selfHeadImgObj = PrefabManager.Instance.InstantiateSync(ResPathUtil.GetPrefabPath("StoryDialogSelfImg/Canvas")); RawImage rawImage = _selfHeadImgObj.transform.Find("mask/RawImage").GetComponent(); rawImage.texture = renderTexure; // 将RawImg放在FGUI上 GoWrapper goWrapper = new GoWrapper(_selfHeadImgObj); _ui.m_dialogHead.m_compDressUp.m_holder.SetNativeObject(goWrapper); } private void DestroyHeadImg() { // 清空render Texture Camera camera = _dressUpSceneObj.transform.Find("Camera").GetComponent(); camera.targetTexture = null; RawImage rawImage = _selfHeadImgObj.transform.Find("mask/RawImage").GetComponent(); rawImage.texture = null; renderTexure.Release(); renderTexure = null; // 回收人物 _dressUpObj?.Dispose(); _dressUpObj = null; // 回收RawImage if (_selfHeadImgObj != null) { PrefabManager.Instance.Restore(_selfHeadImgObj); _selfHeadImgObj = null; } // 回收相机预制 if (_dressUpSceneObj != null) { PrefabManager.Instance.Restore(_dressUpSceneObj); _dressUpSceneObj = null; } } /// /// 修改主角头像组件层级 /// private void ChangeHeadImgLayer() { if(_dressUpSceneObj == null) { return; } Transform parent = _dressUpSceneObj.transform.Find("Role"); // HeadImg的层级:6 ChangeLayer(parent, 6); GRoot.inst.touchable = true; } private void ChangeLayer(Transform transform, int layer) { if(transform == null) { return; } if (transform.childCount > 0) { for (int i = 0; i < transform.childCount; i++) { ChangeLayer(transform.GetChild(i), layer); } transform.gameObject.layer = layer; } else { transform.gameObject.layer = layer; } } } }