using DG.Tweening; using IVDataFormat; using IVServerFormat; using Spine; using Spine.Unity; using System.Collections; using System.Numerics; using TMPro; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.U2D; using UnityEngine.UI; using Vector2 = UnityEngine.Vector2; using Vector3 = UnityEngine.Vector3; public class PvpMgr : MonoBehaviour { #region Const private static PvpMgr curMgr = null; #endregion Const #region UI [Header("UI")] [SerializeField] private TextMeshProUGUI txtMainT; [SerializeField] private Canvas canvasUI; //private ButtonIV[] btnTabs; private GameObject groupLobby, groupRanking; private Image imgLobbyBg, imgLobbyTier, imgLobbyTierNum, imgLobbyChar; private TextMeshProUGUI txtLv, txtName, txtRank, txtTier, txtRp; private Toggle tglAuto; private ButtonIV btnMatch; private TextMeshProUGUI[] txtEffectTs; private TextMeshProUGUI[] txtEffectValues; private GameObject[] goEffects; private GameObject goBadgeRew, goBadgeTier; private EScrPvpRank myRankItem; //private EScrPvpRank[] RankItems; private GameObject[] goEfcRankTops; private IVCharSimple[] charRankTops; private Image[] imgRankTierTops, imgRankTierNumTops; private TextMeshProUGUI[] txtRankPointTops, txtRankNameTops; [SerializeField] private EScrController escrRank, escrTierRew, escrTier; GameObject dust; #endregion UI #region Popup [Header("Popup")] private Canvas canvasRew; private ScrollRect svRew; private TextMeshProUGUI txtRewCount; private ButtonIV btnRewGet; private PvpRewItem[] pvpRewItems; private Canvas canvasTierRew; private ButtonIV btnTierRewGet; private Canvas canvasTier; #endregion Popup #region Join [Header("Join")] [SerializeField] private GameObject goCanvasJoin; private RectTransform rtrfJoinMy, rtrfJoinEnemy; private Image imgJoinMyBg, imgJoinEnemyBg; private Image imgJoinMyTier, imgJoinMyTierNum, imgJoinEnemyTier, imgJoinEnemyTierNum; private TextMeshProUGUI txtJoinMyPoint, txtJoinEnemyPoint; private TextMeshProUGUI txtJoinMyName, txtJoinEnemyName; private IVCharSimple charJoinMy, charJoinEnemy; private SkeletonAnimation skAnimJoin; #endregion UI #region Result [Header("Result")] [SerializeField] private GameObject goCanvasResult; private GameObject goResultRankUp; private Image imgResultTop, imgResultBottom; private Image imgResultTier, imgResultTierNum; private Image imgResultWin, imgResultLose; private TextMeshProUGUI txtResultTier, txtResultAdd, txtResultPoint; private SkeletonAnimation skAnimResult, skAnimResultRankUp; #endregion Result #region Battle UI [Header("Battle UI")] [SerializeField] private Transform trfBattle; private Toggle tglBattleAuto; private TextMeshProUGUI txtBattleMyName, txtBattleEnemyName; #endregion Battle UI #region Variables private int iLoading = 1; private bool bReLocalize = true; private bool bInitNeed = true; private bool bInitNeedBattleCos = true; private bool bInitNeedRank = true; private bool bInitNeedRankCos = true; private bool bInitNeedRew = true; private bool bInitNeedTierRew = true; private bool bInitNeedTier = true; private int iSelectedTab = -1; private EnhancedUI.SmallList tierList = null; private AsyncOperationHandle handleAtlas; public static SpriteAtlas pvpImgs = null; private int iShineMode = -1; private int iCosTopLoad = 0; private int[] iWeaponRankTops, iIconRankTops; private Texture2D[] tx2dClothRankTops; private int iWeaponFriendly = -1; private int iClothFriendly = -1; private Texture2D tx2dClothFriendly; private Texture2D tx2dClothEnemy; private AsyncOperationHandle handleVs; private AsyncOperationHandle handleWinLose; private AsyncOperationHandle handleRankUp; private bool bSpecUpdateJoin = false; private int iEnemyUserId = -1; private dPvpSpec specEnemy = 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("pvp_title"); } else { bReLocalize = false; Transform trfui = canvasUI.transform; trfui.Find("txtT").GetComponent().text = LocalizationText.GetText("pvp_title"); //btnTabs[0].transform.Find("txt").GetComponent().text = LocalizationText.GetText("pvp_lobby"); //btnTabs[1].transform.Find("txt").GetComponent().text = LocalizationText.GetText("all_ranking"); Transform trflobby = groupLobby.transform; trflobby.Find("txtEfcT").GetComponent().text = LocalizationText.GetText("pvp_effect"); goBadgeRew.transform.parent.GetChild(0).GetComponent().text = LocalizationText.GetText("pvp_reward"); goBadgeTier.transform.parent.GetChild(0).GetComponent().text = LocalizationText.GetText("pvp_tierreward"); btnMatch.transform.GetChild(0).GetComponent().text = LocalizationText.GetText("all_enter"); tglAuto.transform.parent.GetComponent().text = LocalizationText.GetText("auto_progress"); trflobby.Find("txtLobby").GetComponent().text = LocalizationText.GetText("pvp_lobby"); Transform trfrank = groupRanking.transform; trfrank.GetChild(0).Find("txtTip").GetComponent().text = LocalizationText.GetText("pvp_rank_tip"); trfrank.GetChild(0).Find("txtRank").GetComponent().text = LocalizationText.GetText("all_ranking"); Transform trfrew = canvasRew.transform; trfrew.Find("txtT").GetComponent().text = LocalizationText.GetText("pvp_reward"); trfrew.Find("txtDesc").GetComponent().text = LocalizationText.GetText("pvp_reward_desc"); trfrew.Find("txtProgressT").GetComponent().text = LocalizationText.GetText("pvp_reward_cond"); trfrew.Find("txtTip").GetComponent().text = LocalizationText.GetText("reset_week_explain"); btnRewGet.transform.GetChild(0).GetComponent().text = LocalizationText.GetText("all_getall"); Transform trftierrew = canvasTierRew.transform; trftierrew.Find("txtT").GetComponent().text = LocalizationText.GetText("pvp_tierreward"); trftierrew.Find("txtDesc").GetComponent().text = LocalizationText.GetText("pvp_tierreward_desc"); trftierrew.Find("txtHelp").GetComponent().text = LocalizationText.GetText("pvp_tiereffect"); btnTierRewGet.transform.GetChild(0).GetComponent().text = LocalizationText.GetText("all_getall"); Transform trftier = canvasTier.transform; trftier.Find("txtT").GetComponent().text = LocalizationText.GetText("pvp_tiereffect"); trftier.Find("txtTip").GetComponent().text = LocalizationText.GetText("pvp_tiereffect_tip"); Transform trfresult = goCanvasResult.transform; trfresult.Find("txtaddt").GetComponent().text = LocalizationText.GetText("all_pointadd"); trfresult.Find("txtpointt").GetComponent().text = LocalizationText.GetText("all_pointcur"); imgResultWin = trfresult.Find("ImgWin").GetComponent(); imgResultLose = trfresult.Find("ImgLose").GetComponent(); tglBattleAuto.transform.parent.GetComponent().text = LocalizationText.GetText("auto_progress"); } } // 설정에서 언어 변경 시 처리. public static void SReLocalize() { curMgr.Localize(true); curMgr.bReLocalize = true; curMgr.bInitNeedRew = true; } // 백버튼 처리. public static bool SCloseMenu() { return curMgr.CloseMenu(); } private bool CloseMenu() { // 게임 시작 후 열린적 없음. if (bInitNeed) return false; // 매칭. if (goCanvasJoin.activeSelf) return true; // 결과 팝업. if (goCanvasResult.activeSelf) { CloseResult(); return true; } // 티어 정보 팝업. if (canvasTier.enabled) { CloseTier(); return true; } // 티어 보상 팝업. if (canvasTierRew.enabled) { CloseTierReward(); return true; } // 결투장 보상 팝업. if (canvasRew.enabled) { CloseReward(); return true; } if (canvasUI.enabled) { ClosePvp(); return true; } return false; } private void Awake() { curMgr = this; } void Start() { iLoading--; } private void Init() { Transform trfui = canvasUI.transform; //btnTabs = new ButtonIV[2]; //btnTabs[0] = trfui.Find("tabLobby").GetComponent(); //btnTabs[1] = trfui.Find("tabRanking").GetComponent(); Transform trflobby = trfui.Find("groupLobby"); groupLobby = trflobby.gameObject; imgLobbyBg = trflobby.GetChild(0).GetComponent(); imgLobbyTier = trflobby.Find("imgTier").GetComponent(); imgLobbyTierNum = trflobby.Find("imgTierNum").GetComponent(); imgLobbyChar = trflobby.Find("imgChar").GetComponent(); txtLv = trflobby.Find("txtLv").GetComponent(); txtName = trflobby.Find("txtName").GetComponent(); txtRank = trflobby.Find("txtRank").GetComponent(); txtTier = trflobby.Find("txtTier").GetComponent(); txtRp = trflobby.Find("txtRp").GetComponent(); tglAuto = trflobby.Find("tglAutoTxt").GetChild(0).GetComponent(); tglAuto.SetIsOnWithoutNotify(false); btnMatch = trflobby.Find("btnMatch").GetComponent(); goBadgeRew = trflobby.Find("btnRew").GetChild(1).gameObject; goBadgeTier = trflobby.Find("btnTier").GetChild(1).gameObject; Transform trfeffect = trflobby.Find("effects"); int ilen = trfeffect.childCount; txtEffectTs = new TextMeshProUGUI[ilen]; txtEffectValues = new TextMeshProUGUI[ilen]; goEffects = new GameObject[ilen]; for (int i = 0; i < ilen; i++) { goEffects[i] = trfeffect.GetChild(i).gameObject; txtEffectTs[i] = trfeffect.GetChild(i).GetChild(0).GetComponent(); txtEffectValues[i] = trfeffect.GetChild(i).GetChild(1).GetComponent(); } Transform trfrank = trfui.Find("groupRanking"); groupRanking = trfrank.gameObject; trfrank = trfrank.GetChild(0); //myRankItem = trfrank.Find("PvpRankItem").GetComponent(); //myRankItem.InitCell(); //RankItems = new EScrPvpRank[3]; //for(int i = 0; i< RankItems.Length; i++) //{ // RankItems[i] = new EScrPvpRank(); // RankItems[i] = trfrank.Find(FormatString.CombineAll("PvpRankItem",i+1)).GetComponent(); // RankItems[i].InitCell(); //} goEfcRankTops = new GameObject[3]; charRankTops = new IVCharSimple[3]; imgRankTierTops = new Image[3]; imgRankTierNumTops = new Image[3]; txtRankPointTops = new TextMeshProUGUI[3]; txtRankNameTops = new TextMeshProUGUI[3]; for (int i = 0; i < 3; i++) { Transform trftop = trfrank.Find(FormatString.CombineAllString("RankChar", (i + 1).ToString())); goEfcRankTops[i] = trftop.GetChild(0).gameObject; charRankTops[i] = trftop.GetChild(1).GetComponent(); charRankTops[i].transform.GetChild(0).localPosition = new Vector3(0f, 0f, -10000f); imgRankTierTops[i] = trftop.Find("iconTier").GetComponent(); imgRankTierNumTops[i] = trftop.Find("iconTierNum").GetComponent(); imgRankTierTops[i].enabled = false; imgRankTierNumTops[i].enabled = false; txtRankPointTops[i] = trftop.Find("txtPoint").GetComponent(); txtRankNameTops[i] = trftop.Find("txtName").GetComponent(); } Transform trfrew = trfui.Find("popupReward"); canvasRew = trfrew.GetComponent(); txtRewCount = trfrew.Find("txtProgressT").GetChild(0).GetComponent(); btnRewGet = trfrew.Find("btnGet").GetComponent(); svRew = trfrew.Find("SvRew").GetComponent(); pvpRewItems = svRew.transform.GetChild(0).GetComponentsInChildren(true); Transform trftierrew = trfui.Find("popupTierReward"); canvasTierRew = trftierrew.GetComponent(); btnTierRewGet = trftierrew.Find("btnGet").GetComponent(); Transform trftier = trfui.Find("popupTier"); canvasTier = trftier.GetComponent(); Transform trfjoin = goCanvasJoin.transform; skAnimJoin = trfjoin.Find("skanimjoin").GetComponent(); skAnimJoin.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f); rtrfJoinMy = trfjoin.Find("bgleft").GetComponent(); imgJoinMyBg = rtrfJoinMy.GetComponent(); imgJoinMyTier = rtrfJoinMy.Find("imgMyPvp").GetComponent(); imgJoinMyTierNum = rtrfJoinMy.Find("imgMyPvpNum").GetComponent(); txtJoinMyPoint = rtrfJoinMy.Find("txtMyPoint").GetComponent(); txtJoinMyName = rtrfJoinMy.Find("txtMyName").GetComponent(); charJoinMy = rtrfJoinMy.Find("charMy").GetComponent(); charJoinMy.Init(); rtrfJoinEnemy = trfjoin.Find("bgright").GetComponent(); imgJoinEnemyBg = rtrfJoinEnemy.GetComponent(); imgJoinEnemyTier = rtrfJoinEnemy.Find("imgEnemyPvp").GetComponent(); imgJoinEnemyTierNum = rtrfJoinEnemy.Find("imgEnemyPvpNum").GetComponent(); txtJoinEnemyPoint = rtrfJoinEnemy.Find("txtEnemyPoint").GetComponent(); txtJoinEnemyName = rtrfJoinEnemy.Find("txtEnemyName").GetComponent(); charJoinEnemy = rtrfJoinEnemy.Find("charEnemy").GetComponent(); charJoinEnemy.Init(); Transform trfresult = goCanvasResult.transform; goResultRankUp = trfresult.Find("rankup").gameObject; imgResultTop = trfresult.Find("linetop").GetComponent(); imgResultBottom = trfresult.Find("linebottom").GetComponent(); imgResultTier = trfresult.Find("imgPvp").GetComponent(); imgResultTierNum = trfresult.Find("imgPvpNum").GetComponent(); txtResultTier = trfresult.Find("txtTier").GetComponent(); txtResultAdd = trfresult.Find("txtAdd").GetComponent(); txtResultPoint = trfresult.Find("txtPoint").GetComponent(); skAnimResult = trfresult.Find("skanimResult").GetComponent(); skAnimResult.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f); skAnimResultRankUp = trfresult.Find("skanimRank").GetComponent(); skAnimResultRankUp.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f); tglBattleAuto = trfBattle.Find("tglAuto").GetChild(0).GetComponent(); txtBattleMyName = trfBattle.Find("txtMyName").GetComponent(); txtBattleEnemyName = trfBattle.Find("txtEnemyName").GetComponent(); dust = canvasUI.transform.Find("all_dust").gameObject; DataHandler.UpdatePvpRank(new dPvpRank[0]); } #endregion Base #region UI public void OpenPvp() { // 해금 조건 미충족. if (!DataHandler.IsClearStage(DataHandler.Const.pvpOpenStage)) { GameUIMgr.SOpenToast(FormatString.TextOpenStageClear(DataHandler.Const.pvpOpenStage)); SoundMgr.PlaySfx(SoundName.BtnPress); return; } // 결투장 닫혀 있음. if (!DataHandler.sysPvp.isOpen) { GameUIMgr.SOpenPopup1Button(LocalizationText.GetText(Global.STR_Prepare)); return; } if (iLoading > 0) return; iLoading++; if (bInitNeed) { bInitNeed = false; Init(); // 처음 열때 유저 스펙 서버에 저장. bSpecUpdateJoin = false; dPvpSpec data = dPvpSpec.GetMyBestSpec(DataHandler.playPvp.usePreset, DataHandler.playPvp.usePetPreset, DataHandler.playPvp.useExtraPreset); SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpSpec), typeof(nIdCnt), ASpecSucc, ASpecFail, data, false); } if (bReLocalize) Localize(false); // 결투장 창 열때 아틀라스 불러오기. 아틀라스를 불러온 후에 결투장 창 열림. CoverCamera.Hold(); Addressables.LoadAssetAsync("atlasPvp").Completed += ALoadAtlasComp; SoundMgr.PlaySfx(SoundName.BtnPress); iLoading--; } // 결투장 열기 처리. private void OpenPvpComp() { SetMyInfo(); if (iSelectedTab < 0) { TabPvp(); if (DataHandler.PvpRankRefreshTime <= TimeUtils.Now()) { SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpRank), typeof(nPvpRank), ARankSucc, ARankFail, new nIdLv(), false); } SetImages(); groupRanking.SetActive(true); } btnMatch.interactable = DataHandler.playPvp.ticket > 0; canvasUI.enabled = true; GameUIMgr.SSetPvpTicket(DataHandler.playPvp.ticket); GameUIMgr.SRightWindowClose(); GameUIMgr.SOpenUpPanel(true,pvp: true,addy:6); GameUIMgr.SSetMainUiOn(false); GameUIMgr.SCloseMenu(); BattleMgr.SSetBattleUiOn(false); BattleMgr.SSetClearFailUiOn(false); BattleMgr.SSetCameraOn(false); } // 결투장 닫기. public void ClosePvp() { if (!canvasUI.enabled) return; if (iLoading > 0) return; iLoading++; CoverCamera.Hold(); canvasUI.enabled = false; GameUIMgr.SCloseUpPanel(); GameUIMgr.SSetMainUiOn(true); BattleMgr.SSetBattleUiOn(true); BattleMgr.SSetClearFailUiOn(true); BattleMgr.SSetCameraOn(true); BattleMgr.SRefreshCharCloth(); // 결투장 창 닫을때 리소스 해제. imgLobbyBg.sprite = null; imgLobbyTier.sprite = null; imgLobbyTierNum.sprite = null; imgJoinMyBg.sprite = null; imgJoinEnemyBg.sprite = null; imgJoinMyTier.sprite = null; imgJoinMyTierNum.sprite = null; imgJoinEnemyTier.sprite = null; imgJoinEnemyTierNum.sprite = null; imgResultTier.sprite = null; imgResultTierNum.sprite = null; if (!bInitNeedRank) { //ResetRankTop3(); //myRankItem.ReleaseResources(); escrRank.ReleaseResources(); } if (!bInitNeedTierRew) escrTierRew.ReleaseResources(); if (!bInitNeedTier) escrTier.ReleaseResources(); pvpImgs = null; if (handleAtlas.IsValid()) { Addressables.Release(handleAtlas); } if (iWeaponFriendly > 0) { AddressableMgr.ReleaseWeaponSpine(iWeaponFriendly); iWeaponFriendly = -1; } if (iClothFriendly > 0) { tx2dClothFriendly = null; AddressableMgr.ReleaseClothSpine(iClothFriendly); iClothFriendly = -1; } if (handleVs.IsValid()) { skAnimJoin.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f); skAnimJoin.skeletonDataAsset.Clear(); skAnimJoin.ClearState(); skAnimJoin.skeletonDataAsset = null; Addressables.Release(handleVs); } if (handleWinLose.IsValid()) { skAnimResult.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f); skAnimResult.skeletonDataAsset.Clear(); skAnimResult.ClearState(); skAnimResult.skeletonDataAsset = null; Addressables.Release(handleWinLose); } if (handleRankUp.IsValid()) { skAnimResultRankUp.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f); skAnimResultRankUp.skeletonDataAsset.Clear(); skAnimResultRankUp.ClearState(); skAnimResultRankUp.skeletonDataAsset = null; Addressables.Release(handleRankUp); } AddressableMgr.SAddUnload(); groupRanking.SetActive(false); CoverCamera.Release(); SoundMgr.PlaySfx(SoundName.BtnPress); dust.SetActive(false); iLoading--; } // 통신 실패 - 스펙. private void ASpecFail(SvError error, object request) { if (bSpecUpdateJoin) { bSpecUpdateJoin = false; JoinPvpStart(); } } // 통신 성공 - 스펙. private void ASpecSucc(object result, object request) { if (bSpecUpdateJoin) { bSpecUpdateJoin = false; JoinPvpStart(); } } // 결투장 랭킹 이미지 가져오기 public static Sprite SGetRankImg(int rank) { if (rank > 3) return null; return pvpImgs.GetSprite(FormatString.CombineAll("rank", rank)); } // 결투장 티어 이미지 가져오기 public static Sprite SGetTierImg(int itier) { if (pvpImgs == null) return null; itier = (itier - 1) / 3 + 1; return pvpImgs.GetSprite(itier.ToString()); } // 결투장 티어 번호 이미지 가져오기 public static Sprite SGetTierNumImg(int itier) { if (pvpImgs == null) return null; itier = (itier - 1) % 3; return pvpImgs.GetSprite(FormatString.CombineAllString("n", itier.ToString())); } // 결투장 이미지 가져오기 public static Sprite SGetPvpImg(string strpath) { if (pvpImgs == null) return null; return pvpImgs.GetSprite(strpath); } // 어드레서블 결투장 이미지 불러왔을때 처리. private void ALoadAtlasComp(AsyncOperationHandle obj) { pvpImgs = obj.Result; handleAtlas = obj; OpenPvpComp(); CoverCamera.Release(); } #endregion UI #region Pvp Info // 내 정보 세팅. private void SetMyInfo() { int irp = DataHandler.playPvp.point; int itier = DataHandler.pvpMyRank.tier; int irank = DataHandler.pvpMyRank.rank; imgLobbyChar.sprite = AddressableMgr.GetPlayerIcon(DataHandler.PlayData.playerIcon); imgLobbyTier.sprite = SGetTierImg(itier); imgLobbyTierNum.sprite = SGetTierNumImg(itier); setTierMyInfo(itier); txtLv.text = FormatString.TextLv(DataHandler.PlayData.playerLv); txtName.text = DataHandler.PlayData.playerName; txtRank.text = FormatString.TextRank(irank); txtTier.text = LocalizationText.GetText(FormatString.CombineAllString("tier", itier.ToString())); txtRp.text = FormatString.TextRp(irp); int iavailrew = DataHandler.playPvp.availWeeklyIndex < 0 ? 0 : DataHandler.GetPvpReward(DataHandler.playPvp.availWeeklyIndex).id; goBadgeRew.SetActive(iavailrew > DataHandler.playPvp.rewardWeekly); goBadgeTier.SetActive(DataHandler.pvpMyRank.tier > DataHandler.playPvp.rewardTier); #region Effects dPvpTier tier = DataHandler.GetPvpTier(itier); if (tier.abilityType1 == eEffectType.None) { goEffects[0].SetActive(false); } else { txtEffectTs[0].text = FormatString.TextEffectTitle(tier.abilityType1); txtEffectValues[0].text = FormatString.TextEffectValue(tier.abilityType1, tier.abilityValue1); goEffects[0].SetActive(true); } if (tier.abilityType2 == eEffectType.None) { goEffects[1].SetActive(false); } else { txtEffectTs[1].text = FormatString.TextEffectTitle(tier.abilityType2); txtEffectValues[1].text = FormatString.TextEffectValue(tier.abilityType2, tier.abilityValue2); goEffects[1].SetActive(true); } if (tier.abilityType3 == eEffectType.None) { goEffects[2].SetActive(false); } else { txtEffectTs[2].text = FormatString.TextEffectTitle(tier.abilityType3); txtEffectValues[2].text = FormatString.TextEffectValue(tier.abilityType3, tier.abilityValue3); goEffects[2].SetActive(true); } if (tier.abilityType4 == eEffectType.None) { goEffects[3].SetActive(false); } else { txtEffectTs[3].text = FormatString.TextEffectTitle(tier.abilityType4); txtEffectValues[3].text = FormatString.TextEffectValue(tier.abilityType4, tier.abilityValue4); goEffects[3].SetActive(true); } #endregion Effects } // 탭 전환 시 이미지 세팅. private void SetImages() { if (iSelectedTab == 0) { imgLobbyBg.sprite = SGetPvpImg("bglobby"); escrRank.ReleaseResources(); } else { imgLobbyBg.sprite = null; } } // 팝업 여닫을때 반짝이는 연출 재생. private void ReloadShineEffect() { if (canvasRew.enabled) { iShineMode = 0; StartCoroutine(nameof(CoShineEffect)); } else if (canvasTierRew.enabled) { iShineMode = 1; StartCoroutine(nameof(CoShineEffect)); } else { iShineMode = -1; StopCoroutine(nameof(CoShineEffect)); } } // 반짝이는 연출. private IEnumerator CoShineEffect() { float fvalue = 1f; // 주간 보상. if (iShineMode == 0) { while (true) { for (int i = 0; i < pvpRewItems.Length; i++) pvpRewItems[i].SetFloat(fvalue); yield return YieldInstructionCache.WaitForSeconds(0.05f); fvalue -= 0.08f; if (fvalue < 0f) { fvalue = 1f; yield return YieldInstructionCache.WaitForSeconds(3f); } } } // 티어 보상. else { while (true) { escrTierRew.SetFloat(fvalue); yield return YieldInstructionCache.WaitForSeconds(0.05f); fvalue -= 0.08f; if (fvalue < 0f) { fvalue = 1f; yield return YieldInstructionCache.WaitForSeconds(3f); } } } } #endregion Pvp Info #region Tab // 탭. public void TabPvp() { SoundMgr.PlaySfx(SoundName.BtnPress); groupLobby.SetActive(true); groupRanking.SetActive(true); if (bInitNeedRank) { for (int i = 0; i < 3; i++) { charRankTops[i].Init(); } iWeaponRankTops = new int[3] { -1, -1, -1 }; iIconRankTops = new int[3] { -1, -1, -1 }; tx2dClothRankTops = new Texture2D[3]; EnhancedUI.SmallList list = new EnhancedUI.SmallList(); for (int i = 1; i <= 100; i++) list.Add(i); escrRank.LoadDatas(list); SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpRank), typeof(nPvpRank), ARankSucc, ARankFail, new nIdLv(), false); } else { // 랭킹 갱신 시간 체크해서 필요시 갱신. if (DataHandler.PvpRankRefreshTime <= TimeUtils.Now()) { SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpRank), typeof(nPvpRank), ARankSucc, ARankFail, new nIdLv(), false); } } SetImages(); } #endregion Tab #region Rank // 탑3 캐릭터 코스튬 표시(코스튬 리소스 로드 완료시 호출). private void UpdateRankTop3Costume() { if (iCosTopLoad > 0) return; CoverCamera.Hold(); StartCoroutine(nameof(CoUpdateRankTop3Costume)); } private IEnumerator CoUpdateRankTop3Costume() { if (bInitNeedRankCos) { bInitNeedRankCos = false; for (int i = 0; i < 3; i++) { if (!DataHandler.TryGetPvpRank(i + 1, out dPvpRank rank)) continue; charRankTops[i].SetCostume(tx2dClothRankTops[i]); } } yield return null; for (int i = 0; i < 3; i++) { if (!DataHandler.TryGetPvpRank(i + 1, out dPvpRank rank)) { charRankTops[i].gameObject.SetActive(false); continue; } charRankTops[i].gameObject.SetActive(true); charRankTops[i].SetCostume(tx2dClothRankTops[i]); charRankTops[i].transform.GetChild(0).localPosition = Vector3.zero; } CoverCamera.Release(); } private void ALoadClothComp1(Texture2D obj) { tx2dClothRankTops[0] = obj; iCosTopLoad--; UpdateRankTop3Costume(); CoverCamera.Release(); } private void ALoadClothComp2(Texture2D obj) { tx2dClothRankTops[1] = obj; iCosTopLoad--; UpdateRankTop3Costume(); CoverCamera.Release(); } private void ALoadClothComp3(Texture2D obj) { tx2dClothRankTops[2] = obj; iCosTopLoad--; UpdateRankTop3Costume(); CoverCamera.Release(); } private void ALoadWeaponComp1(Skin obj) { charRankTops[0].SetWeapon(obj); iCosTopLoad--; UpdateRankTop3Costume(); CoverCamera.Release(); } private void ALoadWeaponComp2(Skin obj) { charRankTops[1].SetWeapon(obj); iCosTopLoad--; UpdateRankTop3Costume(); CoverCamera.Release(); } private void ALoadWeaponComp3(Skin obj) { charRankTops[2].SetWeapon(obj); iCosTopLoad--; UpdateRankTop3Costume(); CoverCamera.Release(); } // 통신 실패 - 랭킹. private void ARankFail(SvError error, object request) { } // 통신 성공 - 랭킹. private void ARankSucc(object result, object request) { nPvpRank data = result as nPvpRank; if (data == null || data.myRank == null || data.topRank == null) { ARankFail(new SvError(eErrorCode.NULL_OR_EMPTY), request); return; } DataHandler.UpdatePvpMyRank(data.myRank); DataHandler.UpdatePvpRank(data.topRank); bInitNeedRank = false; SetMyInfo(); //SetRankTop3(); escrRank.scroller.RefreshActiveCellViews(); } #endregion Rank #region Popup Reward // 주간 보상 팝업 열기. public void OpenReward() { if (iLoading > 0) return; iLoading++; canvasRew.enabled = true; if (bInitNeedRew) { bInitNeedRew = false; for (int i = 0; i < pvpRewItems.Length; i++) { pvpRewItems[i].InitCell(); pvpRewItems[i].SetData(i); } } else { for (int i = 0; i < pvpRewItems.Length; i++) { pvpRewItems[i].SetData(i); } } if (DataHandler.playPvp.availWeeklyIndex < 3) svRew.horizontalNormalizedPosition = 0f; else svRew.horizontalNormalizedPosition = 1f; txtRewCount.text = FormatString.TextInt(DataHandler.playPvp.weeklyTry); btnRewGet.interactable = goBadgeRew.activeSelf; ReloadShineEffect(); SoundMgr.PlaySfx(SoundName.BtnPress); iLoading--; } // 주간 보상 팝업 닫기. public void CloseReward() { if (iLoading > 0) return; iLoading++; canvasRew.enabled = false; ReloadShineEffect(); iLoading--; } public static void SGetReward() { curMgr.BtnGetReward(); } // 주간 보상 받기. public void BtnGetReward() { if (iLoading > 0) return; int iavailrew = DataHandler.playPvp.availWeeklyIndex < 0 ? 0 : DataHandler.GetPvpReward(DataHandler.playPvp.availWeeklyIndex).id; if (iavailrew <= DataHandler.playPvp.rewardWeekly) return; iLoading++; nIdLv data = new nIdLv(iavailrew); SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpRew), typeof(nPvpRewReturn), ARewSucc, ARewFail, data, true); } // 통신 실패 - 주간 보상. private void ARewFail(SvError error, object request) { iLoading--; } // 통신 성공 - 주간 보상. private void ARewSucc(object result, object request) { nPvpRewReturn data = result as nPvpRewReturn; if (data == null || data.playCurrency == null || data.playPvp == null) { ARewFail(new SvError(eErrorCode.NULL_OR_EMPTY), request); return; } DataHandler.AddGoods(data.result, data.playCurrency, true); DataHandler.UpdatePvpPlay(data.playPvp); for (int i = 0; i < pvpRewItems.Length; i++) { pvpRewItems[i].SetData(i); } int iavailrew = DataHandler.playPvp.availWeeklyIndex < 0 ? 0 : DataHandler.GetPvpReward(DataHandler.playPvp.availWeeklyIndex).id; goBadgeRew.SetActive(iavailrew > DataHandler.playPvp.rewardWeekly); btnRewGet.interactable = goBadgeRew.activeSelf; GameUIMgr.SOpenPopupGoods(data.result); iLoading--; } #endregion Popup Reward #region Popup Tier Reward // 티어 보상 팝업 열기. public void OpenTierReward() { if (iLoading > 0) return; iLoading++; canvasTierRew.enabled = true; if (bInitNeedTierRew) { bInitNeedTierRew = false; tierList = new EnhancedUI.SmallList(); int ilen = DataHandler.GetPvpTiers().Length; for (int i = 0; i < ilen; i++) tierList.Add(i); escrTierRew.LoadDatas(tierList); } else { escrTierRew.scroller.RefreshActiveCellViews(); } float fpos = escrTierRew.scroller.GetScrollPositionForDataIndex(DataHandler.pvpMyRank.tier - 1, EnhancedUI.EnhancedScroller.EnhancedScroller.CellViewPositionEnum.Before); escrTierRew.scroller.SetScrollPositionImmediately(fpos); btnTierRewGet.interactable = goBadgeTier.activeSelf; SoundMgr.PlaySfx(SoundName.BtnPress); ReloadShineEffect(); iLoading--; } // 티어 보상 팝업 닫기. public void CloseTierReward() { if (iLoading > 0) return; iLoading++; canvasTierRew.enabled = false; ReloadShineEffect(); iLoading--; } public static void SGetTierReward() { curMgr.BtnGetTierReward(); } // 티어 보상 받기. public void BtnGetTierReward() { if (iLoading > 0) return; if (DataHandler.pvpMyRank.tier <= DataHandler.playPvp.rewardTier) return; iLoading++; nIdLv data = new nIdLv(DataHandler.pvpMyRank.tier); SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpTierRew), typeof(nPvpRewReturn), ATierRewSucc, ATierRewFail, data, true); } // 통신 실패 - 티어 보상. private void ATierRewFail(SvError error, object request) { iLoading--; } // 통신 성공 - 티어 보상. private void ATierRewSucc(object result, object request) { nPvpRewReturn data = result as nPvpRewReturn; if (data == null || data.playCurrency == null || data.playPvp == null) { ATierRewFail(new SvError(eErrorCode.NULL_OR_EMPTY), request); return; } DataHandler.AddGoods(data.result, data.playCurrency, true); DataHandler.UpdatePvpPlay(data.playPvp); escrTierRew.scroller.RefreshActiveCellViews(); goBadgeTier.SetActive(DataHandler.pvpMyRank.tier > DataHandler.playPvp.rewardTier); btnTierRewGet.interactable = goBadgeTier.activeSelf; GameUIMgr.SOpenPopupGoods(data.result); iLoading--; } #endregion Popup Tier Reward #region Popup Tier // 티어 팝업 열기. public void OpenTier() { if (iLoading > 0) return; iLoading++; canvasTier.enabled = true; if (bInitNeedTier) { bInitNeedTier = false; escrTier.LoadDatas(tierList); } else { escrTier.scroller.RefreshActiveCellViews(); } float fpos = escrTier.scroller.GetScrollPositionForDataIndex(DataHandler.pvpMyRank.tier - 1, EnhancedUI.EnhancedScroller.EnhancedScroller.CellViewPositionEnum.Before); escrTier.scroller.SetScrollPositionImmediately(fpos); iLoading--; } // 티어 팝업 닫기. public void CloseTier() { if (iLoading > 0) return; iLoading++; canvasTier.enabled = false; iLoading--; } #endregion Popup Tier #region Join // 결투장 매칭 입장. public void JoinPvp() { if (iLoading > 0) return; SoundMgr.PlaySfx(SoundName.BtnPress); // 기존 프리셋 보존. GameUIMgr.SPreservePreset(DataHandler.PlayData.usePreset, DataHandler.PlayData.usePetPreset, DataHandler.PlayAwaken.usePreset); // 프리셋 선택. GameUIMgr.SOpenPopupPreset(DataHandler.playPvp.usePreset, DataHandler.playPvp.usePetPreset, DataHandler.playPvp.useExtraPreset, APresetSelected); } // 결투장 매칭 입장. private void APresetSelected() { int iskillpreset = GameUIMgr.SGetSkillPreset(); int ipetpreset = GameUIMgr.SGetPetPreset(); int iawakenpreset = GameUIMgr.SGetAwakenPreset(); // 프리셋이 다를 경우 유저 스펙 서버에 저장. if (iskillpreset != DataHandler.playPvp.usePreset || ipetpreset != DataHandler.playPvp.usePetPreset || iawakenpreset != DataHandler.playPvp.useExtraPreset) { DataHandler.UpdatePvpPreset(iskillpreset, ipetpreset, iawakenpreset); bSpecUpdateJoin = true; dPvpSpec data = dPvpSpec.GetMyBestSpec(iskillpreset, ipetpreset, iawakenpreset); SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpSpec), typeof(nIdCnt), ASpecSucc, ASpecFail, data, false); } else { JoinPvpStart(); } } // 결투장 입장 통신 시작. private void JoinPvpStart() { iLoading++; CoverCamera.Hold(); SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpJoin), typeof(nPvpJoinReturn), AJoinSucc, AJoinFail, new nIdCnt(), false); } // 통신 성공 - 입장. private void AJoinSucc(object result, object request) { nPvpJoinReturn data = result as nPvpJoinReturn; if (data == null || data.playPvp == null || data.vsBattleInfo == null) { AJoinFail(new SvError(eErrorCode.NULL_OR_EMPTY), request); return; } iEnemyUserId = data.vsUserId; specEnemy = data.vsBattleInfo; DataHandler.UpdatePvpPlay(data.playPvp); GameUIMgr.SSetPvpTicket(data.playPvp.ticket); btnMatch.interactable = data.playPvp.ticket > 0; imgJoinMyBg.sprite = SGetPvpImg("vsblue"); imgJoinEnemyBg.sprite = SGetPvpImg("vsred"); imgJoinMyTier.sprite = imgLobbyTier.sprite; imgJoinMyTierNum.sprite = imgLobbyTierNum.sprite; txtJoinMyPoint.text = txtRp.text; txtJoinMyName.text = txtName.text; imgJoinEnemyTier.sprite = SGetTierImg(data.vsRank.tier); imgJoinEnemyTierNum.sprite = SGetTierNumImg(data.vsRank.tier); setTierNum(DataHandler.pvpMyRank.tier); setTierNum(data.vsRank.tier, true); txtJoinEnemyPoint.text = FormatString.TextRp(data.vsRank.point); txtJoinEnemyName.text = data.vsRank.playerName; tglBattleAuto.SetIsOnWithoutNotify(tglAuto.isOn); txtBattleMyName.text = txtJoinMyName.text; txtBattleEnemyName.text = txtJoinEnemyName.text; rtrfJoinMy.anchoredPosition = new Vector2(-820f, 0f); rtrfJoinEnemy.anchoredPosition = new Vector2(820f, 0f); skAnimJoin.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f); goCanvasJoin.SetActive(true); // 내 코스튬 로드. if (iClothFriendly != DataHandler.PlayEquipCostume.outfitId) { iCosTopLoad++; iClothFriendly = DataHandler.PlayEquipCostume.outfitId; AddressableMgr.LoadClothSpine(iClothFriendly, ALoadClothFriendly); } if (iWeaponFriendly != DataHandler.PlayEquipCostume.weaponId) { iCosTopLoad++; iWeaponFriendly = DataHandler.PlayEquipCostume.weaponId; AddressableMgr.LoadWeaponSpine(iWeaponFriendly, ALoadWeaponFriendly); } // 상대 코스튬 로드. iCosTopLoad += 2; AddressableMgr.LoadClothSpine(specEnemy.costumeView, ALoadClothEnemy); AddressableMgr.LoadWeaponSpine(specEnemy.weaponView, ALoadWeaponEnemy); // 애니메이션 로드. if (!handleVs.IsValid()) Addressables.LoadAssetAsync("spine/VS/VS_SkeletonData.asset").Completed += ALoadVsComp; // 내 스킬 프리셋. int iskillpreset = GameUIMgr.SGetSkillPreset(); if (iskillpreset != DataHandler.PlayData.usePreset) { DataHandler.PlayData.usePreset = iskillpreset; } // 내 펫 프리셋. int ipetpreset = GameUIMgr.SGetPetPreset(); if (ipetpreset != DataHandler.PlayData.usePetPreset) { DataHandler.PlayData.usePetPreset = ipetpreset; BattleMgr.SSetPet(ipetpreset); } // 내 각성 프리셋. int iawakenpreset = GameUIMgr.SGetAwakenPreset(); if (iawakenpreset != DataHandler.PlayAwaken.usePreset) { DataHandler.PlayAwaken.usePreset = iawakenpreset; } StartCoroutine(nameof(CoBattleJoin)); dust.SetActive(false); iLoading--; } // 통신 실패 - 입장. private void AJoinFail(SvError error, object request) { CoverCamera.Release(); iLoading--; } private void setTierNum(int tier, bool isEnemy = false) { if (tier <= 9) { if (isEnemy) imgJoinEnemyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinEnemyTier.rectTransform.anchoredPosition.x - 2, imgJoinEnemyTier.rectTransform.anchoredPosition.y + 3, 0); else imgJoinMyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinMyTier.rectTransform.anchoredPosition.x - 2, imgJoinMyTier.rectTransform.anchoredPosition.y + 3, 0); } else if (tier <= 12) { if (isEnemy) imgJoinEnemyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinEnemyTier.rectTransform.anchoredPosition.x - 1, imgJoinEnemyTier.rectTransform.anchoredPosition.y + 7, 0); else imgJoinMyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinMyTier.rectTransform.anchoredPosition.x - 1, imgJoinMyTier.rectTransform.anchoredPosition.y + 7, 0); } else if (tier <= 30) { if (isEnemy) imgJoinEnemyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinEnemyTier.rectTransform.anchoredPosition.x, imgJoinEnemyTier.rectTransform.anchoredPosition.y + 2, 0); else imgJoinMyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinMyTier.rectTransform.anchoredPosition.x, imgJoinMyTier.rectTransform.anchoredPosition.y + 2, 0); } else if (tier <= 48) { if (isEnemy) imgJoinEnemyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinEnemyTier.rectTransform.anchoredPosition.x, imgJoinEnemyTier.rectTransform.anchoredPosition.y, 0); else imgJoinMyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinMyTier.rectTransform.anchoredPosition.x, imgJoinMyTier.rectTransform.anchoredPosition.y, 0); } else if (tier <= 51) { if (isEnemy) imgJoinEnemyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinEnemyTier.rectTransform.anchoredPosition.x, imgJoinEnemyTier.rectTransform.anchoredPosition.y + 2, 0); else imgJoinMyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinMyTier.rectTransform.anchoredPosition.x, imgJoinMyTier.rectTransform.anchoredPosition.y + 2, 0); } else if (tier <= 57) { if (isEnemy) imgJoinEnemyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinEnemyTier.rectTransform.anchoredPosition.x, imgJoinEnemyTier.rectTransform.anchoredPosition.y - 3, 0); else imgJoinMyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinMyTier.rectTransform.anchoredPosition.x, imgJoinMyTier.rectTransform.anchoredPosition.y - 3, 0); } } private void setTierResultNum(int tier) { if (tier <= 9) imgResultTierNum.rectTransform.anchoredPosition = new Vector3(imgResultTier.rectTransform.anchoredPosition.x - 2, imgResultTier.rectTransform.anchoredPosition.y + 3, 0); else if (tier <= 12) imgResultTierNum.rectTransform.anchoredPosition = new Vector3(imgResultTier.rectTransform.anchoredPosition.x - 1, imgResultTier.rectTransform.anchoredPosition.y + 7, 0); else if (tier <= 30) imgResultTierNum.rectTransform.anchoredPosition = new Vector3(imgResultTier.rectTransform.anchoredPosition.x, imgResultTier.rectTransform.anchoredPosition.y + 2, 0); else if (tier <= 48) imgResultTierNum.rectTransform.anchoredPosition = new Vector3(imgResultTier.rectTransform.anchoredPosition.x, imgResultTier.rectTransform.anchoredPosition.y, 0); else if (tier <= 51) imgResultTierNum.rectTransform.anchoredPosition = new Vector3(imgResultTier.rectTransform.anchoredPosition.x, imgResultTier.rectTransform.anchoredPosition.y + 2, 0); else if (tier <= 57) imgResultTierNum.rectTransform.anchoredPosition = new Vector3(imgResultTier.rectTransform.anchoredPosition.x, imgResultTier.rectTransform.anchoredPosition.y - 3, 0); } private void setTierMyInfo(int tier) { if (tier <= 9) imgLobbyTierNum.rectTransform.anchoredPosition = new Vector3(imgLobbyTier.rectTransform.anchoredPosition.x - 4, imgLobbyTier.rectTransform.anchoredPosition.y + 3, 0); else if (tier <= 12) imgLobbyTierNum.rectTransform.anchoredPosition = new Vector3(imgLobbyTier.rectTransform.anchoredPosition.x - 1, imgLobbyTier.rectTransform.anchoredPosition.y + 7, 0); else if (tier <= 30) imgLobbyTierNum.rectTransform.anchoredPosition = new Vector3(imgLobbyTier.rectTransform.anchoredPosition.x, imgLobbyTier.rectTransform.anchoredPosition.y + 2, 0); else if (tier <= 48) imgLobbyTierNum.rectTransform.anchoredPosition = new Vector3(imgLobbyTier.rectTransform.anchoredPosition.x, imgLobbyTier.rectTransform.anchoredPosition.y, 0); else if (tier <= 51) imgLobbyTierNum.rectTransform.anchoredPosition = new Vector3(imgLobbyTier.rectTransform.anchoredPosition.x, imgLobbyTier.rectTransform.anchoredPosition.y + 2, 0); else if (tier <= 57) imgLobbyTierNum.rectTransform.anchoredPosition = new Vector3(imgLobbyTier.rectTransform.anchoredPosition.x, imgLobbyTier.rectTransform.anchoredPosition.y - 5, 0); } private IEnumerator CoBattleJoin() { // 리소스 로딩 대기. while (iCosTopLoad > 0 || !handleVs.IsValid()) yield return YieldInstructionCache.WaitForSeconds(0.1f); BattleMgr.SContetnUnlockCloseAll(); // 데이터 계산. 생명력 보정. dPvpSpec specmy = dPvpSpec.GetMyBestSpec(DataHandler.playPvp.usePreset, DataHandler.playPvp.usePetPreset, DataHandler.playPvp.useExtraPreset); specEnemy.CalcSkillCool(); //BigInteger bihpcalc = ((specmy.charAtk + specEnemy.charAtk) / 2L) * 20L / ((specmy.charHp + specEnemy.charHp) / 2L); //specmy.charHp *= bihpcalc; //specEnemy.charHp *= bihpcalc; //BattleMgr 전투 중지, 데이터 세팅. BattleMgr.SPreparePvp(specmy, specEnemy); yield return null; // 코스튬 세팅. if (bInitNeedBattleCos) { charJoinMy.SetCostume(tx2dClothFriendly); charJoinEnemy.SetCostume(tx2dClothEnemy); } yield return null; charJoinMy.SetCostume(tx2dClothFriendly); charJoinEnemy.SetCostume(tx2dClothEnemy); // 전투 코스튬. BattleMgr.SSetEnemyCostume(specEnemy.weaponView, specEnemy.costumeView, specEnemy.colorHair, specEnemy.colorTop, specEnemy.colorEye); rtrfJoinMy.DOLocalMoveX(700f, 0.25f).SetRelative().SetEase(Ease.InQuad); rtrfJoinEnemy.DOLocalMoveX(-700f, 0.25f).SetRelative().SetEase(Ease.InQuad); yield return null; // UI. canvasUI.enabled = false; GameUIMgr.SCloseUpPanel(); GameUIMgr.SSetMainUiOn(true); BattleMgr.SSetBattleUiOn(true); BattleMgr.SSetClearFailUiOn(false); BattleMgr.SSetCameraOn(true); GameUIMgr.SSetMainUiGroupRight(false, true, true, false); GameUIMgr.SSetMainUiGroupLeft(false, false, false); // VS 연출. skAnimJoin.skeletonDataAsset = handleVs.Result; skAnimJoin.Initialize(true); skAnimJoin.UnscaledTime = true; skAnimJoin.AnimationState.SetAnimation(0, "start", false); skAnimJoin.transform.localScale = Vector3.one; yield return YieldInstructionCache.WaitForSeconds(1.8f); //전투 시작. goCanvasJoin.SetActive(false); yield return YieldInstructionCache.WaitForSeconds(0.7f); BattleMgr.SStartPvp(); CoverCamera.Release(); // 입장시에 표시한 상대 코스튬 리소스 해제. tx2dClothEnemy = null; AddressableMgr.ReleaseClothSpine(specEnemy.costumeView); AddressableMgr.ReleaseWeaponSpine(specEnemy.weaponView); } // 내 의상 리소스 로드. private void ALoadClothFriendly(Texture2D obj) { tx2dClothFriendly = obj; iCosTopLoad--; } // 내 무기 리소스 로드. private void ALoadWeaponFriendly(Skin obj) { charJoinMy.SetWeapon(obj); iCosTopLoad--; } // 적 의상 리소스 로드. private void ALoadClothEnemy(Texture2D obj) { tx2dClothEnemy = obj; iCosTopLoad--; } // 적 무기 리소스 로드. private void ALoadWeaponEnemy(Skin obj) { charJoinEnemy.SetWeapon(obj); iCosTopLoad--; } // VS 연출 로드. private void ALoadVsComp(AsyncOperationHandle obj) { MeshRenderer renderer = skAnimJoin.GetComponent(); renderer.sortingLayerID = canvasUI.sortingLayerID; renderer.sortingOrder = 106; handleVs = obj; CoverCamera.Release(); } #endregion Join #region Result // 결투장 나가기 버튼. public void ExitPvp() { GameUIMgr.SOpenPopup2Button(LocalizationText.GetText("msg_exitnoreward"), AExitPvp, igroup: cGoods.TPvpTicket); SoundMgr.PlaySfx(SoundName.BtnPress); } // 결투장 도중 종료. private void AExitPvp() { iLoading++; CoverCamera.Hold(); tglAuto.SetIsOnWithoutNotify(false); canvasUI.enabled = true; goCanvasResult.SetActive(false); GameUIMgr.SSetPvpTicket(DataHandler.playPvp.ticket); GameUIMgr.SOpenUpPanel(pvp: true); GameUIMgr.SSetMainUiOn(false); GameUIMgr.SCloseMenu(); BattleMgr.SSetBattleUiOn(false); BattleMgr.SSetClearFailUiOn(false); BattleMgr.SSetCameraOn(false); GameUIMgr.SSetMainUiGroupRight(true, true, false, true); GameUIMgr.SSetMainUiGroupLeft(true, true, true); GameUIMgr.SReturnToPreservePreset(); BattleMgr.SExitPvp(); //dust.SetActive(true); imgResultWin.gameObject.SetActive(false); imgResultLose.gameObject.SetActive(false); CoverCamera.Release(); iLoading--; } public static void SResultPvp(int iresult, int imyhprate, int ienemyhprate, BigInteger bimydmg, BigInteger bienemydmg) { curMgr.ResultPvp(iresult, imyhprate, ienemyhprate, bimydmg, bienemydmg); } // 결투장 결과 처리. iresult 1: 승리, 2: 패배. private void ResultPvp(int iresult, int imyhprate, int ienemyhprate, BigInteger bimydmg, BigInteger bienemydmg) { iLoading++; CoverCamera.Hold(); nPvpBattleRequest data = new nPvpBattleRequest(); data.vsUserId = iEnemyUserId; data.battleResult = iresult; data.damageRatio = 100 - ienemyhprate; data.vsDamageRatio = 100 - imyhprate; data.battleDmg = bimydmg; data.vsBattleDmg = bienemydmg; SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpResult), typeof(nPvpBattleReturn), AResultSucc, AResultFail, data, false); } // 통신 실패 - 결과. private void AResultFail(SvError error, object request) { canvasUI.enabled = true; CoverCamera.Release(); iLoading--; } // 통신 성공 - 결과. private void AResultSucc(object result, object request) { nPvpBattleReturn data = result as nPvpBattleReturn; if (data == null || data.playPvp == null || data.rankPvp == null) { AResultFail(new SvError(eErrorCode.NULL_OR_EMPTY), request); return; } nPvpBattleRequest reqdata = request as nPvpBattleRequest; tglAuto.SetIsOnWithoutNotify(tglBattleAuto.isOn); if (data.playPvp.ticket <= 0) tglAuto.SetIsOnWithoutNotify(false); // 결과 UI 표시. goCanvasResult.SetActive(true); if (data.rankPvp.tier != DataHandler.pvpMyRank.tier) { skAnimResultRankUp.gameObject.SetActive(true); if (!handleRankUp.IsValid()) Addressables.LoadAssetAsync("spine/RankUp_top/RankUp_top_SkeletonData.asset").Completed += ALoadRankUpComp; goResultRankUp.SetActive(true); imgResultTier.sprite = SGetTierImg(data.rankPvp.tier); imgResultTierNum.sprite = SGetTierNumImg(data.rankPvp.tier); setTierResultNum(data.rankPvp.tier); txtResultTier.text = LocalizationText.GetText(FormatString.CombineAllString("tier", data.rankPvp.tier.ToString())); } else { skAnimResultRankUp.gameObject.SetActive(false); goResultRankUp.SetActive(false); imgResultTier.sprite = imgLobbyTier.sprite; imgResultTierNum.sprite = imgLobbyTierNum.sprite; setTierResultNum(data.rankPvp.tier); txtResultTier.text = txtTier.text; } if (!handleWinLose.IsValid()) Addressables.LoadAssetAsync("spine/win_lose/win_lose_SkeletonData.asset").Completed += ALoadWinLoseComp; // 승리. if (reqdata.battleResult == 1) { imgResultTop.color = new Color(241f / 255f, 174f / 255f, 42f / 255f, 1f); txtResultAdd.text = DataHandler.sysPvp.pointClear.ToString(); imgResultWin.gameObject.SetActive(true); imgResultLose.gameObject.SetActive(false); } // 패배. else { imgResultTop.color = new Color(147f / 255f, 147f / 255f, 147f / 255f, 1f); txtResultAdd.text = DataHandler.sysPvp.pointFail.ToString(); imgResultWin.gameObject.SetActive(false); imgResultLose.gameObject.SetActive(true); } imgResultBottom.color = imgResultTop.color; txtResultPoint.text = FormatString.TextInt(data.playPvp.point); iEnemyUserId = -1; specEnemy = null; DataHandler.UpdatePvpPlay(data.playPvp); DataHandler.UpdatePvpMyRank(data.rankPvp); SetMyInfo(); //dust.SetActive(true); StartCoroutine(CoOpenResult(reqdata.battleResult == 1)); } private IEnumerator CoOpenResult(bool bwin) { while (!handleWinLose.IsValid()) yield return YieldInstructionCache.WaitForSeconds(0.1f); if (bwin) { skAnimResult.AnimationState.SetAnimation(0, "win_start", false); skAnimResult.transform.localScale = Vector3.one; yield return YieldInstructionCache.WaitForSeconds(0.765f); skAnimResult.AnimationState.SetAnimation(0, "win_loop", true); yield return null; } else { skAnimResult.AnimationState.SetAnimation(0, "lose_start", false); skAnimResult.transform.localScale = Vector3.one; yield return YieldInstructionCache.WaitForSeconds(0.3f); } // 남은 티켓 수 확인하여 n초 후 다시 매칭. 대기 시간 도중에 결과 팝업 끌 수 없음. if (tglAuto.isOn) { yield return YieldInstructionCache.WaitForSeconds(1.5f); goCanvasResult.SetActive(false); JoinPvpStart(); } CoverCamera.Release(); iLoading--; } public void CloseResult() { if (iLoading > 0) return; AExitPvp(); } // WinLose 연출 로드. private void ALoadWinLoseComp(AsyncOperationHandle obj) { MeshRenderer renderer = skAnimResult.GetComponent(); renderer.sortingLayerID = canvasUI.sortingLayerID; renderer.sortingOrder = 106; skAnimResult.skeletonDataAsset = obj.Result; skAnimResult.Initialize(true); skAnimResult.UnscaledTime = true; handleWinLose = obj; CoverCamera.Release(); } // RankUp 연출 로드. private void ALoadRankUpComp(AsyncOperationHandle obj) { MeshRenderer renderer = skAnimResultRankUp.GetComponent(); renderer.sortingLayerID = canvasUI.sortingLayerID; renderer.sortingOrder = 106; skAnimResultRankUp.skeletonDataAsset = obj.Result; skAnimResultRankUp.Initialize(true); skAnimResultRankUp.UnscaledTime = true; skAnimResultRankUp.AnimationState.SetAnimation(0, "animation", false); skAnimResultRankUp.transform.localScale = Vector3.one; handleRankUp = obj; CoverCamera.Release(); } #endregion Result }