namespace Oculus.Platform.Samples.VrHoops
|
|
{
|
|
using UnityEngine;
|
|
using Oculus.Platform;
|
|
using Oculus.Platform.Models;
|
|
|
|
public class PlatformManager : MonoBehaviour
|
|
{
|
|
private static PlatformManager s_instance;
|
|
private MatchmakingManager m_matchmaking;
|
|
private P2PManager m_p2p;
|
|
private LeaderboardManager m_leaderboards;
|
|
private AchievementsManager m_achievements;
|
|
private State m_currentState;
|
|
|
|
// my Application-scoped Oculus ID
|
|
private ulong m_myID;
|
|
|
|
// my Oculus user name
|
|
private string m_myOculusID;
|
|
|
|
void Update()
|
|
{
|
|
m_p2p.UpdateNetwork();
|
|
m_leaderboards.CheckForUpdates();
|
|
}
|
|
|
|
#region Initialization and Shutdown
|
|
|
|
void Awake()
|
|
{
|
|
// make sure only one instance of this manager ever exists
|
|
if (s_instance != null)
|
|
{
|
|
Destroy(gameObject);
|
|
return;
|
|
}
|
|
|
|
s_instance = this;
|
|
DontDestroyOnLoad(gameObject);
|
|
|
|
Core.Initialize();
|
|
m_matchmaking = new MatchmakingManager();
|
|
m_p2p = new P2PManager();
|
|
m_leaderboards = new LeaderboardManager();
|
|
m_achievements = new AchievementsManager();
|
|
}
|
|
|
|
|
|
void Start()
|
|
{
|
|
// First thing we should do is perform an entitlement check to make sure
|
|
// we successfully connected to the Oculus Platform Service.
|
|
Entitlements.IsUserEntitledToApplication().OnComplete(IsEntitledCallback);
|
|
}
|
|
|
|
void IsEntitledCallback(Message msg)
|
|
{
|
|
if (msg.IsError)
|
|
{
|
|
TerminateWithError(msg);
|
|
return;
|
|
}
|
|
|
|
// Next get the identity of the user that launched the Application.
|
|
Users.GetLoggedInUser().OnComplete(GetLoggedInUserCallback);
|
|
}
|
|
|
|
void GetLoggedInUserCallback(Message<User> msg)
|
|
{
|
|
if (msg.IsError)
|
|
{
|
|
TerminateWithError(msg);
|
|
return;
|
|
}
|
|
|
|
m_myID = msg.Data.ID;
|
|
m_myOculusID = msg.Data.OculusID;
|
|
|
|
TransitionToState(State.WAITING_TO_PRACTICE_OR_MATCHMAKE);
|
|
Achievements.CheckForAchievmentUpdates();
|
|
}
|
|
|
|
// In this example, for most errors, we terminate the Application. A full App would do
|
|
// something more graceful.
|
|
public static void TerminateWithError(Message msg)
|
|
{
|
|
Debug.Log("Error: " + msg.GetError().Message);
|
|
UnityEngine.Application.Quit();
|
|
}
|
|
|
|
public void QuitButtonPressed()
|
|
{
|
|
UnityEngine.Application.Quit();
|
|
}
|
|
|
|
void OnApplicationQuit()
|
|
{
|
|
// be a good matchmaking citizen and leave any queue immediately
|
|
Matchmaking.LeaveQueue();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Properties
|
|
|
|
public static MatchmakingManager Matchmaking
|
|
{
|
|
get { return s_instance.m_matchmaking; }
|
|
}
|
|
|
|
public static P2PManager P2P
|
|
{
|
|
get { return s_instance.m_p2p; }
|
|
}
|
|
|
|
public static LeaderboardManager Leaderboards
|
|
{
|
|
get { return s_instance.m_leaderboards; }
|
|
}
|
|
|
|
public static AchievementsManager Achievements
|
|
{
|
|
get { return s_instance.m_achievements; }
|
|
}
|
|
|
|
public static State CurrentState
|
|
{
|
|
get { return s_instance.m_currentState; }
|
|
}
|
|
|
|
public static ulong MyID
|
|
{
|
|
get
|
|
{
|
|
if (s_instance != null)
|
|
{
|
|
return s_instance.m_myID;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static string MyOculusID
|
|
{
|
|
get
|
|
{
|
|
if (s_instance != null && s_instance.m_myOculusID != null)
|
|
{
|
|
return s_instance.m_myOculusID;
|
|
}
|
|
else
|
|
{
|
|
return string.Empty;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region State Management
|
|
|
|
public enum State
|
|
{
|
|
// loading platform library, checking application entitlement,
|
|
// getting the local user info
|
|
INITIALIZING,
|
|
|
|
// waiting on the user to join a matchmaking queue or play a practice game
|
|
WAITING_TO_PRACTICE_OR_MATCHMAKE,
|
|
|
|
// waiting for the match to start or viewing results
|
|
MATCH_TRANSITION,
|
|
|
|
// actively playing a practice match
|
|
PLAYING_A_LOCAL_MATCH,
|
|
|
|
// actively playing an online match
|
|
PLAYING_A_NETWORKED_MATCH,
|
|
};
|
|
|
|
public static void TransitionToState(State newState)
|
|
{
|
|
if (s_instance && s_instance.m_currentState != newState)
|
|
{
|
|
s_instance.m_currentState = newState;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|