|
|
- namespace Oculus.Platform.Samples.VrHoops
- {
- using UnityEngine;
- using System.Collections.Generic;
- using Oculus.Platform;
- using Oculus.Platform.Models;
-
- // This class coordinates with the Oculus Platform Matchmaking Service to
- // establish a Quickmatch session with one or two other players.
- public class MatchmakingManager
- {
- // the name we setup on the Developer Dashboard for the quickmatch pool
- private const string NORMAL_POOL = "NORMAL_QUICKMATCH";
-
- // the ID of the Room the matchmaking service sent to join
- private ulong m_matchRoom;
-
- // the list of players that join the match room.
- // it may not be all the match players since some might disconnect
- // before joining the room, but then again they might disconnect
- // midway through a match as well.
- private readonly Dictionary<ulong, User> m_remotePlayers;
-
- public MatchmakingManager()
- {
- m_remotePlayers = new Dictionary<ulong, User>();
-
- Matchmaking.SetMatchFoundNotificationCallback(MatchFoundCallback);
- Rooms.SetUpdateNotificationCallback(MatchmakingRoomUpdateCallback);
- }
-
- public delegate void OnEnqueueResult(bool successful);
- public delegate Player OnMatchPlayerAdded(int slot, User user);
-
- private OnEnqueueResult m_enqueueCallback;
- private OnMatchPlayerAdded m_playerCallback;
-
- public OnEnqueueResult EnqueueResultCallback
- {
- private get { return m_enqueueCallback; }
- set { m_enqueueCallback = value; }
- }
-
- public OnMatchPlayerAdded MatchPlayerAddedCallback
- {
- private get { return m_playerCallback; }
- set { m_playerCallback = value; }
- }
-
- public void QueueForMatch()
- {
- Matchmaking.Enqueue (NORMAL_POOL).OnComplete(MatchmakingEnqueueCallback);
- }
-
- void MatchmakingEnqueueCallback(Message msg)
- {
- if (msg.IsError)
- {
- Debug.Log(msg.GetError().Message);
- EnqueueResultCallback(false);
- return;
- }
- }
-
- void MatchFoundCallback(Message<Room> msg)
- {
- m_matchRoom = msg.Data.ID;
- Matchmaking.JoinRoom(msg.Data.ID, true).OnComplete(MatchmakingJoinRoomCallback);
- }
-
- void MatchmakingJoinRoomCallback(Message<Room> msg)
- {
- if (msg.IsError)
- {
- Debug.Log (msg.GetError().Message);
- EnqueueResultCallback(false);
- return;
- }
- Debug.Log ("Match found and room joined " + m_matchRoom);
-
- EnqueueResultCallback(true);
-
- // this sample doesn't try to coordinate that all the players see consistent
- // positioning to assigned courts, but that would be a great next feature to add
- int slot = 0;
-
- if (msg.Data.UsersOptional != null)
- {
- foreach (var user in msg.Data.UsersOptional)
- {
- var player = MatchPlayerAddedCallback(slot++, user);
- if (PlatformManager.MyID != user.ID)
- {
- m_remotePlayers[user.ID] = user;
- PlatformManager.P2P.AddRemotePlayer (player as RemotePlayer);
- }
- }
- }
- }
-
- void MatchmakingRoomUpdateCallback(Message<Room> msg)
- {
- if (msg.IsError)
- {
- PlatformManager.TerminateWithError(msg);
- return;
- }
-
- // check to make sure the room is valid as there are a few odd timing issues (for
- // example when leaving a room) that can trigger an uninteresting update
- if (msg.Data.ID == m_matchRoom)
- {
- if (msg.Data.UsersOptional != null)
- {
- foreach (User user in msg.Data.UsersOptional)
- {
- if (PlatformManager.MyID != user.ID && !m_remotePlayers.ContainsKey(user.ID))
- {
- m_remotePlayers[user.ID] = user;
- var player = MatchPlayerAddedCallback(m_remotePlayers.Count, user);
- PlatformManager.P2P.AddRemotePlayer(player as RemotePlayer);
- }
- }
- }
- }
- }
-
- public void EndMatch()
- {
- if (m_matchRoom != 0)
- {
- Rooms.Leave (m_matchRoom);
- m_remotePlayers.Clear ();
- PlatformManager.P2P.DisconnectAll ();
- m_matchRoom = 0;
- }
- }
-
- public void LeaveQueue()
- {
- Matchmaking.Cancel();
- EndMatch();
- }
- }
- }
|