NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/SelectSkillPanelController.cs

473 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UIElements;
using Button = UnityEngine.UI.Button;
using Image = UnityEngine.UI.Image;
using Toggle = UnityEngine.UI.Toggle;
using ScrollView = PhxhSDK.PhxhScrollView;
using Constants = Framework.Constants;
using Framework;
using PhxhSDK;
using Gameplay;
using System;
using Gameplay.Net;
using cfg.ActorCfg;
using cfg.SkillCfg;
using cfg.PlayerSkillCfg;
using Cysharp.Threading.Tasks;
public class SelectSkillPanelController : UIWindow
{
//UI GameObj
///Auto Gen Start///
public Image Image_Cover;
public Image Image_BG;
public Image Image_LeftBG;
public Image Image_RightBG;
public TMP_Text Text_SkillTitle;
public TMP_Text Text_SkillCollingTime;
public TMP_Text Text_Describe;
public Button Button_Close;
public TMP_Text Text_CMDSkill;
public Button Button_ConductTitle;
public Button Button_AttackTitle;
public Button Button_SupportTitle;
public Button Button_Cancel;
public TMP_Text Text_Cancel;
public Button Button_Confirm;
public TMP_Text Text_Confirm;
///Auto Gen End///
/// <summary>
/// 动态列表
/// </summary>
private RecycleView recycleView;
/// <summary>
/// 滑动列表
/// </summary>
private ScrollRect scrollRect;
/// <summary>
/// 高斯模糊遮罩
/// </summary>
private RawImage rawImageGaussianBlurMask;
private Team CurTeam;
private int CurIndex;
// deal with input data
public override void PreLoad(object data = null)
{
var initData = data as InitData;
selectSkillAction = initData.SelectSkill;
CurTeam = initData.Team;
CurIndex = initData.Index;
}
class InitData
{
public Team Team;
public int Index;
public Action<int, int> SelectSkill;
public InitData(Team team, int index, Action<int, int> selectSkill)
{
Team = team;
Index = index;
SelectSkill = selectSkill;
}
}
public static async UniTask<UIWindow> Open(Team team, int index, Action<int, int> selectSkill = null)
{
CommonUtils.CaptureScreenshot();
var initData = new InitData(team, index, selectSkill);
return await UIManager.Instance.CreateAndOpenWindow(UINameConst.UI_SelectSkillPanel, initData);
}
// Use this for initialization
public override void OnInit()
{
//bind UI GameObj
SelectSkillPanelBinder.GetComponents(this);
recycleView = GetComponent<RecycleView>("Image_BG/ScrollView");
scrollRect = recycleView.transform.GetComponent<ScrollRect>();
rawImageGaussianBlurMask = GetComponent<RawImage>("GaussianBlurMask");
rawImageGaussianBlurMask.texture = CommonUtils.GetScreenTexture2D();
BindButton(Button_Cancel, OnClose);
BindButton(Button_Confirm, OnConfirm);
BindButton(Button_Close, OnClose);
listTab.Add(new TabItem(FindObj("Image_BG/Button_ConductTitle"), PlayerSkillType.Conduct, OnSelectTab));
listTab.Add(new TabItem(FindObj("Image_BG/Button_AttackTitle"), PlayerSkillType.Attack, OnSelectTab));
listTab.Add(new TabItem(FindObj("Image_BG/Button_SupportTitle"), PlayerSkillType.Support, OnSelectTab));
#region 获取已经解锁的指挥官技能养成数据
foreach (int skillId in Actor.Instance.PlayerSkill.GetSkillIds())
{
int skillLevel = Actor.Instance.PlayerSkill.GetLevel(skillId);
DataPlayerSkillUpgrade skillUpgradeData = TableManager.Instance.Tables.PlayerSkillUpgrade.Get(skillId, skillLevel);
if (null == skillUpgradeData)
continue;
if (dicSkillUpgradeData.TryGetValue(skillUpgradeData.SkillType, out List<DataPlayerSkillUpgrade> listSkillData))
listSkillData.Add(skillUpgradeData);
else
dicSkillUpgradeData[skillUpgradeData.SkillType] = new List<DataPlayerSkillUpgrade>() { skillUpgradeData };
}
#endregion
recycleView.Init(RefreshItem);
SetInfo(CurTeam, CurIndex);
}
//invoke when open window
protected override void OnShowWindow(object data = null)
{
}
//invoke when reload window
protected override void OnReloadWindow(object data = null)
{
}
//invoke when close window
protected override void OnHideWindow()
{
}
//invoke when destroy
public override void OnRelease()
{
base.OnRelease();
}
/// <summary>
/// 页签
/// </summary>
private class TabItem : UIGameObjectWrapper
{
#region UI
/// <summary>
/// 选中状态
/// </summary>
private GameObject goSelect;
/// <summary>
/// 页签文本
/// </summary>
private TMP_Text text;
/// <summary>
/// 页签按钮
/// </summary>
private Button buttonSelect;
#endregion
/// <summary>
/// 选中的字体颜色
/// </summary>
private readonly Color SELECT_FONT_COLOR = Color.black;
/// <summary>
/// 未选中的字体颜色
/// </summary>
private readonly Color NORMAL_FONT_COLOR = Color.white;
/// <summary>
/// 玩家技能类型
/// </summary>
private readonly PlayerSkillType playerSkillType;
/// <summary>
/// 选中回调
/// </summary>
private readonly Action<PlayerSkillType> selectAction;
/// <summary>
/// 是否选中
/// </summary>
public bool IsSelect
{
set
{
goSelect.IsScaleShow(value);
if (value)
text.color = SELECT_FONT_COLOR;
else
text.color = NORMAL_FONT_COLOR;
}
}
/// <summary>
/// 技能类型
/// </summary>
public PlayerSkillType SkillType
{
get { return playerSkillType; }
}
public TabItem(GameObject root, PlayerSkillType playerSkillType, Action<PlayerSkillType> selectAction) : base(root, true)
{
this.playerSkillType = playerSkillType;
this.selectAction = selectAction;
goSelect = FindObj("ImageSelect");
text = GetComponent<TMP_Text>("Text");
buttonSelect = GoRoot.GetComponent<Button>();
CommonUtils.BindButton(buttonSelect, OnClick);
}
/// <summary>
/// 选中页签
/// </summary>
private void OnClick()
{
selectAction?.Invoke(playerSkillType);
}
}
/// <summary>
/// 技能
/// </summary>
private class SkillItem : UIGameObjectWrapper
{
/// <summary>
/// 选中状态
/// </summary>
private GameObject goSelect;
private Button buttonSkill;
private DataPlayerSkill skillData;
private DataPlayerSkillUpgrade playerSkillData;
/// <summary>
/// 点击回调
/// </summary>
private readonly Action<int> clickAction;
/// <summary>
/// 是否选中
/// </summary>
public bool IsSelect
{
set { goSelect.IsScaleShow(value); }
}
public DataPlayerSkill SkillData
{
get { return skillData; }
}
public DataPlayerSkillUpgrade PlayerSkillData
{
get { return playerSkillData; }
}
public SkillItem(GameObject root, Action<int> clickAction) : base(root)
{
this.clickAction = clickAction;
goSelect = FindObj("ImageChooseRect");
buttonSkill = GetComponent<Button>("ButtonSkillLogoS");
CommonUtils.BindButton(buttonSkill, OnClick);
}
public void SetInfo(DataPlayerSkillUpgrade skillUpgradeData)
{
playerSkillData = skillUpgradeData;
skillData = TableManager.Instance.Tables.PlayerSkillConfig.Get(playerSkillData.SkillID);
IsScaleShow = true;
}
private void OnClick()
{
clickAction?.Invoke(playerSkillData.ID);
}
}
/// <summary>
/// 页签列表
/// </summary>
private readonly List<TabItem> listTab = new(4);
/// <summary>
/// 实例id对应玩家技能UI列表字典
/// </summary>
private readonly Dictionary<int, SkillItem> dicSkillItem = new();
/// <summary>
/// 玩家技能类型对应玩家技能列表字典
/// </summary>
private readonly Dictionary<PlayerSkillType, List<DataPlayerSkillUpgrade>> dicSkillUpgradeData = new();
/// <summary>
/// 当前选中页签类型
/// </summary>
private PlayerSkillType curSelectTab;
/// <summary>
/// 当前选中技能id
/// </summary>
private int curSelectSkillID;
/// <summary>
/// 选择技能回调
/// </summary>
private Action<int, int> selectSkillAction;
/// <summary>
/// 当前队伍技能索引
/// </summary>
private int curIndex;
public void SetInfo(Team team, int skillIndex)
{
curIndex = skillIndex;
uint[] skillIds = team.GetPlayerSkillIDs();
curSelectSkillID = (int)skillIds[skillIndex];
if (CommandSkillManager.IsIdValid(curSelectSkillID))
{
DataPlayerSkillUpgrade skillUpgradeData = TableManager.Instance.Tables.PlayerSkillUpgrade.Get(curSelectSkillID, 0);
if (skillUpgradeData == null)
{
DebugUtil.LogError($"获取配置失败id:{curSelectSkillID}");
curSelectSkillID = 0;
}
else
OnSelectTab(skillUpgradeData.SkillType);
}
else
{
List<DataPlayerSkillUpgrade> listCurSkillData = GetSkillDatasByTab(PlayerSkillType.Conduct);
if (listCurSkillData == null || listCurSkillData.Count < 1)
{
DebugUtil.LogError("指挥官技能数据错误");
return;
}
curSelectSkillID = listCurSkillData[0].ID;
OnSelectTab(PlayerSkillType.Conduct); // 默认选中指挥系
}
//IsScaleShow = true;
}
/// <summary>
/// 无限列表刷新单个项
/// </summary>
/// <param name="index"></param>
/// <param name="itemTransform"></param>
private void RefreshItem(GameObject cell, int index)
{
if (!dicSkillItem.TryGetValue(cell.GetInstanceID(), out SkillItem skillItem))
{
skillItem = new SkillItem(cell, OnSelectSkill);
dicSkillItem[cell.GetInstanceID()] = skillItem;
}
List<DataPlayerSkillUpgrade> listPlayerSkillData = GetSkillDatasByTab(curSelectTab);
if (listPlayerSkillData == null)
return;
if (listPlayerSkillData.Count < 0 || index >= listPlayerSkillData.Count)
{
DebugUtil.LogWarning("索引错误");
return;
}
skillItem.SetInfo(listPlayerSkillData[index]);
if (skillItem.PlayerSkillData.ID == curSelectSkillID)
OnSelectSkill(curSelectSkillID);
else
skillItem.IsSelect = false;
}
/// <summary>
/// 获取页签对应所有技能数据
/// </summary>
/// <returns></returns>
private List<DataPlayerSkillUpgrade> GetSkillDatasByTab(PlayerSkillType playerSkillType)
{
dicSkillUpgradeData.TryGetValue(playerSkillType, out List<DataPlayerSkillUpgrade> listData);
return listData;
}
/// <summary>
/// 获取动态列表需要显示的数量
/// </summary>
/// <returns></returns>
private int GetRecycleListShowCount()
{
List<DataPlayerSkillUpgrade> listSkillData = GetSkillDatasByTab(curSelectTab);
if (listSkillData == null)
return 0;
else
return listSkillData.Count;
}
#region 按钮回调方法
/// <summary>
/// 选中页签
/// </summary>
private void OnSelectTab(PlayerSkillType playerSkillType)
{
curSelectTab = playerSkillType;
foreach (TabItem tabItem in listTab)
{
tabItem.IsSelect = tabItem.SkillType == curSelectTab;
}
recycleView.ShowList(GetRecycleListShowCount());
}
/// <summary>
/// 选中技能
/// </summary>
private void OnSelectSkill(int skillId)
{
foreach (SkillItem skillItem in dicSkillItem.Values)
{
if (skillItem.PlayerSkillData.ID == skillId)
{
skillItem.IsSelect = true;
Text_SkillTitle.text = CommonUtils.GetLocalizeText(CommonUtils.GetLocalizeText(E_LocalizePrefix.PlayerSkill, skillItem.SkillData.ID));
Text_Describe.text = CommonUtils.GetLocalizeText(CommonUtils.GetLocalizeText(E_LocalizePrefix.PlayerSkillDesc, skillItem.SkillData.ID));
Text_SkillCollingTime.text = string.Format(CommonUtils.GetLocalizeText("TeamAndSkill_SkillCD"),
null == skillItem.SkillData ? 0f : skillItem.SkillData.CDTime); // 冷却时间:{0}s
}
else
skillItem.IsSelect = false;
}
AudioManager.Instance.PlayAudio(Framework.Constants.Sound.COMMON_CLICK);
}
/// <summary>
/// 关闭
/// </summary>
private void OnClose()
{
//AudioManager.Instance.PlayAudio(Constants.Sound.COMMON_BACK);
//IsScaleShow = false;
CloseWindow();
}
/// <summary>
/// 确定
/// </summary>
private void OnConfirm()
{
AudioManager.Instance.PlayAudio(Constants.Sound.COMMON_CLAIM);
selectSkillAction?.Invoke(curIndex, curSelectSkillID);
OnClose();
}
#endregion
}