Forum Discussion

🚨 This forum is archived and read-only. To submit a forum post, please visit our new Developer Forum. 🚨
ffleming's avatar
ffleming
Explorer
9 years ago
Solved

The Mysterious Volume UI

I'm trying to get my Unity app ready for submission. I'm using Unity version 5.3.5p5 and Oculus Utilities for Unity 5 V1.5.0. I've gotten the needed back button functionality working, but for the life...
  • ProfessorTroy's avatar
    9 years ago
    Alright!

    So the newest Unity package is missing the OVRVolumeControl.

    Here is a version that "works" with the current package. It won't show the volume bar if you're already at max/min values, because the event that the button was hit appears to be missing so you can't key off it here.

    I added the LastVolumeInput, TempVolumeInput and TimeToCheck values so it tracks when the volume has changed. There was some minor changes made to the Update function as well.

    Add this behavior to the prefab with the missing script.
    Add that prefab to your camera.
    Position it where you want it to appear in the users vision.
    Blamo - it'll work.


    Cheers!

    using UnityEngine;
    using System.Collections;

    public class OVRVolumeControl : MonoBehaviour
    {
        private const float         showPopupTime = 3;
        private const float            popupOffsetY = 64.0f / 500.0f;
        private const float            popupDepth = 1.8f;
        private const int             maxVolume = 15;
        private const int             numVolumeImages = maxVolume + 1;
        
        private Transform            myTransform = null;

        private float LastVolumeInput;
        private float TempVolumeInput;
        private float TimeToCheck = 0.0f;
        
        void Start()
        {
            DontDestroyOnLoad( gameObject );
            myTransform = transform;
            GetComponent<Renderer>().enabled = false;
            LastVolumeInput = OVRManager.volumeLevel;
        }

        void Update()
        {
            UpdatePosition(Camera.main.transform);
        }

        /// <summary>
        /// Updates the position of the volume popup. 
        /// </summary>
        public void UpdatePosition(Transform cameraTransform)
        {
            // OVRManager.volumeLevel returns a negative value in GearVR/Unity until the button is hit at least once.
            
            float check = OVRManager.volumeLevel;
            if ((check < 0f) || (check == LastVolumeInput))  // we haven't gotten a volume button check yet.
            {
                TimeToCheck = 0f;
            }
            else
            {
                LastVolumeInput = -10; // there was a change, let this play out.
                if (TempVolumeInput != check)
                    TimeToCheck = 0.0f;

                TempVolumeInput = check;
                // Volume has changed...
                TimeToCheck += Time.deltaTime;

                if ((TimeToCheck < showPopupTime)) // for the next three seconds ....
                {
                    GetComponent<Renderer>().enabled = true;
                    GetComponent<Renderer>().material.mainTextureOffset = new Vector2(0.0f, (float)(maxVolume - (OVRManager.volumeLevel*maxVolume) ) / (float)numVolumeImages);
                    if (myTransform != null && cameraTransform != null)
                    {
                        // place in front of camera
                        myTransform.rotation = cameraTransform.rotation;
                        myTransform.position = cameraTransform.position + (myTransform.forward * popupDepth) + (myTransform.up * popupOffsetY);
                    }
                }
                else
                {
                    // 3 seconds have passed...
                    TimeToCheck = 0.0f;
                    LastVolumeInput = check;
                    GetComponent<Renderer>().enabled = false;
                }
            }
        }
    }

  • ffleming's avatar
    9 years ago
    Got it working, but man does it feel hacky. I started with 1.5.0 integration tools, but I also downloaded the 1.3.0 legacy integrations tools for 4.x Unity. I attached OVRManger.cs (1.5.0) to my camera and added the OVRVolumeController prefab under Moonlight as a child to the camera (probably could go anywhere, though). I then used the OVRVolumeController script from 1.3.0 and put that in the missing script for the prefab.

    Next I searched the 1.3.0 version of OVRManager.cs for all reference to volume controller and added that to the 1.5.0 version. One line needed to be modified since I was not using the OVRCameraRig and OVRManager is attached to the camera.

    if (volumeController != null)
    {
      if (volumeControllerTransform == null)
      {
        if (gameObject.GetComponent<OVRCameraRig>() != null)
        {
          volumeControllerTransform = gameObject.GetComponent<OVRCameraRig>().centerEyeAnchor;
        }
      }
      volumeController.UpdatePosition(volumeControllerTransform);
    }
    became





            if (volumeController != null)
            {
                if (volumeControllerTransform == null)
                {
                    volumeControllerTransform = gameObject.transform;
                }
                volumeController.UpdatePosition(volumeControllerTransform);
            }  


    And now it's working.

  • vrdaveb's avatar
    9 years ago
    So the newest Unity package is missing the OVRVolumeControl.

    OVRVolumeControl was intentionally removed. Please use Unity 5.3.5p6 or higher, which uses the Oculus Mobile SDK's built-in volume control.