Skip to content

Instantly share code, notes, and snippets.

@GEMISIS
Last active July 7, 2020 01:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save GEMISIS/b45745024d03e6fa724b76f3263ce6e9 to your computer and use it in GitHub Desktop.
Save GEMISIS/b45745024d03e6fa724b76f3263ce6e9 to your computer and use it in GitHub Desktop.
Handles pausing and resuming for the Oculus platform.
using System.IO;
using UnityEngine;
using UnityEngine.Events;
#if PLATFORM_ANDROID
using UnityEngine.Android;
#endif
public class WorldSettings : MonoBehaviour
{
/// <summary>
/// Events to be called when when the game is paused or resumed.
/// </summary>
public UnityEvent PauseEvents, ResumeEvents;
/// <summary>
/// Indicates whether the game is paused or not.
/// </summary>
public static bool IsPaused
{
get
{
return OVRManager.hasInputFocus;
}
}
/// <summary>
/// The events that have occured so far. Helps ensure that if the inputs are lost and the HMD unmounted, then
/// we pause this as expected.
/// </summary>
private int mEventStack = 0;
#region Unity overrides.
private void OnEnable()
{
OVRManager.HMDMounted += OVRManager_HMDMounted;
OVRManager.HMDUnmounted += OVRManager_HMDUnmounted;
OVRManager.InputFocusAcquired += OVRManager_InputFocusAcquired;
OVRManager.InputFocusLost += OVRManager_InputFocusLost;
#if PLATFORM_ANDROID
VerifyPermission(Permission.Microphone);
VerifyPermission(Permission.ExternalStorageRead);
VerifyPermission(Permission.ExternalStorageWrite);
#endif
}
private void OnDisable()
{
OVRManager.HMDMounted -= OVRManager_HMDMounted;
OVRManager.HMDUnmounted -= OVRManager_HMDUnmounted;
OVRManager.InputFocusAcquired -= OVRManager_InputFocusAcquired;
OVRManager.InputFocusLost -= OVRManager_InputFocusLost;
}
#endregion
#region Helper methods.
#if PLATFORM_ANDROID
private void VerifyPermission(string permission)
{
if (!Permission.HasUserAuthorizedPermission(permission))
{
Permission.RequestUserPermission(permission);
}
}
#endif
private void pushEventStack()
{
mEventStack++;
if (mEventStack > 0 && Time.timeScale != 0.0f)
{
Time.timeScale = 0.0f;
PauseEvents.Invoke();
}
}
private void popEventStack()
{
mEventStack--;
mEventStack = Mathf.Max(mEventStack, 0);
if (mEventStack <= 0 && Time.timeScale == 0.0f)
{
Time.timeScale = 1.0f;
ResumeEvents.Invoke();
}
}
#endregion
#region Event definitions.
private void OVRManager_HMDUnmounted()
{
pushEventStack();
}
private void OVRManager_HMDMounted()
{
popEventStack();
}
private void OVRManager_InputFocusLost()
{
pushEventStack();
}
private void OVRManager_InputFocusAcquired()
{
popEventStack();
}
#endregion
}
@hyper-active
Copy link

Modified to include checking for HMDMount and unmount.

 OVRManager.HMDUnmounted += OVRManager_HMDUnmounted;
OVRManager.HMDMounted += OVRManager_HMDMounted;

 private void OVRManager_HMDUnmounted()
    {
        AudioListener.volume = 0f;
        Time.timeScale = 0.0f;
    }

    private void OVRManager_HMDMounted()
    {
        if (IsPaused) return;
            AudioListener.volume = 1f;
            Time.timeScale = 1.0f;
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment