How do I display only one controller in a scene?

You can choose to display only one controller in a scene while still maintaining 2 active controllers.

Add the following code:

  • New script in WaveVR
private GameObject ControllerLoader_DO = null;
private GameObject loaderInstance_DO = null;
private GameObject ControllerLoader_ND = null;
private GameObject loaderInstance_ND = null;

#region MonoBehaviour Overrides
void OnEnable()
{
    WaveVR_Utils.Event.Listen (WaveVR_Utils.Event.CONTROLLER_MODEL_UNLOADED, OnControllerUnloaded);
}
void Start ()
{
    this.ControllerLoader_DO = Instantiate(Resources.Load("ControllerLoader", typeof(GameObject))) as GameObject;
    this.ControllerLoader_DO.GetComponent<WaveVR_ControllerLoader>().WhichHand = WaveVR_ControllerLoader.ControllerHand.Dominant;
    this.ControllerLoader_DO.SetActive(false);
    this.ControllerLoader_ND = Instantiate(Resources.Load("ControllerLoader", typeof(GameObject))) as GameObject;
    this.ControllerLoader_ND.GetComponent<WaveVR_ControllerLoader>().WhichHand = WaveVR_ControllerLoader.ControllerHand.Non_Dominant;
    this.ControllerLoader_ND.SetActive(false);
}
  • Update() will monitor the current controller connection status and display only one controller
void Update ()
{
    if (WaveVR.Instance == null|| this.ControllerLoader_DO == null || this.ControllerLoader_ND == null)
        return;
    if (this.loaderInstance_DO != null || this.loaderInstance_ND != null)
        return;
    WaveVR.Device _dev_do = WaveVR.Instance.getDeviceByType (WaveVR_Controller.EDeviceType.Dominant);
    if (_dev_do != null && _dev_do.connected && this.loaderInstance_ND == null)
    {
        this.loaderInstance_DO = Instantiate(ControllerLoader_DO);
        this.loaderInstance_DO.SetActive(true);
    }
    WaveVR.Device _dev_nd = WaveVR.Instance.getDeviceByType(WaveVR_Controller.EDeviceType.NonDominant);
    if (_dev_nd != null && _dev_nd.connected && this.loaderInstance_DO == null)
    {
        this.loaderInstance_ND = Instantiate(ControllerLoader_ND);
        this.loaderInstance_ND.SetActive(true);
    }
}
  • LoaderInstance will be destroyed and set to null when one of the controllers is disconnected
void OnDisable()
{
    WaveVR_Utils.Event.Remove (WaveVR_Utils.Event.CONTROLLER_MODEL_UNLOADED, OnControllerUnloaded);
}
#endregion

void OnControllerUnloaded(params object[] args)
{
    WaveVR_Controller.EDeviceType _type = (WaveVR_Controller.EDeviceType)args[0];
    switch (_type)
    {
        case WaveVR_Controller.EDeviceType.Dominant:
            if (this.loaderInstance_DO != null)
            {
                PrintDebugLog("OnControllerUnloaded() remove DO" + this.loaderInstance_DO.name);
                this.loaderInstance_DO.SetActive(false);
                Destroy(this.loaderInstance_DO);
                this.loaderInstance_DO = null;
            }
            break;
        case WaveVR_Controller.EDeviceType.NonDominant:
            if (this.loaderInstance_ND != null)
            {
                PrintDebugLog("OnControllerUnloaded() remove ND" + this.loaderInstance_ND.name);
                this.loaderInstance_ND.SetActive(false);
                Destroy(this.loaderInstance_ND);
                this.loaderInstance_ND = null;
            }
            break;
        default:
            break;
    }
}