12 public GameObject left, right;
14 [Tooltip(
"Populate with objects you want to assign to additional controllers")]
15 public GameObject[] objects;
17 [Tooltip(
"Set to true if you want objects arbitrarily assigned to controllers before their role (left vs right) is identified")]
18 public bool assignAllBeforeIdentified;
21 bool[] connected =
new bool[OpenVR.k_unMaxTrackedDeviceCount];
24 uint leftIndex = OpenVR.k_unTrackedDeviceIndexInvalid;
25 uint rightIndex = OpenVR.k_unTrackedDeviceIndexInvalid;
28 void SetUniqueObject(GameObject o,
int index)
30 for (
int i = 0; i < index; i++)
38 public void UpdateTargets()
41 var objects = this.objects;
42 var additional = (objects != null) ? objects.Length : 0;
43 this.objects =
new GameObject[2 + additional];
44 SetUniqueObject(right, 0);
45 SetUniqueObject(left, 1);
46 for (
int i = 0; i < additional; i++)
47 SetUniqueObject(objects[i], 2 + i);
50 indices =
new uint[2 + additional];
51 for (
int i = 0; i < indices.Length; i++)
52 indices[i] =
OpenVR.k_unTrackedDeviceIndexInvalid;
64 inputFocusAction = SteamVR_Events.InputFocusAction(OnInputFocus);
65 deviceConnectedAction = SteamVR_Events.DeviceConnectedAction(OnDeviceConnected);
66 trackedDeviceRoleChangedAction = SteamVR_Events.SystemAction(EVREventType.VREvent_TrackedDeviceRoleChanged, OnTrackedDeviceRoleChanged);
71 for (
int i = 0; i < objects.Length; i++)
77 indices[i] = OpenVR.k_unTrackedDeviceIndexInvalid;
82 for (
int i = 0; i < SteamVR.connected.Length; i++)
84 OnDeviceConnected(i,
true);
86 inputFocusAction.enabled =
true;
87 deviceConnectedAction.enabled =
true;
88 trackedDeviceRoleChangedAction.enabled =
true;
93 inputFocusAction.enabled =
false;
94 deviceConnectedAction.enabled =
false;
95 trackedDeviceRoleChangedAction.enabled =
false;
98 static string hiddenPrefix =
"hidden (", hiddenPostfix =
")";
99 static string[] labels = {
"left",
"right" };
102 private void OnInputFocus(
bool hasFocus)
106 for (
int i = 0; i < objects.Length; i++)
108 var obj = objects[i];
111 var label = (i < 2) ? labels[i] : (i - 1).ToString();
112 ShowObject(obj.transform, hiddenPrefix + label + hiddenPostfix);
118 for (
int i = 0; i < objects.Length; i++)
120 var obj = objects[i];
123 var label = (i < 2) ? labels[i] : (i - 1).ToString();
124 HideObject(obj.transform, hiddenPrefix + label + hiddenPostfix);
132 private void HideObject(Transform t,
string name)
134 if (t.gameObject.name.StartsWith(hiddenPrefix))
136 Debug.Log(
"Ignoring double-hide.");
139 var hidden =
new GameObject(name).transform;
140 hidden.parent = t.parent;
142 hidden.gameObject.SetActive(
false);
144 private void ShowObject(Transform t,
string name)
146 var hidden = t.parent;
147 if (hidden.gameObject.name != name)
149 t.parent = hidden.parent;
150 Destroy(hidden.gameObject);
153 private void SetTrackedDeviceIndex(
int objectIndex, uint trackedDeviceIndex)
156 if (trackedDeviceIndex !=
OpenVR.k_unTrackedDeviceIndexInvalid)
158 for (
int i = 0; i < objects.Length; i++)
160 if (i != objectIndex && indices[i] == trackedDeviceIndex)
162 var obj = objects[i];
164 obj.SetActive(
false);
166 indices[i] = OpenVR.k_unTrackedDeviceIndexInvalid;
172 if (trackedDeviceIndex != indices[objectIndex])
174 indices[objectIndex] = trackedDeviceIndex;
176 var obj = objects[objectIndex];
179 if (trackedDeviceIndex ==
OpenVR.k_unTrackedDeviceIndexInvalid)
180 obj.SetActive(
false);
184 obj.BroadcastMessage(
"SetDeviceIndex", (int)trackedDeviceIndex, SendMessageOptions.DontRequireReceiver);
191 private void OnTrackedDeviceRoleChanged(
VREvent_t vrEvent)
197 private void OnDeviceConnected(
int index,
bool connected)
199 bool changed = this.connected[index];
200 this.connected[index] =
false;
204 var system = OpenVR.System;
207 var deviceClass = system.GetTrackedDeviceClass((uint)index);
208 if (deviceClass == ETrackedDeviceClass.Controller ||
209 deviceClass == ETrackedDeviceClass.GenericTracker)
211 this.connected[index] =
true;
221 public void Refresh()
225 var system = OpenVR.System;
228 leftIndex = system.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.LeftHand);
229 rightIndex = system.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.RightHand);
233 if (leftIndex ==
OpenVR.k_unTrackedDeviceIndexInvalid && rightIndex ==
OpenVR.k_unTrackedDeviceIndexInvalid)
235 for (uint deviceIndex = 0; deviceIndex < connected.Length; deviceIndex++)
237 if (objectIndex >= objects.Length)
240 if (!connected[deviceIndex])
243 SetTrackedDeviceIndex(objectIndex++, deviceIndex);
245 if (!assignAllBeforeIdentified)
251 SetTrackedDeviceIndex(objectIndex++, (rightIndex < connected.Length && connected[rightIndex]) ? rightIndex :
OpenVR.k_unTrackedDeviceIndexInvalid);
252 SetTrackedDeviceIndex(objectIndex++, (leftIndex < connected.Length && connected[leftIndex]) ? leftIndex :
OpenVR.k_unTrackedDeviceIndexInvalid);
255 if (leftIndex !=
OpenVR.k_unTrackedDeviceIndexInvalid && rightIndex !=
OpenVR.k_unTrackedDeviceIndexInvalid)
257 for (uint deviceIndex = 0; deviceIndex < connected.Length; deviceIndex++)
259 if (objectIndex >= objects.Length)
262 if (!connected[deviceIndex])
265 if (deviceIndex != leftIndex && deviceIndex != rightIndex)
267 SetTrackedDeviceIndex(objectIndex++, deviceIndex);
274 while (objectIndex < objects.Length)
276 SetTrackedDeviceIndex(objectIndex++,
OpenVR.k_unTrackedDeviceIndexInvalid);