Photon Unity Networkingを用いて、ゲーム内で協力プレイを実装する際に、レベルの近いプレイヤー同士でマッチングする方法についてご紹介します。
まずプレイヤーのレベルをグルーピングし、そのグループごとにマッチングを行っています。
ここでは非常に簡単な例として、プレイヤーのグルーピングはレベルにあわせて適当にグループ作成しています。
/// /// レベルをランクに変換 /// ///レベルからランクを取得します ///レベル string LevelToMatchRank (int level) { if (level <= 20) return "E"; if (level <= 40) return "D"; if (level <= 60) return "C"; if (level <= 80) return "B"; if (level <= 99) return "A"; if (level == 100) return "S"; return ""; }
次にレベルや、ランクといった、プレイヤーに紐付くパラメータをプレイヤーのカスタムプロパティーにセットします。
今回はユーザ名、レベル、ランクをカスタムプロパティにセットしてやります。
propeties = new Hashtable (){{"UserName", userName}, {"Level", ((int)levelValue).ToString()}, {"Rank", rank}, {"RoomName", roomName} };
ルームを作成する際には、ルームのカスタムプロパティとしてランクを持たせています。入室時にルームのカスタムプロパティを見て、マッチしている時のみ入室させるためです。
/// <summary> /// ルームの作成 /// </summary> /// <param name="properties">Properties.</param> public void CreateRoom (Hashtable properties) { RoomOptions roomOptions = new RoomOptions (); roomOptions.isVisible = true; roomOptions.isOpen = true; roomOptions.maxPlayers = 4; roomOptions.customRoomProperties = new Hashtable (){{"Rank", (string)properties["Rank"]} }; roomOptions.customRoomPropertiesForLobby = new string[] {"Rank"}; if (PhotonNetwork.GetRoomList ().Length == 0) { PhotonNetwork.CreateRoom ((string)properties ["RoomName"], roomOptions, null); return; } foreach (RoomInfo roomInfo in PhotonNetwork.GetRoomList()) { if (roomInfo.name != (string)properties ["RoomName"]) { PhotonNetwork.CreateRoom ((string)properties ["RoomName"], roomOptions, null); } else { isRoomEnabled = true; } } }
実際にルームに入る際に、入室時にプレイヤーのカスタムプロパティのランクと、
ルームとカスタムプロパティのランクが一致していることを確認させます。
ここではforeachで上からルームを検索していますが、
ランダムに検索させるようにすると、よりゲームらしさが生まれると思います。
/// <summary> /// ルームの作成 /// </summary> /// <param name="properties">Properties.</param> public void CreateRoom (Hashtable properties) { RoomOptions roomOptions = new RoomOptions (); roomOptions.isVisible = true; roomOptions.isOpen = true; roomOptions.maxPlayers = 4; roomOptions.customRoomProperties = new Hashtable (){{"Rank", (string)properties["Rank"]} }; roomOptions.customRoomPropertiesForLobby = new string[] {"Rank"}; if (PhotonNetwork.GetRoomList ().Length == 0) { PhotonNetwork.CreateRoom ((string)properties ["RoomName"], roomOptions, null); return; } foreach (RoomInfo roomInfo in PhotonNetwork.GetRoomList()) { if (roomInfo.name != (string)properties ["RoomName"]) { PhotonNetwork.CreateRoom ((string)properties ["RoomName"], roomOptions, null); } else { isRoomEnabled = true; } } }
このようにルームのカスタムプロパティとプレイヤーのカスタムプロパティを利用することによって、レベルにあったマッチングを実装することが可能です。
コメント
1件のコメント
下2つのソースコードがどちらも同じものになっています。2つ目のやつはRoomの検索になると思います。
可能であれば修正をお願いします。
サインインしてコメントを残してください。