You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			182 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			182 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
| using System.Collections.Generic;
 | |
| using FairyGUI;
 | |
| using Game.Battle;
 | |
| using Articy.Unity;
 | |
| using Articy.Touhou;
 | |
| using Articy.Unity.Interfaces;
 | |
| 
 | |
| namespace Game
 | |
| {
 | |
|     public class PageCombo : UIPageBase<ViewCombo>
 | |
|     {
 | |
|         private Dictionary<string, List<string>> _skillCombo = new Dictionary<string, List<string>>();
 | |
|         private Dictionary<string, int> _skill2Index = new Dictionary<string, int>();
 | |
|         private Dictionary<int, string> _index2Skill = new Dictionary<int, string>();
 | |
|         public PageCombo()
 | |
|         {
 | |
|         }
 | |
|         protected override void OnCreate()
 | |
|         {
 | |
|             CreateUI(false);
 | |
|             InitComboTree();
 | |
|             InitComboList();
 | |
|         }
 | |
|         private void InitComboTree()
 | |
|         {
 | |
|             var comboTree = Util.GetConfig(GameConst.ComboTree);
 | |
|             var queue = new Queue<ArticyObject>();
 | |
|             var firstPins = (comboTree as IInputPinsOwner).GetInputPins();
 | |
|             foreach (var pin in firstPins)
 | |
|             {
 | |
|                 var firstConns = pin.GetOutgoingConnections();
 | |
|                 foreach (var conn in firstConns)
 | |
|                 {
 | |
|                     queue.Enqueue(conn.Target);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             var frontNode = new Dictionary<string, string>();
 | |
|             var comboFrag = new Dictionary<string, List<string>>();
 | |
|             int countMax = 1000;
 | |
|             while (queue.Count > 0)
 | |
|             {
 | |
|                 if (countMax-- <= 0)
 | |
|                 {
 | |
|                     break;
 | |
|                 }
 | |
|                 var nodeNow = queue.Dequeue() as DialogueFragment;
 | |
|                 var key = nodeNow.TechnicalName;
 | |
|                 var speaker = nodeNow.Speaker;
 | |
|                 var comboStr = nodeNow.MenuText;
 | |
|                 if (!comboFrag.ContainsKey(key))
 | |
|                 {
 | |
|                     var comboList = new List<string>(comboStr.Split(' '));
 | |
|                     if (frontNode.ContainsKey(key))
 | |
|                     {
 | |
|                         var preCombo = comboFrag[frontNode[key]];
 | |
|                         comboList.InsertRange(0, preCombo);
 | |
|                     }
 | |
|                     comboFrag[key] = comboList;
 | |
|                 }
 | |
|                 var nextPins = (nodeNow as IOutputPinsOwner).GetOutputPins();
 | |
|                 foreach (var pin in nextPins)
 | |
|                 {
 | |
|                     var nextConns = pin.GetOutgoingConnections();
 | |
|                     foreach (var conn in nextConns)
 | |
|                     {
 | |
|                         var nextKey = conn.Target.TechnicalName;
 | |
|                         if (frontNode.ContainsKey(nextKey))
 | |
|                         {
 | |
|                             continue;
 | |
|                         }
 | |
|                         frontNode[nextKey] = key;
 | |
|                         queue.Enqueue(conn.Target);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             foreach (var combo in comboFrag)
 | |
|             {
 | |
|                 var frag = Util.GetConfig(combo.Key) as DialogueFragment;
 | |
|                 var skill = frag.Speaker as SkillMaster;
 | |
|                 if (skill == null)
 | |
|                 {
 | |
|                     continue;
 | |
|                 }
 | |
|                 _skillCombo[skill.TechnicalName] = combo.Value;
 | |
|             }
 | |
| 
 | |
|         }
 | |
|         private void InitComboList()
 | |
|         {
 | |
|             View.m_ComboList.m_ComboList.RemoveChildrenToPool();
 | |
|             var i = 0;
 | |
|             foreach (var skillItem in _skillCombo)
 | |
|             {
 | |
|                 _skill2Index[skillItem.Key] = i;
 | |
|                 _index2Skill[i] = skillItem.Key;
 | |
|                 i++;
 | |
| 
 | |
|             }
 | |
|             View.m_ComboList.m_ComboList.SetVirtualAndLoop();
 | |
|             View.m_ComboList.m_ComboList.itemRenderer = (int index, GObject obj) =>
 | |
|             {
 | |
|                 var key = _index2Skill[index];
 | |
|                 var comboItem = obj as ViewComboItem;
 | |
|                 var skill = Util.GetSkillMasterConfig(key);
 | |
|                 var skillName = skill.Skill.Name;
 | |
|                 comboItem.m_SkillName.text = skillName;
 | |
|                 comboItem.m_CastCount.text = $"{index}";
 | |
|                 comboItem.m_ComboList.RemoveChildrenToPool();
 | |
|                 foreach (var item in _skillCombo[key])
 | |
|                 {
 | |
|                     if (string.IsNullOrEmpty(item))
 | |
|                     {
 | |
|                         continue;
 | |
|                     }
 | |
|                     var comboKey = comboItem.m_ComboList.AddItemFromPool() as ViewComboKey;
 | |
|                     if (item == "*")
 | |
|                     {
 | |
|                         comboKey.m_c2.selectedIndex = 1;
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         comboKey.m_c2.selectedIndex = 0;
 | |
|                         var text = item;
 | |
|                         if (text.StartsWith("↑"))
 | |
|                         {
 | |
|                             text = text.Substring(1);
 | |
|                             comboKey.m_c1.selectedIndex = 1;
 | |
|                         }
 | |
|                         else if (text.StartsWith("↓"))
 | |
|                         {
 | |
|                             text = text.Substring(1);
 | |
|                             comboKey.m_c1.selectedIndex = 2;
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             comboKey.m_c1.selectedIndex = 0;
 | |
|                         }
 | |
|                         comboKey.m_key.text = text;
 | |
|                     }
 | |
| 
 | |
|                 }
 | |
|             };
 | |
|             View.m_ComboList.m_ComboList.numItems = _skillCombo.Count;
 | |
|         }
 | |
|         protected override void OnCreateBind()
 | |
|         {
 | |
|             var master = Util.GetMaster();
 | |
|             BindSkill(master);         //绑定技能
 | |
|         }
 | |
|         private void BindSkill(GameEntity entity)
 | |
|         {
 | |
|             var skill = entity.skill;
 | |
|             BindData(skill.SkillId, (_, now) =>
 | |
|             {
 | |
|                 if (string.IsNullOrEmpty(now))
 | |
|                 {
 | |
|                     return;
 | |
|                 }
 | |
|                 if (_skill2Index.ContainsKey(now))
 | |
|                 {
 | |
|                     var count = _skillCombo.Count;
 | |
|                     var targetIndex = (_skill2Index[now] - 2 + count) % count;
 | |
|                     View.m_ComboList.m_ComboList.ScrollToView(targetIndex, true, true);
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
|         protected override void OnDestroy()
 | |
|         {
 | |
|         }
 | |
|         protected override void OnOpen()
 | |
|         {
 | |
|         }
 | |
|         protected override void OnClose()
 | |
|         {
 | |
|         }
 | |
|         public override void Update()
 | |
|         {
 | |
| 
 | |
|         }
 | |
|     }
 | |
| } |