Skip to content

Commit 3d78391

Browse files
committed
Updating controller scripts to match 213 course
1 parent da355f8 commit 3d78391

File tree

4 files changed

+363
-34
lines changed

4 files changed

+363
-34
lines changed
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License. See LICENSE in the project root for license information.
3+
4+
using HoloToolkit.Unity.InputModule;
5+
using UnityEngine;
6+
using UnityEngine.XR.WSA.Input;
7+
8+
namespace HoloToolkit.Unity.Controllers
9+
{
10+
/// <summary>
11+
/// Waits for a controller to be instantiated, then attaches itself to a specified element
12+
/// </summary>
13+
public class AttachToController : MonoBehaviour
14+
{
15+
public InteractionSourceHandedness Handedness { get { return handedness; } }
16+
17+
public MotionControllerInfo.ControllerElementEnum Element { get { return element; } }
18+
19+
[Header("AttachToController Elements")]
20+
[SerializeField]
21+
protected InteractionSourceHandedness handedness = InteractionSourceHandedness.Left;
22+
23+
[SerializeField]
24+
protected MotionControllerInfo.ControllerElementEnum element = MotionControllerInfo.ControllerElementEnum.PointingPose;
25+
26+
public bool SetChildrenInactiveWhenDetached = true;
27+
28+
[SerializeField]
29+
protected Vector3 positionOffset = Vector3.zero;
30+
31+
[SerializeField]
32+
protected Vector3 rotationOffset = Vector3.zero;
33+
34+
[SerializeField]
35+
protected Vector3 scale = Vector3.one;
36+
37+
[SerializeField]
38+
protected bool setScaleOnAttach = false;
39+
40+
public bool IsAttached { get; private set; }
41+
42+
private Transform elementTransform;
43+
public Transform ElementTransform { get; private set; }
44+
45+
protected MotionControllerInfo controller;
46+
47+
protected virtual void OnAttachToController() { }
48+
protected virtual void OnDetachFromController() { }
49+
50+
protected virtual void OnEnable()
51+
{
52+
SetChildrenActive(false);
53+
54+
// Look if the controller has loaded.
55+
if (MotionControllerVisualizer.Instance.TryGetControllerModel(handedness, out controller))
56+
{
57+
AttachElementToController(controller);
58+
}
59+
60+
MotionControllerVisualizer.Instance.OnControllerModelLoaded += AttachElementToController;
61+
MotionControllerVisualizer.Instance.OnControllerModelUnloaded += DetachElementFromController;
62+
}
63+
64+
protected virtual void OnDisable()
65+
{
66+
if (MotionControllerVisualizer.IsInitialized)
67+
{
68+
MotionControllerVisualizer.Instance.OnControllerModelLoaded -= AttachElementToController;
69+
MotionControllerVisualizer.Instance.OnControllerModelUnloaded -= DetachElementFromController;
70+
}
71+
}
72+
73+
protected virtual void OnDestroy()
74+
{
75+
if (MotionControllerVisualizer.IsInitialized)
76+
{
77+
MotionControllerVisualizer.Instance.OnControllerModelLoaded -= AttachElementToController;
78+
MotionControllerVisualizer.Instance.OnControllerModelUnloaded -= DetachElementFromController;
79+
}
80+
}
81+
82+
private void AttachElementToController(MotionControllerInfo newController)
83+
{
84+
if (!IsAttached && newController.Handedness == handedness)
85+
{
86+
if (!newController.TryGetElement(element, out elementTransform))
87+
{
88+
Debug.LogError("Unable to find element of type " + element + " under controller " + newController.ControllerParent.name + "; not attaching.");
89+
return;
90+
}
91+
92+
controller = newController;
93+
94+
SetChildrenActive(true);
95+
96+
// Parent ourselves under the element and set our offsets
97+
transform.parent = elementTransform;
98+
transform.localPosition = positionOffset;
99+
transform.localEulerAngles = rotationOffset;
100+
if (setScaleOnAttach)
101+
{
102+
transform.localScale = scale;
103+
}
104+
105+
// Announce that we're attached
106+
OnAttachToController();
107+
108+
IsAttached = true;
109+
}
110+
}
111+
112+
private void DetachElementFromController(MotionControllerInfo oldController)
113+
{
114+
if (IsAttached && oldController.Handedness == handedness)
115+
{
116+
OnDetachFromController();
117+
118+
controller = null;
119+
transform.parent = null;
120+
121+
SetChildrenActive(false);
122+
123+
IsAttached = false;
124+
}
125+
}
126+
127+
private void SetChildrenActive(bool isActive)
128+
{
129+
if (SetChildrenInactiveWhenDetached)
130+
{
131+
foreach (Transform child in transform)
132+
{
133+
child.gameObject.SetActive(isActive);
134+
}
135+
}
136+
}
137+
}
138+
}

Assets/HoloToolkit/Input/Scripts/Utilities/AttachToController.cs.meta

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/HoloToolkit/Input/Scripts/Utilities/MotionControllerInfo.cs

Lines changed: 100 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License. See LICENSE in the project root for license information.
33

44
using UnityEngine;
5+
using UnityEngine.XR.WSA.Input;
56

