using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class PKMatchingView : MonoBehaviour { [SerializeField] Sprite[] matchHeadBGList; float waitingTime = 0; SocketPlayer socketPlayer; //邀请者需要输入的信息 public PKFriendInfoPack pkFriendInfoPack = null; [NonSerialized] public bool isFriendPKInviter; //被邀请者需要输入的信息 [NonSerialized] public int targetJoinRoomID; [NonSerialized] public bool isFriendPKInvitee; public static PKMatchingView Create() { GameObject o = GameObject.Instantiate(GameObject.Find("WindowViews").transform.Find("PKMatchingView").gameObject); o.SetActive(true); return o.GetComponent(); } void Start() { Sprite avatar = RoleMgr.GetAvatar(LoginMgr.myUserInfo.avatarID); string nickname = LoginMgr.myUserInfo.nickname; RenderPlayerInfo(1, avatar, nickname, true); RenderPlayerInfo(2, null, "", false); if (isFriendPKInviter || isFriendPKInvitee) { RenderTip("正在等待好友加入游戏···"); } else { RenderTip("正在搜索实力相当的对手···"); } socketPlayer = new GameObject("SocketPlayer").AddComponent(); socketPlayer.onLoad_ = () => { socketPlayer.UploadPlayerInfo(); if (isFriendPKInviter) { socketPlayer.CreateFriendPKRoom(); } else if (isFriendPKInvitee) { socketPlayer.JoinFriendPKRoom(targetJoinRoomID); } else { socketPlayer.RandomMatchRoom(); } }; socketPlayer.onCreateFriendPKRoom = (roomID) => { UserPlayer.ins.call("friendComp.invitePK", pkFriendInfoPack.id, pkFriendInfoPack.avatarID, pkFriendInfoPack.nickname, roomID, GlobalData.matchRoomType ); }; socketPlayer.onMatchSuccess = () => { int otherIndex = (GlobalData.playerIndexInRoom + 1) % 2; MatchPlayerInfo info = GlobalData.matchPlayerInfos[otherIndex]; (Sprite avatar, string nickname) = RoleMgr.GetRoleInfo(info.avatarID); nickname = info.nickname; RenderPlayerInfo(2, avatar, nickname, true); RenderTip("匹配成功,即将开始游戏!"); HideBtnBack(); PauseWaitingTime(); socketPlayer.AgreeStartGame(); }; socketPlayer.onAgreeStartGame = () => { DontDestroyOnLoad(socketPlayer); toLoadGame = true; }; socketPlayer.onDestroy_ += () => { if (this && this.gameObject) { Destroy(this.gameObject); Destroy(socketPlayer.gameObject); PopupMgr.ins.ShowBGTip("网络发生意外!"); } }; } //通过此方法,不需要经过匹配页面进行匹配,可以直接在游戏场景匹配,方便测试 public static void MoniMatchForTestInGameScene(Action onAgreeStartGame) { SocketPlayer socketPlayer = new GameObject("SocketPlayer").AddComponent(); socketPlayer.onLoad_ = () => { socketPlayer.UploadPlayerInfo(); socketPlayer.RandomMatchRoom(); }; socketPlayer.onMatchSuccess = () => { socketPlayer.AgreeStartGame(); }; socketPlayer.onAgreeStartGame = () => { DontDestroyOnLoad(socketPlayer); if (onAgreeStartGame != null) onAgreeStartGame(); }; } bool toLoadGame = false; float loadGameSceneCountdown = 1; void Update() { if (waitingTime >= 0) { waitingTime += Time.deltaTime; this.transform.Find("BoxRight/TimeBG").GetComponentInChildren().text = TimeUtil.GetTimeStr(waitingTime, false); } if (toLoadGame) { loadGameSceneCountdown -= Time.deltaTime; if (loadGameSceneCountdown <= 0) { toLoadGame = false; //loadscene if (GlobalData.matchRoomType == 0) { GameMgr.gameType = 9; SceneManager.LoadScene("Game", LoadSceneMode.Single); } //challenge-game int[] roomTypes = {1, 2, 3}; int[] gameTypes = {10, 11, 12}; int curIndex = Array.IndexOf(roomTypes, GlobalData.matchRoomType); if (curIndex >= 0) { GameMgr.gameType = gameTypes[curIndex]; SceneManager.LoadScene("GameChallenge", LoadSceneMode.Single); } } } } void PauseWaitingTime() { waitingTime = -1; } void RenderPlayerInfo(int playerID, Sprite avatar, string nickname, bool active) { this.transform.Find($"BoxRight/Player{playerID}/NameBox") .GetComponentInChildren().text = active ? nickname : "等待加入"; Transform avatarT = this.transform.Find($"BoxRight/Player{playerID}/MatchHeadBG/Avatar"); avatarT.gameObject.SetActive(active); avatarT.Find("Sprite").GetComponent().sprite = avatar; } void ChangeMatchHeadBG(int typeIndex) { Image img = this.transform.Find("BoxRight/Player2/MatchHeadBG").GetComponent(); img.sprite = matchHeadBGList[typeIndex]; img.GetComponent