Files
bansonic_beta_main/Assets/scripts/UI/Panel/UI_Panel_Character.cs
T

319 lines
11 KiB
C#

/*
* FancyScrollView (https://github.com/setchi/FancyScrollView)
* Copyright (c) 2020 setchi
* Licensed under MIT (https://github.com/setchi/FancyScrollView/blob/master/LICENSE)
*/
using System;
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;
using Bansonic;
class UI_Panel_Character : MonoBehaviour
{
[SerializeField] float anim_Time = 0.5f;
[SerializeField, Range(0f, 1f)] float illustrationFadeStartAlpha = 0.25f;
[SerializeField] float illustrationBgTargetXOffset = 0f;
[SerializeField] float illustrationBgTargetYOffset = 0f;
float Anim_Speed => 1f / anim_Time;
[SerializeField] List<Animator> ui_Anim;
[SerializeField] Transform content_Character_Slot;
[SerializeField] GameObject button_Character_Slot_Prefab;
[SerializeField] Text text_Character_Name;
[SerializeField] Text text_char_name;
[SerializeField] Image Image_Character_Illustration;
[SerializeField] Image Image_Character_Illustration_BG;
//[Header("")]
[Header("buttons")]
public Button change_thisHero_skin;
public Button thisHero_detail;
public Button confirm_thisHero;
[Header("quit")]
[SerializeField] Button quitButton;
[Header("Data Paths")]
[Tooltip("Path relative to Resources folder for Editor mode")]
public string editorResourcePath = "so/ally";
[Tooltip("Path relative to Resources folder for Runtime mode")]
public string runtimeResourcePath = "so/ally";
private readonly List<AllyHero_SO> allyHeroList = new List<AllyHero_SO>();
private readonly List<uiui_character_displayPrefab> heroDisplayPrefabs = new List<uiui_character_displayPrefab>();
private Vector2 originalIllustrationPos;
private Vector2 originalIllustrationBGPos;
private bool hasCachedPositions;
private Coroutine c_Character_Illustration_Anim;
private int previewCharacterIndex = -1;
private CanvasGroup illustrationCanvasGroup;
private const string SAVED_HERO_ID_KEY = "SelectedMainHeroID";
private void Update()
{
if (Input.GetKeyDown(KeyCode.Escape))
{
gameObject.SetActive(false);
}
}
void Start()
{
UnityEngine.Debug.Log($"[UI_Panel_Character] Start called. Illustration: {Image_Character_Illustration}");
if (change_thisHero_skin != null)
change_thisHero_skin.onClick.AddListener(() => gNotice.warning.display("\u6b64\u7248\u672c\u672a\u5f00\u653e\u76ae\u80a4\u5207\u6362\u529f\u80fd"));
if (thisHero_detail != null)
thisHero_detail.onClick.AddListener(() => gNotice.warning.display("\u6b64\u7248\u672c\u672a\u5f00\u653e\u8be6\u60c5\u67e5\u770b\u529f\u80fd"));
if (confirm_thisHero != null)
confirm_thisHero.onClick.AddListener(OnConfirmHeroClicked);
if (quitButton != null)
quitButton.onClick.AddListener(() => gameObject.SetActive(false));
if (Image_Character_Illustration != null)
{
Image_Character_Illustration.rectTransform.anchoredPosition = new Vector2(376, -306);
originalIllustrationPos = Image_Character_Illustration.rectTransform.anchoredPosition;
if (Image_Character_Illustration.transform.parent != null &&
Image_Character_Illustration.transform.parent.TryGetComponent(out CanvasGroup canvasGroup))
{
illustrationCanvasGroup = canvasGroup;
illustrationCanvasGroup.alpha = 0;
}
}
if (Image_Character_Illustration_BG != null)
{
Vector2 pos = Image_Character_Illustration_BG.rectTransform.anchoredPosition;
pos.x = 376;
Image_Character_Illustration_BG.rectTransform.anchoredPosition = pos;
originalIllustrationBGPos = Image_Character_Illustration_BG.rectTransform.anchoredPosition;
}
hasCachedPositions = true;
foreach (var item in ui_Anim)
{
if (item != null)
item.speed = Anim_Speed;
}
if (content_Character_Slot != null)
content_Character_Slot.Get_Childrens_Component<UI_Button_Character_Head_Slot>(true, true);
var loadedData = RuntimeResourcesCache.LoadAllAllyHeroes();
allyHeroList.Clear();
allyHeroList.AddRange(loadedData);
heroDisplayPrefabs.Clear();
UnityEngine.Debug.Log($"[UI_Panel_Character] Loaded {allyHeroList.Count} heroes");
allyHeroList.Sort((a, b) => a.ally_heroID.CompareTo(b.ally_heroID));
int savedHeroID = PlayerPrefs.GetInt(SAVED_HERO_ID_KEY, -1);
int initialIndex = 0;
for (int i = 0; i < allyHeroList.Count; i++)
{
var slotObject = Instantiate(button_Character_Slot_Prefab, content_Character_Slot);
var displayPrefab = slotObject.GetComponent<uiui_character_displayPrefab>();
var slotButton = displayPrefab != null ? displayPrefab.characterProfileButton : slotObject.GetComponent<Button>();
if (slotButton == null && slotObject.transform.parent != null)
{
slotButton = slotObject.transform.parent.GetComponent<Button>();
}
UISystemBootstrap.RegisterHierarchy(slotObject);
var data = allyHeroList[i];
if (savedHeroID != -1 && data.ally_heroID == savedHeroID)
{
initialIndex = i;
}
if (displayPrefab != null)
{
displayPrefab.SetDisplay(data.ally_heroSelectIcon, data.ally_heroID);
}
heroDisplayPrefabs.Add(displayPrefab);
if (slotObject.TryGetComponent(out UI_Button_Character_Head_Slot head_Slot))
{
head_Slot.index = i;
int capturedIndex = i;
if (slotButton != null)
{
slotButton.onClick.AddListener(() => Set_Character_Index(capturedIndex));
}
}
}
previewCharacterIndex = initialIndex;
UI_Panel_Main.Singleton.Character_Index = initialIndex;
Set_Character();
RefreshSelectedState(false);
}
public void Set_Character_Index(int index)
{
if (previewCharacterIndex == index)
return;
previewCharacterIndex = index;
Set_Character();
RefreshSelectedState(true);
}
private void OnConfirmHeroClicked()
{
if (SaveCurrentCharacter(true))
{
gameObject.SetActive(false);
}
}
private bool SaveCurrentCharacter(bool showNotice)
{
int currentIndex = GetCurrentPreviewIndex();
if (allyHeroList != null && currentIndex >= 0 && currentIndex < allyHeroList.Count)
{
int heroID = allyHeroList[currentIndex].ally_heroID;
PlayerPrefs.SetInt(SAVED_HERO_ID_KEY, heroID);
PlayerPrefs.Save();
if (showNotice)
{
gNotice.alarm.display($"\u5df2\u5c06 {allyHeroList[currentIndex].ally_heroName} \u8bbe\u7f6e\u4e3a\u770b\u677f\u5bf9\u8c61\u3002");
}
previewCharacterIndex = currentIndex;
UI_Panel_Main.Singleton.Character_Index = currentIndex;
return true;
}
return false;
}
private void OnEnable()
{
previewCharacterIndex = UI_Panel_Main.Singleton != null ? UI_Panel_Main.Singleton.Character_Index : previewCharacterIndex;
Set_Character();
RefreshSelectedState(false);
}
private void RefreshSelectedState(bool animated)
{
int selectedIndex = GetCurrentPreviewIndex();
for (int i = 0; i < heroDisplayPrefabs.Count; i++)
{
if (heroDisplayPrefabs[i] != null)
{
heroDisplayPrefabs[i].SetSelected(i == selectedIndex, animated);
}
}
}
private int GetCurrentPreviewIndex()
{
if (previewCharacterIndex >= 0 && previewCharacterIndex < allyHeroList.Count)
{
return previewCharacterIndex;
}
if (UI_Panel_Main.Singleton != null)
{
return UI_Panel_Main.Singleton.Character_Index;
}
return -1;
}
public void Set_Character()
{
if (Image_Character_Illustration == null || illustrationCanvasGroup == null)
{
return;
}
if (c_Character_Illustration_Anim != null)
{
StopCoroutine(c_Character_Illustration_Anim);
c_Character_Illustration_Anim = null;
}
illustrationCanvasGroup.DOKill();
Set_Character_Show();
illustrationCanvasGroup.alpha = illustrationFadeStartAlpha;
illustrationCanvasGroup.DOFade(1f, anim_Time * 0.6f)
.SetEase(Ease.OutCubic)
.SetLink(illustrationCanvasGroup.gameObject);
}
public void Set_Character_Show()
{
int index = GetCurrentPreviewIndex();
if (allyHeroList.Count == 0 || index < 0 || index >= allyHeroList.Count)
return;
Image_Character_Illustration.rectTransform.DOKill();
Image_Character_Illustration_BG.rectTransform.DOKill();
text_Character_Name.DOKill();
if (text_char_name != null)
{
text_char_name.DOKill();
}
var data = allyHeroList[index];
Vector2 targetPos1 = hasCachedPositions
? originalIllustrationPos
: Image_Character_Illustration.rectTransform.anchoredPosition;
Image_Character_Illustration.sprite = data.ally_hero_HD_image;
float startX1 = targetPos1.x - 200;
Image_Character_Illustration.rectTransform.anchoredPosition = new Vector2(startX1, targetPos1.y);
Image_Character_Illustration.rectTransform.DOAnchorPos(targetPos1, anim_Time)
.SetEase(Ease.OutCubic)
.SetLink(Image_Character_Illustration.gameObject);
Vector2 targetPosBG = hasCachedPositions
? originalIllustrationBGPos
: Image_Character_Illustration_BG.rectTransform.anchoredPosition;
targetPosBG.x += illustrationBgTargetXOffset;
targetPosBG.y += illustrationBgTargetYOffset;
Image_Character_Illustration_BG.sprite = data.ally_hero_HD_image;
float startXBG = targetPosBG.x - 200;
Image_Character_Illustration_BG.rectTransform.anchoredPosition = new Vector2(startXBG, targetPosBG.y);
Image_Character_Illustration_BG.rectTransform.DOAnchorPos(targetPosBG, anim_Time)
.SetEase(Ease.OutCubic)
.SetLink(Image_Character_Illustration_BG.gameObject);
Image_Character_Illustration_BG.transform.localScale = Vector3.one;
string text = data.ally_heroName;
text_Character_Name.text = string.Empty;
text_Character_Name.DOText(text, anim_Time)
.SetEase(Ease.Linear)
.SetLink(text_Character_Name.gameObject);
if (text_char_name != null)
{
text_char_name.text = string.Empty;
text_char_name.DOText(text, anim_Time)
.SetEase(Ease.Linear)
.SetLink(text_char_name.gameObject);
}
}
}