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

506 lines
17 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 cfg.ActorCfg;
using cfg.LevelCfg;
using Cysharp.Threading.Tasks;
using Framework;
using Gameplay;
using Gameplay.Common;
using Gameplay.Level;
using PhxhSDK;
using System;
using System.Collections.Generic;
using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using Button = UnityEngine.UI.Button;
using Image = UnityEngine.UI.Image;
using Object = UnityEngine.Object;
public class UI_LevelDetailController : UIWindow
{
//UI GameObj
///Auto Gen Start///
public Image Image_BG;
public Button Button_Close;
public TMP_Text Text_LevelNum;
public TMP_Text Text_LevelName;
public Image Image_Shadow;
public Image Image_Misson;
public Image Image_Weather;
public Image Image_DayOrNight;
public TMP_Text Text_DayOrNight;
public Image Image_Seperate;
public Image Image_weather;
public TMP_Text Text_WeatherAndLand01;
public Image Image_environment;
public TMP_Text Text_WeatherAndLand02;
public Image Image_Buff;
public TMP_Text Text_Buff;
public TMP_Text Text_GetReward;
public TMP_Text Text_AlreadyGet;
public TMP_Text Text_Sweep;
public Image Image_SweepNum;
public TMP_Text Text_Num;
public Button Button_Minus;
public Button Button_Plus;
public Button Button_StartSweep;
public Image Image_physicalBG;
public Image Image_Physical;
public TMP_Text Text_PhysicalNum;
public TMP_Text Text_StartSweep;
public Button Button_Cancel;
public TMP_Text Text_Cancel;
public Image Image_StartFight;
public TMP_Text Text_StartFight;
///Auto Gen End///
/// <summary>
/// 打开关卡详情界面
/// </summary>
public static async UniTask<UIWindow> Open(LevelInfo levelInfo)
{
await CommonUtils.CaptureScreenshot();
return await UIManager.Instance.CreateAndOpenWindow(UINameConst.UI_LevelDetail, levelInfo);
}
/// <summary>
/// 高斯模糊遮罩
/// </summary>
private RawImage rawImageGaussianBlurMask;
/// <summary>
/// 循环列表
/// </summary>
private RecycleView recycleView;
private ScrollRect _numScrollView;
private UIScrollFocusHelper _scrollFocusCmp;
private GameObject _numItem;
private GameObject _maskObj;
private const int MAX_SWEEPNUM = 10;
private const int SWEEP_NUM_CONST = 3; //扫荡列表前后默认item数量
private class RewardShowItem
{
public RewardItem rewardItem;
public ERewardType rewardType;
public bool hasGet;
public RewardShowItem(RewardItem rewardItem, ERewardType rewardType, bool hasGet)
{
this.rewardItem = rewardItem;
this.rewardType = rewardType;
this.hasGet = hasGet;
}
}
/// <summary>
/// 通关奖励字典
/// </summary>
private readonly Dictionary<int, GenericItem_PassReward> dicPassReward = new();
private LevelInfo _currLevelInfo;
private Button _fightBtn;
private int _sweepNum = -1;
private int SweepNum
{
get => _sweepNum;
set
{
if (_sweepNum != value)
{
_sweepNum = value;
if (_sweepNum < 0)
_sweepNum = 0;
//Text_Num.text = _sweepNum.ToString();
_SetCostEnergyItemCount();
}
}
}
private List<RewardShowItem> _allRewards = new();
//private int _currTeamIndex = -1;
private Team _currTeam;
private int _teamIndexMax;
// deal with input data
public override void PreLoad(object data)
{
_currLevelInfo = data != null?data as LevelInfo : _currLevelInfo;
CommonUtils.PreLoadOrUnloadEnvironmentWeatherDayNightIcon(true);
}
// Use this for initialization
public override void OnInit()
{
//bind UI GameObj
UI_LevelDetailBinder.GetComponents(this);
rawImageGaussianBlurMask = GetComponent<RawImage>("GaussianBlurMask");
recycleView = GetComponent<RecycleView>("Image_BG/RewardAndSweep/Text_GetReward/RecycleView");
_fightBtn = GetComponent<Button>("Image_BG/Image_StartFight");
Text_LevelNum = GetComponent<TMP_Text>("Image_BG/Top/Text_LevelNum");
// _numScrollView = GetComponent<UnityEngine.UI.ScrollRect>("Image_BG/RewardAndSweep/Text_Sweep/SweepNum/ScrollView");
// _numItem = FindObj("Image_BG/RewardAndSweep/Text_Sweep/SweepNum/ItemNum");
_maskObj = FindObj("Image_BG/ImageMask");
rawImageGaussianBlurMask.texture = CommonUtils.GetScreenTexture2D();
//test
_maskObj.gameObject.SetActive(true);
var dayBtnEx = Image_DayOrNight.GetComponent<UIButtonEx>();
var weatherBtnEx = Image_weather.GetComponent<UIButtonEx>();
var environmentBtnEx = Image_environment.GetComponent<UIButtonEx>();
recycleView.Init(RefreshRewardItem);
BindButton(Button_Close, CloseOnClick);
BindButton(Button_Cancel, CloseOnClick);
BindButton(GetComponent<Button>("emptyForAllCloseBtn"), CloseOnClick);
BindButton(_fightBtn, FightOnClick);
BindButton(Button_Plus, PlusOnClick);
BindButton(Button_Minus, MinusOnClick);
dayBtnEx.AddLongPressListener(OnLongPressDay);
dayBtnEx.AddClickListener(OnPointUpDay);
weatherBtnEx.AddLongPressListener(OnLongPressWeather);
weatherBtnEx.AddClickListener(OnPointUpWeather);
environmentBtnEx.AddLongPressListener(OnLongPressEnvironment);
environmentBtnEx.AddClickListener(OnPointUpEnvironment);
}
private async void FightOnClick()
{
await UI_TeamAndSkillSelectController.Open(_currLevelInfo);
}
private void OnEnterLevelFinished()
{
CloseWindow();
}
private void CloseOnClick()
{
CloseWindow();
}
private void PlusOnClick()
{
SweepNum++;
_scrollFocusCmp.ChangeIndex(true);
}
private void MinusOnClick()
{
SweepNum --;
_scrollFocusCmp.ChangeIndex(false);
}
private void OnLongPressDay()
{
Image_Buff.gameObject.SetActive(true);
var dayNightConfig = CommonUtils.GetDayNightConfig(_currLevelInfo.DayNightType);
var txtName = CommonUtils.GetLocalizeText(dayNightConfig.NameLocal);
var txtDesc = CommonUtils.GetLocalizeText(dayNightConfig.DescLocal);
var txtContent = txtName + ": " + txtDesc;
Text_Buff.text = txtContent;
}
private void OnLongPressWeather()
{
Image_Buff.gameObject.SetActive(true);
var weatherConfig = CommonUtils.GetWeatherConfig(_currLevelInfo.WeatherType);
var txtName = CommonUtils.GetLocalizeText(weatherConfig.NameLocal);
var txtDesc = CommonUtils.GetLocalizeText(weatherConfig.DescLocal);
var txtContent = txtName + ": " + txtDesc;
Text_Buff.text = txtContent;
}
private void OnLongPressEnvironment()
{
Image_Buff.gameObject.SetActive(true);
var environmentConfig = CommonUtils.GetEnvironmentConfig(_currLevelInfo.EnvironmentType);
var txtName = CommonUtils.GetLocalizeText(environmentConfig.NameLocal);
var txtDesc = CommonUtils.GetLocalizeText(environmentConfig.DescLocal);
var txtContent = txtName + ": " + txtDesc;
Text_Buff.text = txtContent;
}
private void OnPointUpDay()
{
Image_Buff.gameObject.SetActive(false);
}
private void OnPointUpWeather()
{
Image_Buff.gameObject.SetActive(false);
}
private void OnPointUpEnvironment()
{
Image_Buff.gameObject.SetActive(false);
}
private void _SetCostEnergyItemCount()
{
var costItems = _currLevelInfo.CostItems;
var itemCount = costItems.Find(itemCount => itemCount.Id == GLConfig.Inst.data.EnergyPointID);
if (itemCount != null)
{
Text_PhysicalNum.text = itemCount.Count.ToString();
return;
}
Text_PhysicalNum.text = "0";
}
//invoke when open window
protected override void OnShowWindow(object data)
{
base.OnShowWindow(data);
SweepNum = 0;
RefreshUI();
RefreshAllRewardsData();
SetScrollView();
recycleView.ShowList(_allRewards.Count);
RefreshNumScroll();
}
private async void RefreshUI()
{
Text_LevelNum.text = _currLevelInfo.ChapterIndex + "-" + _currLevelInfo.LevelIndex;
Text_LevelName.text = _currLevelInfo.Name;
Text_Buff.text = _currLevelInfo.EnvironmentBuffString;
var dayNightConfig = CommonUtils.GetDayNightConfig(_currLevelInfo.DayNightType);
Image_DayOrNight.sprite = AssetManager.Instance.GetPreLoadResult<Sprite>(dayNightConfig.Icon);
Text_DayOrNight.text = CommonUtils.GetLocalizeText(dayNightConfig.NameLocal);
var weatherConfig = CommonUtils.GetWeatherConfig(_currLevelInfo.WeatherType);
Image_weather.sprite = AssetManager.Instance.GetPreLoadResult<Sprite>(weatherConfig.Icon);
Text_WeatherAndLand01.text = CommonUtils.GetLocalizeText(weatherConfig.NameLocal);
var environmentConfig = CommonUtils.GetEnvironmentConfig(_currLevelInfo.EnvironmentType);
Image_environment.sprite = AssetManager.Instance.GetPreLoadResult<Sprite>(environmentConfig.Icon);
Text_WeatherAndLand02.text = CommonUtils.GetLocalizeText(environmentConfig.NameLocal);
var starResult = _currLevelInfo.StarResult;
for (int i = 0; i < 3; i++)
{
GameObject go =
FindObj(string.Format("Image_BG/LevelDetail/Image_Misson/ImageMissionBar{0}", (i).ToString()));
if (i < _currLevelInfo.LevelData.starTarget.Count)
{
go.SetActive(true);
CommonUtils.GetComponent<TMP_Text>(go, "TextDescribe").text = _currLevelInfo.GetStarTargetLocalizationText(i);
var rewardIDs = i == 0 ? _currLevelInfo.StarRewardID_1 :
i == 1 ? _currLevelInfo.StarRewardID_2 : _currLevelInfo.StarRewardID_3;
bool isFinish = starResult[i];
if (rewardIDs.Length != 1)
{
DebugUtil.LogError($"关卡星级奖励配置id数目不正确!只能有一个ID levelID:{_currLevelInfo.ID} 星级:{i + 1}");
}
else
{
//var rewardItemList = RewardManager.Instance.Get(rewardIDs[0]).ItemList.Get();
var rewardItemList = CommonUtils.GetFilterRewardItemList(RewardManager.Instance.Get(rewardIDs[0])).Get();
if (rewardItemList.Count > 0)
{
DebugUtil.LogError($"星级目标的奖励数目大于1!levelID:{_currLevelInfo.ID} 星级:{i + 1}");
}
var rewardItem = rewardItemList[0];
TMP_Text getItemText = CommonUtils.GetComponent<TMP_Text>(go, "RewardContent/TextGetItem");
TMP_Text getItemGrayText = CommonUtils.GetComponent<TMP_Text>(go, "RewardContent/TextGetItem_Grey");
var text = isFinish ? getItemText : getItemGrayText;
text.text = rewardItem.ShowCountText;
getItemText.gameObject.SetActive(isFinish);
getItemGrayText.gameObject.SetActive(!isFinish);
var imgItem = CommonUtils.GetComponent<Image>(go, "RewardContent/ImageItem");
var spritePath = CommonUtils.GetItemPath(rewardItem.ID);
imgItem.sprite = await LoadAssetAsync<Sprite>(spritePath);
}
var finishedStarImage = CommonUtils.GetComponent<Image>(go, "ImageWinStart");
var notFinishedStarImage = CommonUtils.GetComponent<Image>(go, "ImageFailedStart");
finishedStarImage.gameObject.SetActive(isFinish);
notFinishedStarImage.gameObject.SetActive(!isFinish);
}
else
{
go.SetActive(false);
}
}
}
private void SetScrollView()
{
ShowIfNull();
}
// private void SetScrollviewItemButton(GameObject @object)
// {
// }
private void RefreshRewardItem(GameObject cell, int index)
{
if (!dicPassReward.TryGetValue(cell.GetInstanceID(), out GenericItem_PassReward item))
{
item = new GenericItem_PassReward(cell);
dicPassReward.Add(cell.GetInstanceID(), item);
}
var rewardInfo = _allRewards[index];
item.SetInfo(rewardInfo.rewardItem, rewardInfo.hasGet, rewardInfo.rewardType);
}
private void RefreshAllRewardsData()
{
_allRewards.Clear();
for (int i = 0; i < _currLevelInfo.NomralRewardID.Length; i++)
{
Reward reward = RewardManager.Instance.Get(_currLevelInfo.NomralRewardID[i]);
var itemList = CommonUtils.GetFilterRewardItemList(reward);
foreach (var rewardItem in itemList.Get())
{
RewardShowItem RewardShowItem =
new RewardShowItem(rewardItem, ERewardType.LevelNormalPassReward, false);
_allRewards.Add(RewardShowItem);
}
}
for (int i = 0; i < _currLevelInfo.FirstRewardID.Length; i++)
{
Reward reward = RewardManager.Instance.Get(_currLevelInfo.FirstRewardID[i]);
var itemList = CommonUtils.GetFilterRewardItemList(reward);
foreach (var rewardItem in itemList.Get())
{
RewardShowItem RewardShowItem =
new RewardShowItem(rewardItem, ERewardType.LevelFirstPassReward, _currLevelInfo.HasPass);
_allRewards.Add(RewardShowItem);
}
}
}
private bool ShowIfNull()
{
FindObj("Image_BG/RewardAndSweep/Text_GetReward/NoRewards").SetActive(_allRewards.Count == 0);
return _allRewards.Count == 0;
}
#region NumScroll
private void RefreshNumScroll()
{
if (_numScrollView != null)
{
return;
}
_numScrollView = GetComponent<UnityEngine.UI.ScrollRect>("Image_BG/RewardAndSweep/Text_Sweep/SweepNum/ScrollView");
_numItem = FindObj("Image_BG/RewardAndSweep/Text_Sweep/SweepNum/ItemNum");
var content = CommonUtils.GetGameObject(_numScrollView.gameObject, "Viewport/Content");
List<GameObject> itemL = new List<GameObject>();
for (int i = 0; i < 3; i++)
{
var go = Instantiate(_numItem);
go.transform.SetParent(content.transform);
RefreshItemHide(go);
itemL.Add(go);
}
for (int i = 0; i < MAX_SWEEPNUM; i++)
{
var go = Instantiate(_numItem);
go.transform.SetParent(content.transform);
RefreshItem(go, i);
itemL.Add(go);
}
for (int i = 0; i < 3; i++)
{
var go = Instantiate(_numItem);
go.transform.SetParent(content.transform);
RefreshItemHide(go);
itemL.Add(go);
}
_scrollFocusCmp = _numScrollView.GetComponent<UIScrollFocusHelper>();
if (_scrollFocusCmp)
{
_scrollFocusCmp.SetData(itemL, MAX_SWEEPNUM + SWEEP_NUM_CONST - 1, SWEEP_NUM_CONST - 1);
_scrollFocusCmp.SetFocusItemFunc(_FocusItemFunc);
_scrollFocusCmp.SetUnFocusItemFunc(_UnFocusItemFunc);
_scrollFocusCmp.Init();
}
}
private void RefreshItemHide(GameObject obj)
{
var txtNum = CommonUtils.GetComponent<TMP_Text>(obj, "TextNum");
var imgTri = CommonUtils.GetComponent<Image>(obj, "ImageTri");
obj.SetActive(true);
txtNum.gameObject.SetActive(false);
imgTri.gameObject.SetActive(false);
}
private void RefreshItem(GameObject obj, int idx)
{
var txtNum = CommonUtils.GetComponent<TMP_Text>(obj, "TextNum");
var imgTri = CommonUtils.GetComponent<Image>(obj, "ImageTri");
txtNum.text = idx.ToString();
if (idx == MAX_SWEEPNUM - 1)
{
imgTri.gameObject.SetActive(false);
}
obj.SetActive(true);
}
private void _FocusItemFunc(GameObject go)
{
//DebugUtil.LogError("触发聚焦 FocusItemFunc");
var txtNum = CommonUtils.GetComponent<TMP_Text>(go, "TextNum");
txtNum.fontSize = 66f;
}
private void _UnFocusItemFunc(GameObject go)
{
var txtNum = CommonUtils.GetComponent<TMP_Text>(go, "TextNum");
txtNum.fontSize = 40f;
}
#endregion
//invoke when reload window
protected override void OnReloadWindow(object data = null)
{
}
//invoke when close window
//invoke when destroy
public override void OnRelease()
{
CommonUtils.PreLoadOrUnloadEnvironmentWeatherDayNightIcon(false);
foreach (GenericItem_PassReward genericItem_PassReward in dicPassReward.Values)
{
genericItem_PassReward.Dispose();
}
dicPassReward.Clear();
CommonUtils.ScreenshotReset();
base.OnRelease();
}
}