using DG.Tweening; using IVDataFormat; using IVServerFormat; using Spine; using Spine.Unity.AttachmentTools; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; // 커스터마이징 매니저. public class CustomizeMgr : MonoBehaviour { #region Const private static CustomizeMgr curMgr = null; // 스파인 애니메이션에서 지정되어있는 이름들. private const string SkinName = "default"; private const string SlotName = "weapon"; private const string AtchName = "weapon"; private const int I_ColorX = 251; #endregion Const #region Spine [SerializeField] private IVCharSimple ivChar; // 캐릭터 기본 애니메이션에서 사용하는 머테리얼. [SerializeField] private Material matBase; #endregion Battle #region UI [SerializeField] private TextMeshProUGUI txtMainT; [SerializeField] private Canvas canvasUI; private GameObject goBtnInfo; private Button btnApply, btnCompose; private TextMeshProUGUI txtName, txtEfcInfoT, txtInfo, txtComposeCnt; private ButtonIV[] btnTabs; private GameObject[] groupTabs; [SerializeField] private EScrController escrCloth, escrWeapon; [SerializeField] private EScrController[] escrClrs; // 슬롯 선택 연출. private GameObject goSelectEfc; private RectTransform rtrfSelectBorder, rtrfPresetSelect; private GameObject[] goPresetSelects; private RectTransform[][] rtrfClrPresets; private Image[][] imgClrPresets; private GameObject[][] goClrPresetEmptys; private GameObject[][] goClrPresetLocks; //GameObject dust; [SerializeField] Canvas leftCanvasUI; TextMeshProUGUI leftTitle; #endregion UI #region Variables private int iLoading = 1; private bool bReLocalize = true; private bool bReLocalizeCloth, bReLocalizeWeapon = false; private bool bInitNeed = true; private bool bInitNeedCloth = true; private bool bInitNeedWeapon = true; private bool bInitNeedClr = true; // 변경됨. private bool bChange = false; // 선택된 메인 탭. 0:의상, 1:무기, 2:색상. private int iSelectedTab = -1; // 슬롯에서 선택된 인덱스. private int[] iSelectedSlotIndexs = new int[3] { -1, -1, -1 }; // 색상 목록에서 선택됨. private bool bSelectedColor = false; // 색상 목록에서 선택된 종류. 0:헤어, 1:꼭지, 2:눈. private int iSelectedClrType = -1; // 목록에서 선택되었는지. private bool[] bSelectedLists = new bool[3]; // 목록에서 선택된 색상 번호. private int[] iSelectedListIds = new int[3] { 0, 0, 0 }; // 보기에 적용된 색상 번호. private int[] iSelectedClr = new int[3] { 0, 0, 0 }; // 색상을 변경하려는 슬롯 인덱스. private int iChangeSlotIndex = -1; // 보유 색상 목록. private EnhancedUI.SmallList[] haveClrRows; private List[] haveClrLists; private bool[] bUpdateClrs = new bool[3]; // 보기에 적용된(선택중인) 의상 번호. private int iSelectedCloth = -1; // 보기에 적용된(선택중인) 무기 번호. private int iSelectedWeapon = -1; private int iSlotIndexWp = 0; private Skeleton skeleton; private Skin skinCustom = null; private Attachment atchWeaponBase = null; private Attachment atchWeapon = null; private int iLoadCos = 0; private Texture2D tx2dSelectedCloth = null; #endregion Variables #region Base public static void SLocalize(bool bmain) { if (curMgr != null) curMgr.Localize(bmain); } // 번역. private void Localize(bool bmain) { if (bmain) { txtMainT.text = LocalizationText.GetText("cos_title"); } else { bReLocalize = false; canvasUI.transform.Find("txtT").GetComponent().text = LocalizationText.GetText("cos_title"); btnTabs[0].transform.Find("txt").GetComponent().text = LocalizationText.GetText("cos_cloth"); btnTabs[1].transform.Find("txt").GetComponent().text = LocalizationText.GetText("cos_weapon"); btnTabs[2].transform.Find("txt").GetComponent().text = LocalizationText.GetText("cos_dyeing"); groupTabs[2].transform.Find("groupHair").Find("txtGroupT").GetComponent().text = LocalizationText.GetText("cos_hair"); groupTabs[2].transform.Find("groupTop").Find("txtGroupT").GetComponent().text = LocalizationText.GetText("cos_hairtop"); groupTabs[2].transform.Find("groupEye").Find("txtGroupT").GetComponent().text = LocalizationText.GetText("cos_eye"); groupTabs[2].transform.Find("groupHair").Find("txtPresetT").GetComponent().text = LocalizationText.GetText("cos_apply_color"); groupTabs[2].transform.Find("groupTop").Find("txtPresetT").GetComponent().text = LocalizationText.GetText("cos_apply_color"); groupTabs[2].transform.Find("groupEye").Find("txtPresetT").GetComponent().text = LocalizationText.GetText("cos_apply_color"); groupTabs[2].transform.Find("groupHair").Find("txtHaveT").GetComponent().text = LocalizationText.GetText("cos_have_color"); groupTabs[2].transform.Find("groupTop").Find("txtHaveT").GetComponent().text = LocalizationText.GetText("cos_have_color"); groupTabs[2].transform.Find("groupEye").Find("txtHaveT").GetComponent().text = LocalizationText.GetText("cos_have_color"); btnApply.transform.Find("txt").GetComponent().text = LocalizationText.GetText("cos_apply"); btnCompose.transform.Find("txt").GetComponent().text = LocalizationText.GetText("all_compose"); if (iSelectedTab < 0) { } // 염색. else if (iSelectedTab >= 2) { txtEfcInfoT.text = LocalizationText.GetText("all_tip"); } // 의상, 무기. else { txtEfcInfoT.text = LocalizationText.GetText("own_effect_title"); } leftTitle = leftCanvasUI.transform.Find("txtT").GetComponent(); leftTitle.text = LocalizationText.GetText("cos_info"); } } // 설정에서 언어 변경 시 처리. public static void SReLocalize() { curMgr.Localize(true); curMgr.bReLocalize = true; curMgr.bReLocalizeCloth = true; curMgr.bReLocalizeWeapon = true; } // 백버튼 처리. public static bool SCloseMenu() { return curMgr.CloseMenu(); } private bool CloseMenu() { // 게임 시작 후 열린적 없음. if (bInitNeed) return false; if (canvasUI.enabled) { CloseCustomize(); return true; } return false; } private void Awake() { curMgr = this; } void Start() { iLoading--; } #endregion Base #region Init public static void SInitSkin(Skeleton sk) => curMgr?.InitSkin(sk); // 게임 처음 시작 시 BattleMgr에서 코스튬 정보 획득을 위해 초기화 호출. private void InitSkin(Skeleton sk) { bInitNeed = true; iSelectedCloth = DataHandler.PlayEquipCostume.outfitId; iSelectedWeapon = DataHandler.PlayEquipCostume.weaponId; iSelectedClr[0] = DataHandler.PlayEquipCostume.hairColor; iSelectedClr[1] = DataHandler.PlayEquipCostume.topColor; iSelectedClr[2] = DataHandler.PlayEquipCostume.eyeColor; skeleton = sk; AddressableMgr.InitWeaponSkin(sk, matBase); } // 창을 열 때 창의 의상/무기 세팅. private IEnumerator LoadCostume() { RectTransform rtrfchar = ivChar.GetComponent(); Vector3 v3pos = rtrfchar.anchoredPosition3D; v3pos.z = -10000f; rtrfchar.anchoredPosition3D = v3pos; iLoadCos += 2; CoverCamera.Hold(); CoverCamera.Hold(); AddressableMgr.LoadClothSpine(iSelectedCloth, ALoadCloth); AddressableMgr.LoadWeaponSpine(iSelectedWeapon, ALoadWeapon); while (iLoadCos > 0) yield return null; yield return null; yield return null; ivChar.SetCostume(tx2dSelectedCloth); v3pos.z = -0f; rtrfchar.anchoredPosition3D = v3pos; } public static void SReleaseCostume() { curMgr.ReleaseCostume(); } // 창 닫을 때 의상/무기 리소스 해제. private void ReleaseCostume() { tx2dSelectedCloth = null; AddressableMgr.ReleaseClothSpine(iSelectedCloth); AddressableMgr.ReleaseWeaponSpine(iSelectedWeapon); iSelectedCloth = DataHandler.PlayEquipCostume.outfitId; iSelectedWeapon = DataHandler.PlayEquipCostume.weaponId; iSelectedClrType = -1; for (int i = 0; i < iSelectedListIds.Length; i++) { iSelectedListIds[i] = 0; bSelectedLists[i] = false; } escrClrs[0].scroller.RefreshActiveCellViews(); escrClrs[1].scroller.RefreshActiveCellViews(); escrClrs[2].scroller.RefreshActiveCellViews(); iSelectedClr[0] = DataHandler.PlayEquipCostume.hairColor; iSelectedClr[1] = DataHandler.PlayEquipCostume.topColor; iSelectedClr[2] = DataHandler.PlayEquipCostume.eyeColor; btnApply.interactable = false; } private void Init() { btnTabs = canvasUI.transform.Find("tabWrapTop").GetComponentsInChildren(true); groupTabs = new GameObject[btnTabs.Length]; groupTabs[0] = canvasUI.transform.Find("SvCloth").gameObject; groupTabs[1] = canvasUI.transform.Find("SvWeapon").gameObject; groupTabs[2] = canvasUI.transform.Find("groupColor").gameObject; txtName = ivChar.transform.parent.Find("txtName").GetComponent(); goBtnInfo = canvasUI.transform.Find("btnInfo").gameObject; btnApply = ivChar.transform.parent.Find("btnApply").GetComponent