using System; using System.Collections; using System.Collections.Generic; using Unity.Collections; using UnityEngine; using UnityEngine.Serialization; public class TeamManager : MonoBehaviour { public static TeamManager Instance {get; private set;} public teamSettingPanel teamSettingPanelInstance; /// /// 当前玩家存档下的所有编队配置,key为编队索引,value为该编队的角色列表,表内只有角色ID /// public Dictionary currentTeamSettings = new Dictionary(); /// /// 玩家存档下已经解锁的角色信息列表 /// public List SelectableCharacterList = new List(); /// /// 根据此字段来在编队信息页显示已有编队 /// public int currentSelectedTeam = 0; /// /// 记录被选中的编队中角色的索引,用于处理队列位置交换的逻辑。-1表示无角色被选中 /// public int currentSelectedTeamCharacter = -1; /// /// 标记要被放入编队的角色 /// public CharacterView currentSelectedCharacterCard = null; /// /// 在修改被选中的编队中角色的索引时触发 /// public event Action OnSelectedCharacterChanged; /// /// 修改选定的预设队伍时触发 /// public event Action OnSelectedTeamChanged; void Awake() { if (Instance == null) { Instance = this; } else { Destroy(gameObject); } } void testTeamSetting() { SelectableCharacterList.Add(new CharacterView(1001001,"C")); SelectableCharacterList.Add(new CharacterView(1001002,"S")); //手动向currentTeamSettings和SelectableCharacterList添加测试数据 currentTeamSettings.Add(0,new TeamSetting(new List(),1001001)); currentTeamSettings[0].teamIdList.Add(new CharacterView(1001001,"C")); currentTeamSettings[0].teamIdList.Add(new CharacterView(1001002,"S")); currentTeamSettings[0].teamIdList.Add(new CharacterView(1001001,"C")); currentTeamSettings[0].teamIdList.Add( new CharacterView(1001002,"C")); currentTeamSettings[0].teamIdList.Add(new CharacterView(0,null)); currentTeamSettings.Add(1,new TeamSetting(new List(),1001002)); currentTeamSettings[1].teamIdList.Add(new CharacterView(1001001,"C")); currentTeamSettings[1].teamIdList.Add(new CharacterView(1001002,"B")); currentTeamSettings[1].teamIdList.Add(new CharacterView(1001001,"C")); currentTeamSettings[1].teamIdList.Add( new CharacterView(1001002,"A")); currentTeamSettings[1].teamIdList.Add(new CharacterView(1001002,"A")); //在当前版本中,就算是空队伍也要用如下填满,请等待数据结构的重构 currentTeamSettings.Add(2,new TeamSetting(new List(),-1)); currentTeamSettings[2].teamIdList.Add(new CharacterView(0,null)); currentTeamSettings[2].teamIdList.Add(new CharacterView(0,null)); currentTeamSettings[2].teamIdList.Add(new CharacterView(0,null)); currentTeamSettings[2].teamIdList.Add( new CharacterView(0,null)); currentTeamSettings[2].teamIdList.Add(new CharacterView(0,null)); currentTeamSettings.Add(3,new TeamSetting(new List(),-1)); currentTeamSettings[3].teamIdList.Add(new CharacterView(0,null)); currentTeamSettings[3].teamIdList.Add(new CharacterView(0,null)); currentTeamSettings[3].teamIdList.Add(new CharacterView(0,null)); currentTeamSettings[3].teamIdList.Add( new CharacterView(0,null)); currentTeamSettings[3].teamIdList.Add(new CharacterView(0,null)); Debug.Log("testTeamSetting ready"); } public void openTeamSettingPanel()=> teamSettingPanelInstance.gameObject.SetActive(true); public void closeTeamSettingPanel()=> teamSettingPanelInstance.gameObject.SetActive(false); public void setCurrentSelectedTeam(int index) { if (index > 3 || index < 0) { Debug.LogWarning("所选队伍预设索引超出范围"); return; } currentSelectedTeam = index; } void Start() { // if(teamSettingPanelInstance == null) // { // teamSettingPanelInstance = teamSettingPanel.Instance; // } testTeamSetting();//接入玩家存档后请注释掉此行 } void saveTeamSetting() { //todo:我想,在接存档系统的时候这个会有用。 } /// /// 读取玩家存档信息后可直接在此写入编队信息 /// /// public void setcurrentTeamSettings(Dictionary playerTeamSettings) { currentTeamSettings = playerTeamSettings; } /// /// 依据选定的队伍预设索引来获得队伍信息 /// /// public TeamSetting getCurrentSelectedTeam() { return currentTeamSettings[currentSelectedTeam]; } public void setCurrentSelectedTeam(TeamSetting newTeamData, int teamIndex) { currentTeamSettings[teamIndex] = newTeamData; } public void setCurrentSelectedCharacterInTeam(int characterIndex) { if (characterIndex != currentSelectedTeamCharacter) { Debug.Log($"修改选中对象从{currentSelectedTeamCharacter}到{characterIndex}"); currentSelectedTeamCharacter = characterIndex; OnSelectedCharacterChanged?.Invoke(); // 触发事件 } } public void setCurrentSelectedTeamSetting(int teamIndex) { if(teamIndex != currentSelectedTeam) { Debug.Log($"修改选中队伍预设从{currentSelectedTeam}到{teamIndex}"); currentSelectedTeam = teamIndex; OnSelectedTeamChanged?.Invoke(); // 触发事件 } } /// /// 交换指定索引中的两个队伍中元素的位置 /// /// 当前元素 /// 目标元素位置 public void swapTeamElements(int firstIndex, int secondIndex) { List newCurrentTeam = getCurrentSelectedTeam().teamIdList; CharacterView temp = newCurrentTeam[firstIndex]; newCurrentTeam[firstIndex] = newCurrentTeam[secondIndex]; newCurrentTeam[secondIndex] = temp; currentTeamSettings[currentSelectedTeam].teamIdList = newCurrentTeam; teamSettingPanelInstance.updateTeamSettingElements(); setCurrentSelectedCharacterInTeam(secondIndex); } public void setTeamLeader(int characterID) { Debug.Log($"{characterID},{SelectableCharacterList.Count}"); currentTeamSettings[currentSelectedTeam].LeaderId=characterID; teamSettingPanelInstance.updateTeamSettingElements(); } /// /// 填入或者覆盖队伍指定位置的信息 /// /// public void ResetTeamCharacter (int aimListIndex) { //如果在队伍中已有角色的情况下再次触发此方法,首先要去掉旧信息,再放新信息 CharacterView newCharacter = currentSelectedCharacterCard; List newCurrentTeam = getCurrentSelectedTeam().teamIdList; if (aimListIndex > 0 || aimListIndex < newCurrentTeam.Count) { for(int i=0;i /// 移除队伍中的指定角色 /// /// public void removeTeamCharacter(int characterId) { currentSelectedCharacterCard = null; List newCurrentTeam = getCurrentSelectedTeam().teamIdList; foreach (CharacterView character in newCurrentTeam) { if (character.characterId == characterId) { character.characterId = 0; character.currentBoundaryLevel = null; } } currentTeamSettings[currentSelectedTeam].teamIdList = newCurrentTeam; teamSettingPanelInstance.updateTeamSettingElements(); } }