67
namespace HoloToolkit.Unity.InputModule
78
{
@@ -11,7 +12,8 @@ namespace HoloToolkit.Unity.InputModule
1112
/// </summary>
1213
public class MotionControllerInfo
1314
{
14-
public GameObject ControllerParent;
15+
public readonly GameObject ControllerParent;
16+
public readonly InteractionSourceHandedness Handedness;
1517

1618
private GameObject home;
1719
private Transform homePressed;
@@ -44,6 +46,7 @@ public class MotionControllerInfo
4446
private Transform touchpadTouchYMin;
4547
private Transform touchpadTouchYMax;
4648
private GameObject touchpadTouchVisualizer;
49+
private GameObject pointingPose;
4750

4851
// These values are used to determine if a button's state has changed.
4952
private bool wasGrasped;
@@ -56,14 +59,94 @@ public class MotionControllerInfo
5659
private Vector2 lastTouchpadPosition;
5760
private double lastSelectPressedAmount;
5861

62+
public MotionControllerInfo(GameObject controllerParent, InteractionSourceHandedness handedness)
63+
{
64+
ControllerParent = controllerParent;
65+
Handedness = handedness;
66+
}
67+
68+
public enum ControllerElementEnum
69+
{
70+
// Controller button elements
71+
Home,
72+
Menu,
73+
Grasp,
74+
Thumbstick,
75+
Select,
76+
Touchpad,
77+
// Controller body elements & poses
78+
PointingPose
79+
}
80+
81+
public bool TryGetElement(ControllerElementEnum element, out Transform elementTransform)
82+
{
83+
switch (element)
84+
{
85+
// control elements
86+
case ControllerElementEnum.Home:
87+
if (home != null)
88+
{
89+
elementTransform = home.transform;
90+
return true;
91+
}
92+
break;
93+
case ControllerElementEnum.Menu:
94+
if (menu != null)
95+
{
96+
elementTransform = menu.transform;
97+
return true;
98+
}
99+
break;
100+
case ControllerElementEnum.Select:
101+
if (select != null)
102+
{
103+
elementTransform = select.transform;
104+
return true;
105+
}
106+
break;
107+
case ControllerElementEnum.Grasp:
108+
if (grasp != null)
109+
{
110+
elementTransform = grasp.transform;
111+
return true;
112+
}
113+
break;
114+
case ControllerElementEnum.Thumbstick:
115+
if (thumbstickPress != null)
116+
{
117+
elementTransform = thumbstickPress.transform;
118+
return true;
119+
}
120+
break;
121+
case ControllerElementEnum.Touchpad:
122+
if (touchpadPress != null)
123+
{
124+
elementTransform = touchpadPress.transform;
125+
return true;
126+
}
127+
break;
128+
// body elements & poses
129+
case ControllerElementEnum.PointingPose:
130+
if (pointingPose != null)
131+
{
132+
elementTransform = pointingPose.transform;
133+
return true;
134+
}
135+
break;
136+
}
137+
138+
elementTransform = null;
139+
return false;
140+
}
141+
59142
/// <summary>
60143
/// Iterates through the Transform array to find specifically named GameObjects.
61144
/// These GameObjects specify the animation bounds and the GameObject to modify for button,
62145
/// thumbstick, and touchpad animation.
63146
/// </summary>
64147
/// <param name="childTransforms">The transforms of the glTF model.</param>
65148
/// <param name="visualizerScript">The script containing references to any objects to spawn.</param>
66-
public void LoadInfo(Transform[] childTransforms, MotionControllerVisualizer visualizerScript)
149+
public void LoadInfo(Transform[] childTransforms)
67150
{
68151
foreach (Transform child in childTransforms)
69152
{
@@ -75,6 +158,12 @@ public void LoadInfo(Transform[] childTransforms, MotionControllerVisualizer vis
75158
// visualizer.
76159
switch (child.name.ToLower())
77160
{
161+
case "touch":
162+
touchpadTouchVisualizer = MotionControllerVisualizer.Instance.SpawnTouchpadVisualizer(child);
163+
break;
164+
case "pointing_pose":
165+
pointingPose = child.gameObject;
166+
break;
78167
case "pressed":
79168
switch (child.parent.name.ToLower())
80169
{
@@ -190,9 +279,6 @@ public void LoadInfo(Transform[] childTransforms, MotionControllerVisualizer vis
190279
break;
191280
}
192281
break;
193-
case "touch":
194-
touchpadTouchVisualizer = visualizerScript.SpawnTouchpadVisualizer(child);
195-
break;
196282
}
197283
}
198284
}
@@ -289,5 +375,14 @@ private void SetLocalPositionAndRotation(GameObject buttonGameObject, Transform
289375
buttonGameObject.transform.localPosition = newTransform.localPosition;
290376
buttonGameObject.transform.localRotation = newTransform.localRotation;
291377
}
378+
379+
public void SetRenderersVisible(bool visible)
380+
{
381+
MeshRenderer[] renderers = ControllerParent.GetComponentsInChildren<MeshRenderer>();
382+
for (int i = 0; i < renderers.Length; i++)
383+
{
384+
renderers[i].enabled = visible;
385+
}
386+
}
292387
}
293388
}

0 commit comments

Comments
 (0)