using UnityEngine; using Game.Common; namespace Game { public class PageDrama : UIPageBase { private string _nameLeft = ""; private string _nameRight = ""; private const float ShowCharWaitTimeMax = 0.02f; private float _showCharWaitTime; private int _textNumNow; private int _textNumMax; private string _textNow = ""; private int _choiceNow = 0; private int _choiceMax = 0; private bool _isChoiceOpen = false; public PageDrama() { } protected override void OnCreate() { CreateUI(true); } protected override void OnDestroy() { } protected override void OnOpen() { EventManager.Instance.AddEvent(EEvent.Dialog, OnDialog); EventManager.Instance.AddEvent(EEvent.DialogChoice, OnDialogChoice); EventManager.Instance.AddEvent(EEvent.DialogEnd, OnDialogEnd); Util.SetControl(false); } protected override void OnClose() { EventManager.Instance.RemoveEvent(EEvent.Dialog, OnDialog); EventManager.Instance.RemoveEvent(EEvent.DialogChoice, OnDialogChoice); EventManager.Instance.RemoveEvent(EEvent.DialogEnd, OnDialogEnd); Util.SetControl(true); View.m_c1.selectedIndex = 0; View.m_c4.selectedIndex = 0; View.m_c2.selectedIndex = 0; View.m_c3.selectedIndex = 0; View.m_c5.selectedIndex = 0; _isChoiceOpen = false; _choiceMax = 0; _choiceNow = 0; _nameLeft = ""; _nameRight = ""; ShowText(""); } public override void Update() { if (_textNumNow == _textNumMax) { View.m_content.m_c1.selectedIndex = 1; return; } if (_showCharWaitTime > 0) { _showCharWaitTime -= Time.deltaTime; return; } _textNumNow++; _showCharWaitTime = ShowCharWaitTimeMax; View.m_content.m_text.text = _textNow.Substring(0, _textNumNow); } private void ShowText(string text) { _textNow = text; _showCharWaitTime = 0; _textNumMax = text.Length; _textNumNow = 0; View.m_content.m_c1.selectedIndex = 0; } private void RefreshChoiceOpen() { View.m_c4.selectedIndex = _isChoiceOpen ? 0 : 1; View.m_c6.selectedIndex = _isChoiceOpen ? 0 : 1; View.m_c5.selectedIndex = _isChoiceOpen ? 1 : 0; } private void RefreshChoiceSelecet() { var choiceList = View.m_choice.GetChildren(); for (int i = 0; i < choiceList.Length; i++) { var choice = choiceList[i] as ViewDramaChoiceItem; choice.m_c1.selectedIndex = i == _choiceNow ? 1 : 0; } } private void OnDialogChoice(PDialogChoice param) { var choiceList = View.m_choice; choiceList.RemoveChildrenToPool(); _choiceMax = param.Choices.Count; _choiceNow = 0; _isChoiceOpen = false; foreach (var item in param.Choices) { var choiceItem = choiceList.AddItemFromPool() as ViewDramaChoiceItem; choiceItem.m_text.text = item; } RefreshChoiceSelecet(); } private void OnDialog(PDialog param) { var isRight = false; var needRefresh = false; var name = param.Name; //优先检测已经存在的 if (_nameLeft == name) { isRight = false; } else if (_nameRight == name) { isRight = true; } else { needRefresh = true; //检测空位置 if (string.IsNullOrEmpty(_nameLeft)) { isRight = false; } else if (string.IsNullOrEmpty(_nameRight)) { isRight = true; } else { //没有空位置 占左边位置 isRight = false; } } if (isRight) { _nameRight = name; } else { _nameLeft = name; } var hasLeft = !string.IsNullOrEmpty(_nameLeft); var hasRight = !string.IsNullOrEmpty(_nameRight); //左右 View.m_c1.selectedIndex = isRight ? 2 : 1; //显隐 View.m_c4.selectedIndex = 1; View.m_c2.selectedIndex = hasLeft ? 1 : 0; View.m_c3.selectedIndex = hasRight ? 1 : 0; //刷新文本 View.m_nameLable.m_text.text = param.Name; ShowText(param.Content); //刷新立绘 if (needRefresh) { if (isRight) { View.m_picRight.texture = Texture(param.Pic); } else { View.m_picLeft.texture = Texture(param.Pic); } } } private void OnDialogEnd() { UIManager.Instance.Close(); } protected override void OnInput(PPlayerInput context) { if (context.Action == EKeyActionType.Press) { if (context.Key == EFunctionKey.Menu) { Util.EndDrama(); } if (context.Key == EFunctionKey.Up || context.Key == EFunctionKey.Down) { if (!_isChoiceOpen) { return; } var newIndex = _choiceNow; if (context.Key == EFunctionKey.Up) { newIndex--; } else { newIndex++; } _choiceNow = (newIndex + _choiceMax) % _choiceMax; RefreshChoiceSelecet(); } if (context.Key == EFunctionKey.Jump) { if (_choiceMax != 0) { //选择 if (!_isChoiceOpen) { _isChoiceOpen = true; RefreshChoiceOpen(); var c1Index = View.m_c1.selectedIndex; if (c1Index != 0) { View.m_c1.selectedIndex = c1Index == 1 ? 2 : 1; } } else { _choiceMax = 0; _isChoiceOpen = false; RefreshChoiceOpen(); Util.NextDramaChoice(_choiceNow); } } else { //播放 if (_textNumMax != _textNumNow) { _textNumNow = _textNumMax - 1; _showCharWaitTime = 0; } else { Util.NextDrama(); } } } if (context.Key == EFunctionKey.Bag) { UIManager.Instance.Close(); } } } } }