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

563 lines
19 KiB
C#
Raw Normal View History

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 Framework;
using Cysharp.Threading.Tasks;
using Gameplay;
using cfg.CharacterCfg;
using PhxhSDK;
using System.Threading.Tasks;
using UnityEngine.EventSystems;
using Gameplay.Performance;
using cfg.ActorCfg;
using Gameplay.Utils;
using UnityEngine.Playables;
2024-06-24 13:53:23 +08:00
using Gameplay.Net;
using static CriWare.CriAtomExBeatSync;
2024-06-24 15:13:42 +08:00
using Gameplay.Emoji;
public class SkinChangeController : UIWindow
{
//UI GameObj
///Auto Gen Start///
public Image Image_BG;
//public Button Button_Back;
public Button Button_back;
public TMP_Text Text_Back;
public Button Button_Home;
public Image Image_Dark;
public Image Image_LeftBG;
public Image Image_ModelPosition;
public Image Image_Poster;
public Image Image_PosterPreview;
public Image Image_MidBG;
public Button Button_ShowAllPic;
public TMP_Text Text_Name;
public TMP_Text Text_SkinName;
public TMP_Text Text_Info;
public TMP_Text Text_GetWay;
public Button Button_Buy;
public TMP_Text Text_Buy;
public Button Button_Wear;
public TMP_Text Text_Wear;
public GameObject UpperUI;
2024-06-20 15:20:23 +08:00
private RawImage rawImageGaussianBlurMask;
///Auto Gen End///
private PinchZoomModule PinchZoom;
private DragForUI Drag;
private PhxhSDK.PhxhScrollView ScrollView;
SkinScrollView skinScrollView = new SkinScrollView();
GameObject _sampleModel;
GameObject _instModel;
2024-06-24 15:13:42 +08:00
private UnitEmojiManager _emojiManager;
private bool isShowPosterPic = false;
private CharacterDataInfo curCharacterInfo;
private int curSelectSkinId;
private int curUsingSkinId;
List<DataCharacterSkin> characterSkinList;
Dictionary<int, Sprite> posterLargePics = new();
Dictionary<int, Sprite> posterHalfPics = new();
2024-06-21 17:14:19 +08:00
PosterFader fader = new PosterFader();
public static async UniTask<UIWindow> Open(CharacterDataInfo characterData)
{
CommonUtils.CaptureScreenshot();
return await UIManager.Instance.CreateAndOpenWindow(UINameConst.UI_SkinChange, characterData);
}
// deal with input data
public override void PreLoad(object data = null)
{
curCharacterInfo = data as CharacterDataInfo;
2024-06-24 13:53:23 +08:00
curSelectSkinId = (int)curCharacterInfo.SkinID;// + 1;
if(curSelectSkinId == 0)
{
DebugUtil.LogError("<22><>ǰ<EFBFBD><C7B0>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4>IDΪ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪĬ<CEAA><C4AC>Ƥ<EFBFBD><C6A4>ID");
curSelectSkinId = 1;
}
curUsingSkinId = curSelectSkinId;
characterSkinList = CommonUtils.GetCharacterSkinCfgList((int)curCharacterInfo.ID);
2024-06-24 13:53:23 +08:00
PreLoadSpritesAsync();
}
2024-06-24 13:53:23 +08:00
void refreshCharacterInfo()
{
curCharacterInfo = CharacterDataInfoManager.Instance.GetCharacterInfo(curCharacterInfo.ID);
curSelectSkinId = (int)curCharacterInfo.SkinID;
if (curSelectSkinId == 0)
{
DebugUtil.LogError("<22><>ǰ<EFBFBD><C7B0>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4>IDΪ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪĬ<CEAA><C4AC>Ƥ<EFBFBD><C6A4>ID");
curSelectSkinId = 1;
}
curUsingSkinId = curSelectSkinId;
}
async void PreLoadSpritesAsync()
{
foreach (var dataCharacter in characterSkinList)
{
string path = CommonUtils.GetCharacterPicPath((int)curCharacterInfo.ID, CommonUtils.ECharacterPicPathType.Poster, dataCharacter.SkinID);
var sprite = await LoadAssetAsync<Sprite>(path);
if (!posterLargePics.ContainsKey(dataCharacter.SkinID))
posterLargePics.Add(dataCharacter.SkinID, sprite);
else
posterLargePics[dataCharacter.SkinID] = sprite;
//TODO Ŀǰ<C4BF><C7B0><EFBFBD><EFBFBD>ͼʹ<CDBC>úøж<C3B8>ͼƬ·<C6AC><C2B7>
path = CommonUtils.GetCharacterPicPath((int)curCharacterInfo.ID, CommonUtils.ECharacterPicPathType.Favorable, dataCharacter.SkinID);
DebugUtil.Log("Ŀǰ<C4BF><C7B0><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>·<EFBFBD><C2B7>Ϊ<EFBFBD><CEAA>" + path + ",<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD>");
var halfSprite = await LoadAssetAsync<Sprite>(path);
if (!posterHalfPics.ContainsKey(dataCharacter.SkinID))
posterHalfPics.Add(dataCharacter.SkinID, halfSprite);
else
posterHalfPics[dataCharacter.SkinID] = halfSprite;
}
}
async void LoadModel()
{
2024-06-24 15:13:42 +08:00
//TODO <20><><EFBFBD>ز<EFBFBD>ͬƤ<CDAC><C6A4><EFBFBD><EFBFBD>ģ<EFBFBD>͵<EFBFBD>·<EFBFBD><C2B7>
var prefabPath = PathEx.GetCharacterDisplayModelPath(curCharacterInfo.Cfg.NameID);
_sampleModel = await LoadAssetAsync<GameObject>(prefabPath);
GameObject model = Object.Instantiate(_sampleModel, Image_ModelPosition.transform, true);
_instModel = model;
model.transform.localPosition = new Vector3(0, -200, -300);
model.transform.localRotation = new(0, 180, 0, 1);
model.transform.localScale = 300 * Vector3.one;
model.gameObject.SetLayerEx(5);
var pd = model.GetComponentInChildren<PlayableDirector>();
if (pd != null)
{
pd.enabled = false;
}
var animator = model.GetComponentInChildren<Animator>();
if (animator != null)
{
animator.Play("standready001");
}
2024-06-24 15:13:42 +08:00
_InitEmoji();
}
2024-06-24 15:13:42 +08:00
private void _InitEmoji()
{
if (_emojiManager != null)
{
_emojiManager.Dispose();
_emojiManager = null;
}
var charSingleData = curCharacterInfo.Cfg;
_emojiManager = new UnitEmojiManager(_instModel, charSingleData.EmojiEyesColor,
charSingleData.EmojiEyeBowsType, charSingleData.EmojiEyeBowsColor, true);
_emojiManager.SwitchEmoji(charSingleData.DefaultDisplayEmojiId);
}
// Use this for initialization
public override void OnInit()
{
//bind UI GameObj
SkinChangeBinder.GetComponents(this);
UpperUI = FindObj("Image_BG/UpperUI");
2024-06-20 15:20:23 +08:00
rawImageGaussianBlurMask = GetComponent<RawImage>("GaussianBlurMask");
rawImageGaussianBlurMask.texture = CommonUtils.screenTexture;
2024-06-24 13:53:23 +08:00
Image_Poster.GetComponent<RectTransform>().sizeDelta = Vector2.zero;
2024-06-20 15:20:23 +08:00
PinchZoom = GetComponent<PinchZoomModule>("Image_BG/Image_Poster");
Drag = GetComponent<DragForUI>("Image_BG/Image_Poster");
ScrollView = GetComponent<PhxhSDK.PhxhScrollView>("Image_BG/UpperUI/ChangeSkin/ScrollView");
skinScrollView.SetScrollRect(ScrollView);
2024-06-24 13:53:23 +08:00
skinScrollView.SetItemCountFunc(() => characterSkinList.Count + 2);//<2F>б<EFBFBD><D0B1><EFBFBD><EFBFBD>¸<EFBFBD><C2B8><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>հ<EFBFBD>item<65><6D>Ϊpadding
skinScrollView.SetItemSizeFunc((index) => skinScrollView.GetItemSizeFromList(index));
skinScrollView.SetUpdateFunc(_RefreshSkinItem);
skinScrollView.InitItemCellList(characterSkinList.Count);
BindButton(Button_ShowAllPic, OnShowPicButton);
BindButton(Button_back, OnReturnButton);
2024-06-24 13:53:23 +08:00
BindButton(Button_Wear, OnChangeSkinClick);
LoadModel();
Drag.OnDragStarted += OnDragBegin;
Drag.OnDraging += OnDrag;
Drag.OnDragCompleted += OnDragEnd;
2024-06-24 13:53:23 +08:00
EventManager.Instance.Register(EventManager.EventName.CharacterInfoRefresh, CharacterInfoRefreshListener);
_SetSkinPosYListData();
skinScrollView.UpdateData();
skinScrollView.ScrollTo(curSelectSkinId);
}
void CharacterInfoRefreshListener()
{
refreshCharacterInfo();
SetSkinInfoAndButton();
}
//invoke when open window
protected override void OnShowWindow(object data = null)
{
2024-06-24 13:53:23 +08:00
base.OnShowWindow(data);
if (PinchZoom != null)
PinchZoom.enabled = false;
isShowPosterPic = false;
2024-06-24 13:53:23 +08:00
SetSkinInfoAndButton();
SetPosterSkinPic();
}
//invoke when reload window
protected override void OnReloadWindow(object data = null)
{
}
//invoke when close window
protected override void OnHideWindow()
{
2024-06-24 13:53:23 +08:00
base.OnHideWindow();
EventManager.Instance.Send(EventManager.EventName.EN_UIControllCultivateMainInput, true);
}
//invoke when destroy
public override void OnRelease()
{
base.OnRelease();
2024-06-24 13:53:23 +08:00
EventManager.Instance.Unregister(EventManager.EventName.CharacterInfoRefresh, CharacterInfoRefreshListener);
}
#region Button Event
void OnShowPicButton()
{
ShowAllPic(true);
}
void OnReturnButton()
{
if(isShowPosterPic)
{
ShowAllPic(false);
SetSkinInfoAndButton();
}
else
{
CloseWindow();
}
}
void _OnClickSkinItem(int to)
{
if (curSelectSkinId == to)
{
return;
}
int from = curSelectSkinId;
curSelectSkinId = to;
//_RefreshPosterButton();
skinScrollView.DoTwoItemScale(to - 1, from - 1, skinScrollView.ItemFullRectTrans.rect.size, skinScrollView.ItemRectTrans.rect.size, 0.1f,
() =>
{
_SetSkinPosYListData(false);
}, () =>
{
skinScrollView.AnimScrollTo(to);
SetSkinInfoAndButton();
});
2024-06-21 17:14:19 +08:00
fader.DoFade(Image_Poster, 0f, 0.12f, () =>
{
SetPosterSkinPic();
fader.DoFade(Image_Poster, 1f, 0.12f);
});
}
#endregion
#region drag event
float scaleFactor;
void OnDragBegin(PointerEventData data)
{
if(!isShowPosterPic)
{
return;
}
scaleFactor = UIRoot.Instance.RootCanvas.GetComponent<RectTransform>().sizeDelta.x / PerformanceManager.instance.fullScreenWidth;
}
void OnDrag(PointerEventData data)
{
if(!isShowPosterPic)
{
return;
}
Drag.GetComponent<RectTransform>().anchoredPosition += data.delta * scaleFactor;
//drag.transform.position = GoRoot.transform.position;
}
void OnDragEnd(PointerEventData data)
{
if (!isShowPosterPic)
{
return;
}
}
#endregion
private void _SetSkinPosYListData(bool setSize = true)
{
if (setSize)
{
for (int i = 0; i < characterSkinList.Count; i++)
{
Vector2 size = skinScrollView.SkinItemSize(i + 1, curSelectSkinId);
skinScrollView._itemCells[i].size = size;
}
}
var posY = -skinScrollView.SkinItemSize(-1, curSelectSkinId).y;
for (int i = 0; i < characterSkinList.Count; i++)
{
Vector2 size = skinScrollView._itemCells[i].size;
posY -= size.y / 2;
skinScrollView._itemCells[i].localPosY = posY;
posY -= size.y / 2;
}
}
private async void _RefreshSkinItem(int index, RectTransform item)
{
if (index <= 0 || index >= characterSkinList.Count + 1)
{
item.gameObject.SetActive(false);
return;
}
var go = item.gameObject;
go.SetActive(true);
var posterPic =
CommonUtils.GetCharacterPicPath((int)curCharacterInfo.ID, CommonUtils.ECharacterPicPathType.Favorable, index);
var imgSkin = CommonUtils.GetComponent<Image>(go, "ButtonChange/ImageSkin");
var imgSelect = CommonUtils.GetGameObject(go, "ButtonChange/ImageChooseRect");
var imgDoSelect = CommonUtils.GetGameObject(go, "ButtonChange/ImageCover");
var btnChange = CommonUtils.GetComponent<Button>(go, "ButtonChange");
var btnNotSelect = CommonUtils.GetComponent<Button>(go, "ButtonNotSelect");
if (posterHalfPics.ContainsKey(index))
imgSkin.sprite = posterHalfPics[index];
else
imgSkin.sprite = await LoadAssetAsync<Sprite>(posterPic);
btnChange.gameObject.SetActive(true);
btnNotSelect.gameObject.SetActive(false);
imgSelect.SetActive(curSelectSkinId == index);
imgDoSelect.SetActive(curSelectSkinId != index);
ClearBind(btnChange);
ClearBind(btnNotSelect);
BindButton(btnChange, _OnClickSkinItem, index);
btnChange.GetComponent<RectTransform>().sizeDelta = skinScrollView.GetItemSizeFromList(index);
}
void ShowAllPic(bool showPic)
{
var UI_HIDE_POSITION = new Vector3(0, -1800, 0);
isShowPosterPic = showPic;
PinchZoom.enabled = showPic;
UpperUI.transform.localPosition = showPic ? UI_HIDE_POSITION : Vector3.zero;
Image_LeftBG.gameObject.SetActive(!showPic);
if (!showPic)
{
if (curSelectSkinId == 1)
Image_Poster.transform.position = Image_PosterPreview.transform.position;
else
Image_Poster.transform.localPosition = Vector3.zero;
Image_Poster.transform.localScale = Image_PosterPreview.transform.localScale;
var animator = _instModel.GetComponentInChildren<Animator>();
if (animator != null)
{
animator.Play("standready001");
}
}
}
async void SetPosterSkinPic()
{
if (posterLargePics.ContainsKey(curSelectSkinId))
2024-06-24 13:53:23 +08:00
{
Image_Poster.sprite = posterLargePics[curSelectSkinId];
2024-06-24 13:53:23 +08:00
}
else
{
var posterPic =
CommonUtils.GetCharacterPicPath((int)curCharacterInfo.ID, CommonUtils.ECharacterPicPathType.Poster, curSelectSkinId);
Image_Poster.sprite = await LoadAssetAsync<Sprite>(posterPic);
}
//TODO <20>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>
if (curSelectSkinId != 1)
{
Image_Poster.transform.localPosition = Vector3.zero;
Image_Poster.SetNativeSize();
2024-06-26 15:39:50 +08:00
if (Image_Poster.sprite.rect.width >= Image_Poster.sprite.rect.height)
{
2024-06-24 13:53:23 +08:00
Image_Poster.GetComponent<RectTransform>().sizeDelta = new Vector2(1800, 1800 * Image_Poster.sprite.rect.height / Image_Poster.sprite.rect.width);
}
else
{
Image_Poster.GetComponent<RectTransform>().sizeDelta = new Vector2(1080 * Image_Poster.sprite.rect.width / Image_Poster.sprite.rect.height, 1080);
}
}
2024-06-24 13:53:23 +08:00
else
{
Image_Poster.transform.position = Image_PosterPreview.transform.position;
Image_Poster.GetComponent<RectTransform>().sizeDelta = Image_PosterPreview.GetComponent<RectTransform>().sizeDelta;
}
return;
}
2024-06-24 13:53:23 +08:00
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>밴ť״̬
/// </summary>
void SetSkinInfoAndButton()
{
if (curSelectSkinId == 0)
{
return;
}
var skinCfg = characterSkinList[curSelectSkinId - 1];
if (CategoryManager.Instance.TryGetSkinItemInfo((int)curCharacterInfo.ID, curSelectSkinId, out DataItem info))//<2F><>ƷƤ<C6B7><C6A4>
{
if (CategoryManager.Instance.GetItemCount(info.ID) > 0 || curSelectSkinId == 1)//ӵ<><D3B5>Ƥ<EFBFBD><C6A4>
{
Button_Buy.gameObject.SetActive(false);
Button_Wear.gameObject.SetActive(true);
Text_GetWay.text = string.Empty;
}
else
{
Button_Buy.gameObject.SetActive(true);
2024-06-21 17:14:19 +08:00
Button_Buy.transition = Selectable.Transition.None;
Button_Buy.interactable = false;
Button_Wear.gameObject.SetActive(false);
Text_GetWay.text = CommonUtils.GetLocalizeText(skinCfg.AcquireCondition);
2024-06-24 13:53:23 +08:00
Text_Buy.text = CommonUtils.GetLocalizeText("SkinInfo_PanelLocalText_Locked");
}
}
2024-06-24 13:53:23 +08:00
else
{
Button_Buy.gameObject.SetActive(false);
Button_Wear.gameObject.SetActive(true);
Text_GetWay.text = string.Empty;
//if (curSelectSkinId != 1)
//{
DebugUtil.LogError("<22><><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>Item<65><6D><EFBFBD>ñ<EFBFBD><C3B1>ڲ<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>ΪƤ<CEAA><C6A4><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>飡\n<><6E>ɫID<49><44>" + curCharacterInfo.ID + " Ƥ<><C6A4>ID<49><44>" + curSelectSkinId);
//}
}
if (curUsingSkinId == curSelectSkinId)
{
Button_Wear.interactable = false;
Text_Wear.text = CommonUtils.GetLocalizeText("SkinInfo_PanelLocalText_Wearing");
}
else
{
Button_Wear.interactable = true;
Text_Wear.text = CommonUtils.GetLocalizeText("SkinInfo_PanelLocalText_DoWear");
}
Text_Name.text = CommonUtils.GetLocalizeText(curCharacterInfo.Name);
Text_SkinName.text = CommonUtils.GetLocalizeText(skinCfg.SkinName);
Text_Info.text = CommonUtils.GetLocalizeText(skinCfg.SkinDesc);
}
2024-06-24 13:53:23 +08:00
void OnChangeSkinClick()
{
if (CategoryManager.Instance.TryGetSkinItemInfo((int)curCharacterInfo.ID, curSelectSkinId, out DataItem info))
{
NetHelper.UseItem((uint)info.ID, 1);
}
else
{
DebugUtil.LogError("<22><><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD>Item<65><6D><EFBFBD>ñ<EFBFBD><C3B1>ڲ<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>ΪƤ<CEAA><C6A4><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>飡\n<><6E>ɫID<49><44>" + curCharacterInfo.ID + " Ƥ<><C6A4>ID<49><44>" + curSelectSkinId);
}
}
class SkinScrollView : IPanelScrollView
{
public override void SetScrollRect(PhxhScrollView scrollRect)
{
centerAnchor = true;
canDrag = false;
Self_aligning = false;
base.SetScrollRect(scrollRect);
SetItemRectTrans(CommonUtils.GetComponent<RectTransform>(_scrollRect.itemTemplate.gameObject, "ButtonNotSelect"),
CommonUtils.GetComponent<RectTransform>(_scrollRect.itemTemplate.gameObject, "ButtonChange"));
SetPaddingSize(_itemRectTrans.rect.size);
}
public Vector2 SkinItemSize(int index, int curIndex)
{
if (index == 0 || index == _itemCells.Count + 1)
{
return _itemRectTrans.rect.size;
}
if (index == curIndex)
{
return _itemFullRectTrans.rect.size;
}
else
{
return _itemRectTrans.rect.size;
}
}
/// <summary>
/// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_SetSkinPosYListData
/// </summary>
/// <param name="count"></param>
public void InitItemCellList(int count)
{
_itemCells.Clear();
for (int i = 1; i <= count; i++)
{
UIScrollViewItemCell cell = new UIScrollViewItemCell();
cell.index = i;
_itemCells.Add(cell);
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ŵ<EFBFBD>item<65>Ĵ<EFBFBD>С
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public Vector2 GetItemSizeFromList(int index)
{
if (index > _itemCells.Count + 1)
{
DebugUtil.Log("index out of range!index: " + index);
return _itemFullRectTrans.rect.size;
}
if (index == 0 || index == _itemCells.Count + 1)
{
return _itemFullRectTrans.rect.size;
}
else
{
return _itemCells[index - 1].size;
}
}
}
}