Skip to content

Commit d62eac2

Browse files
committed
Better handling of inputs switch in ControllerInteraction
1 parent 7b03265 commit d62eac2

File tree

3 files changed

+115
-48
lines changed

3 files changed

+115
-48
lines changed

Packages/webxr-interactions/Runtime/Scripts/ControllerInteraction.cs

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,18 @@ public class ControllerInteraction : MonoBehaviour
1212
private Rigidbody currentRigidBody = null;
1313
private List<Rigidbody> contactRigidBodies = new List<Rigidbody>();
1414

15-
private Animator anim;
15+
[SerializeField] private Animator animator = null;
16+
[SerializeField] private string animationStateName = "Take";
1617
private WebXRController controller;
18+
private bool hasAnimator = false;
19+
private bool controllerVisible = false;
1720

1821
public GameObject[] controllerVisuals;
1922

2023
public Transform handJointPrefab;
24+
private bool handJointsVisible = false;
25+
26+
public bool useInputProfile = true;
2127

2228
public GameObject inputProfileObject;
2329
public GameObject inputProfileModelParent;
@@ -36,10 +42,9 @@ public class ControllerInteraction : MonoBehaviour
3642
void Awake()
3743
{
3844
attachJoint = GetComponent<FixedJoint>();
39-
anim = gameObject.GetComponent<Animator>();
45+
hasAnimator = animator != null;
4046
controller = gameObject.GetComponent<WebXRController>();
4147
#if WEBXR_INPUT_PROFILES
42-
Debug.LogError("WEBXR_INPUT_PROFILES");
4348
if (inputProfileObject != null)
4449
{
4550
inputProfileLoader = inputProfileObject.GetComponent<InputProfileLoader>();
@@ -58,6 +63,8 @@ void Awake()
5863
}
5964
}
6065
#endif
66+
SetControllerVisible(false);
67+
SetHandJointsVisible(false);
6168
}
6269

6370
void OnEnable()
@@ -76,7 +83,10 @@ void OnDisabled()
7683

7784
void Update()
7885
{
79-
controller.TryUpdateButtons();
86+
if (!controllerVisible && !handJointsVisible)
87+
{
88+
return;
89+
}
8090

8191
// Get button A(0 or 1), or Axis Trigger/Grip (0 to 1), the larger between them all, by that order
8292
float normalizedTime = controller.GetButton(WebXRController.ButtonTypes.ButtonA) ? 1 :
@@ -106,7 +116,10 @@ void Update()
106116
#endif
107117

108118
// Use the controller button or axis position to manipulate the playback time for hand model.
109-
anim.Play("Take", -1, normalizedTime);
119+
if (hasAnimator)
120+
{
121+
animator.Play(animationStateName, -1, normalizedTime);
122+
}
110123
}
111124

112125
void OnTriggerEnter(Collider other)
@@ -128,13 +141,14 @@ void OnTriggerExit(Collider other)
128141

129142
void SetControllerVisible(bool visible)
130143
{
144+
controllerVisible = visible;
145+
Drop();
131146
#if WEBXR_INPUT_PROFILES
132-
loadedModel = false;
133-
if (visible)
147+
if (visible && useInputProfile)
134148
{
135-
inputProfileModelParent.SetActive(true);
136149
if (inputProfileModel != null)
137150
{
151+
inputProfileModelParent.SetActive(true);
138152
loadedModel = true;
139153
return;
140154
}
@@ -153,6 +167,8 @@ void SetControllerVisible(bool visible)
153167

154168
void SetHandJointsVisible(bool visible)
155169
{
170+
handJointsVisible = visible;
171+
Drop();
156172
foreach (var visual in handJointsVisuals)
157173
{
158174
visual?.SetActive(visible);
@@ -161,6 +177,10 @@ void SetHandJointsVisible(bool visible)
161177

162178
private void OnHandUpdate(WebXRHandData handData)
163179
{
180+
if (handJointPrefab == null)
181+
{
182+
return;
183+
}
164184
Quaternion rotationOffset = Quaternion.Inverse(handData.joints[0].rotation);
165185

166186
for (int i = 0; i <= WebXRHandData.LITTLE_PHALANX_TIP; i++)
@@ -206,13 +226,8 @@ void HandleProfilesList(Dictionary<string, string> profilesList)
206226
void LoadInputProfile()
207227
{
208228
var profiles = controller.GetProfiles();
209-
Debug.LogError($"LoadInputProfile {hasProfileList} {profiles != null}");
210229
if (hasProfileList && profiles != null && profiles.Length > 0)
211230
{
212-
for (int i = 0; i < profiles.Length; i++)
213-
{
214-
Debug.LogError(profiles[i]);
215-
}
216231
loadedProfile = profiles[0];
217232
inputProfileLoader.LoadProfile(profiles, OnProfileLoaded);
218233
}
@@ -231,11 +246,6 @@ void LoadInputModel()
231246
inputProfileModel = inputProfileLoader.LoadModelForHand(loadedProfile, (InputProfileLoader.Handedness)controller.hand, HandleModelLoaded);
232247
if (inputProfileModel != null)
233248
{
234-
var inputProfileModelTransform = inputProfileModel.transform;
235-
inputProfileModelTransform.SetParent(inputProfileModelParent.transform);
236-
inputProfileModelTransform.localPosition = Vector3.zero;
237-
inputProfileModelTransform.localRotation = Quaternion.identity;
238-
inputProfileModelTransform.localScale = Vector3.one;
239249
UpdateModelInput();
240250
}
241251
}
@@ -245,9 +255,18 @@ void HandleModelLoaded(bool success)
245255
loadedModel = success;
246256
if (loadedModel)
247257
{
248-
foreach (var visual in controllerVisuals)
258+
var inputProfileModelTransform = inputProfileModel.transform;
259+
inputProfileModelTransform.SetParent(inputProfileModelParent.transform);
260+
inputProfileModelTransform.localPosition = Vector3.zero;
261+
inputProfileModelTransform.localRotation = Quaternion.identity;
262+
inputProfileModelTransform.localScale = Vector3.one;
263+
if (controllerVisible)
249264
{
250-
visual.SetActive(false);
265+
inputProfileModelParent.SetActive(true);
266+
foreach (var visual in controllerVisuals)
267+
{
268+
visual.SetActive(false);
269+
}
251270
}
252271
}
253272
else

Packages/webxr-interactions/Samples~/Desert/Prefabs/Cube.prefab

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ GameObject:
1111
- component: {fileID: 8513787482403080262}
1212
- component: {fileID: 7408311752882702317}
1313
- component: {fileID: 99441339568455309}
14+
- component: {fileID: 7032826426395329838}
1415
m_Layer: 0
1516
m_Name: Cube
1617
m_TagString: Untagged
@@ -79,3 +80,16 @@ MeshRenderer:
7980
m_SortingLayerID: 0
8081
m_SortingLayer: 0
8182
m_SortingOrder: 0
83+
--- !u!65 &7032826426395329838
84+
BoxCollider:
85+
m_ObjectHideFlags: 0
86+
m_CorrespondingSourceObject: {fileID: 0}
87+
m_PrefabInstance: {fileID: 0}
88+
m_PrefabAsset: {fileID: 0}
89+
m_GameObject: {fileID: 8362309011548659104}
90+
m_Material: {fileID: 0}
91+
m_IsTrigger: 1
92+
m_Enabled: 1
93+
serializedVersion: 2
94+
m_Size: {x: 1, y: 1, z: 1}
95+
m_Center: {x: 0, y: 0, z: 0}

Packages/webxr-interactions/Samples~/Desert/Prefabs/WebXRCameraSet.prefab

Lines changed: 62 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ GameObject:
101101
m_Component:
102102
- component: {fileID: 4974700127051642}
103103
- component: {fileID: 137037042967364456}
104+
- component: {fileID: 577910227837277613}
104105
m_Layer: 0
105106
m_Name: model
106107
m_TagString: Untagged
@@ -189,6 +190,19 @@ SkinnedMeshRenderer:
189190
m_Center: {x: 0.008486092, y: 0.07785222, z: 0.018433996}
190191
m_Extent: {x: 0.05023212, y: 0.12092428, z: 0.08558848}
191192
m_DirtyAABB: 0
193+
--- !u!135 &577910227837277613
194+
SphereCollider:
195+
m_ObjectHideFlags: 0
196+
m_CorrespondingSourceObject: {fileID: 0}
197+
m_PrefabInstance: {fileID: 0}
198+
m_PrefabAsset: {fileID: 0}
199+
m_GameObject: {fileID: 1091283458777958}
200+
m_Material: {fileID: 0}
201+
m_IsTrigger: 1
202+
m_Enabled: 1
203+
serializedVersion: 2
204+
m_Radius: 0.13
205+
m_Center: {x: 0, y: 0.01, z: 0.02}
192206
--- !u!1 &1105671963348452
193207
GameObject:
194208
m_ObjectHideFlags: 0
@@ -1109,6 +1123,7 @@ GameObject:
11091123
m_Component:
11101124
- component: {fileID: 4925627231713262}
11111125
- component: {fileID: 137859123971994456}
1126+
- component: {fileID: 4744529936429859944}
11121127
m_Layer: 0
11131128
m_Name: model
11141129
m_TagString: Untagged
@@ -1197,6 +1212,19 @@ SkinnedMeshRenderer:
11971212
m_Center: {x: -0.008465625, y: 0.07335146, z: 0.018426947}
11981213
m_Extent: {x: 0.050279543, y: 0.12551184, z: 0.08560432}
11991214
m_DirtyAABB: 0
1215+
--- !u!135 &4744529936429859944
1216+
SphereCollider:
1217+
m_ObjectHideFlags: 0
1218+
m_CorrespondingSourceObject: {fileID: 0}
1219+
m_PrefabInstance: {fileID: 0}
1220+
m_PrefabAsset: {fileID: 0}
1221+
m_GameObject: {fileID: 1664295426898042}
1222+
m_Material: {fileID: 0}
1223+
m_IsTrigger: 1
1224+
m_Enabled: 1
1225+
serializedVersion: 2
1226+
m_Radius: 0.13
1227+
m_Center: {x: 0, y: 0.01, z: 0.02}
12001228
--- !u!1 &1700223032786422
12011229
GameObject:
12021230
m_ObjectHideFlags: 0
@@ -1271,7 +1299,6 @@ GameObject:
12711299
- component: {fileID: 54027100335586508}
12721300
- component: {fileID: 138596338900119798}
12731301
- component: {fileID: 95292425453911886}
1274-
- component: {fileID: 135139238002636258}
12751302
- component: {fileID: 114128207473628304}
12761303
- component: {fileID: 114589835210473740}
12771304
- component: {fileID: 7185579886917944061}
@@ -1348,19 +1375,6 @@ Animator:
13481375
m_HasTransformHierarchy: 1
13491376
m_AllowConstantClipSamplingOptimization: 1
13501377
m_KeepAnimatorControllerStateOnDisable: 0
1351-
--- !u!135 &135139238002636258
1352-
SphereCollider:
1353-
m_ObjectHideFlags: 0
1354-
m_CorrespondingSourceObject: {fileID: 0}
1355-
m_PrefabInstance: {fileID: 0}
1356-
m_PrefabAsset: {fileID: 0}
1357-
m_GameObject: {fileID: 1799026754646168}
1358-
m_Material: {fileID: 0}
1359-
m_IsTrigger: 1
1360-
m_Enabled: 1
1361-
serializedVersion: 2
1362-
m_Radius: 0.15
1363-
m_Center: {x: 0, y: 0, z: 0}
13641378
--- !u!114 &114128207473628304
13651379
MonoBehaviour:
13661380
m_ObjectHideFlags: 0
@@ -1389,11 +1403,14 @@ MonoBehaviour:
13891403
m_Script: {fileID: 11500000, guid: 580e3dd931df2bd42b042a7e8fde2aa8, type: 3}
13901404
m_Name:
13911405
m_EditorClassIdentifier:
1406+
animator: {fileID: 95292425453911886}
1407+
animationStateName: Take
13921408
controllerVisuals:
13931409
- {fileID: 1136128897566686}
13941410
- {fileID: 1664295426898042}
13951411
handJointPrefab: {fileID: 8513787482403080262, guid: 67541c9d1fd5e2c4798986ee73c07923,
13961412
type: 3}
1413+
useInputProfile: 1
13971414
inputProfileObject: {fileID: 1611361787474004}
13981415
inputProfileModelParent: {fileID: 1469228564561163144}
13991416
--- !u!114 &7185579886917944061
@@ -1764,7 +1781,6 @@ GameObject:
17641781
- component: {fileID: 54413995134380664}
17651782
- component: {fileID: 138281815166716050}
17661783
- component: {fileID: 95219300520550374}
1767-
- component: {fileID: 135505933631826540}
17681784
- component: {fileID: 114546255618804366}
17691785
- component: {fileID: 114372649503696970}
17701786
- component: {fileID: 1966769163579045322}
@@ -1841,19 +1857,6 @@ Animator:
18411857
m_HasTransformHierarchy: 1
18421858
m_AllowConstantClipSamplingOptimization: 1
18431859
m_KeepAnimatorControllerStateOnDisable: 0
1844-
--- !u!135 &135505933631826540
1845-
SphereCollider:
1846-
m_ObjectHideFlags: 0
1847-
m_CorrespondingSourceObject: {fileID: 0}
1848-
m_PrefabInstance: {fileID: 0}
1849-
m_PrefabAsset: {fileID: 0}
1850-
m_GameObject: {fileID: 1986733487743170}
1851-
m_Material: {fileID: 0}
1852-
m_IsTrigger: 1
1853-
m_Enabled: 1
1854-
serializedVersion: 2
1855-
m_Radius: 0.15
1856-
m_Center: {x: 0, y: 0, z: 0}
18571860
--- !u!114 &114546255618804366
18581861
MonoBehaviour:
18591862
m_ObjectHideFlags: 0
@@ -1882,11 +1885,14 @@ MonoBehaviour:
18821885
m_Script: {fileID: 11500000, guid: 580e3dd931df2bd42b042a7e8fde2aa8, type: 3}
18831886
m_Name:
18841887
m_EditorClassIdentifier:
1888+
animator: {fileID: 95292425453911886}
1889+
animationStateName: Take
18851890
controllerVisuals:
18861891
- {fileID: 1644997114004198}
18871892
- {fileID: 1091283458777958}
18881893
handJointPrefab: {fileID: 8513787482403080262, guid: 67541c9d1fd5e2c4798986ee73c07923,
18891894
type: 3}
1895+
useInputProfile: 1
18901896
inputProfileObject: {fileID: 1611361787474004}
18911897
inputProfileModelParent: {fileID: 599836867309221058}
18921898
--- !u!114 &1966769163579045322
@@ -1916,6 +1922,7 @@ GameObject:
19161922
serializedVersion: 6
19171923
m_Component:
19181924
- component: {fileID: 3819867499605581648}
1925+
- component: {fileID: 8744463562255408498}
19191926
m_Layer: 0
19201927
m_Name: InputModel
19211928
m_TagString: Untagged
@@ -1937,6 +1944,19 @@ Transform:
19371944
m_Father: {fileID: 4446684710817404}
19381945
m_RootOrder: 2
19391946
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
1947+
--- !u!135 &8744463562255408498
1948+
SphereCollider:
1949+
m_ObjectHideFlags: 0
1950+
m_CorrespondingSourceObject: {fileID: 0}
1951+
m_PrefabInstance: {fileID: 0}
1952+
m_PrefabAsset: {fileID: 0}
1953+
m_GameObject: {fileID: 599836867309221058}
1954+
m_Material: {fileID: 0}
1955+
m_IsTrigger: 1
1956+
m_Enabled: 1
1957+
serializedVersion: 2
1958+
m_Radius: 0.15
1959+
m_Center: {x: 0, y: 0, z: 0}
19401960
--- !u!1 &1469228564561163144
19411961
GameObject:
19421962
m_ObjectHideFlags: 0
@@ -1946,6 +1966,7 @@ GameObject:
19461966
serializedVersion: 6
19471967
m_Component:
19481968
- component: {fileID: 1218315907877956796}
1969+
- component: {fileID: 2889454397435254994}
19491970
m_Layer: 0
19501971
m_Name: InputModel
19511972
m_TagString: Untagged
@@ -1967,6 +1988,19 @@ Transform:
19671988
m_Father: {fileID: 4427160273819458}
19681989
m_RootOrder: 2
19691990
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
1991+
--- !u!135 &2889454397435254994
1992+
SphereCollider:
1993+
m_ObjectHideFlags: 0
1994+
m_CorrespondingSourceObject: {fileID: 0}
1995+
m_PrefabInstance: {fileID: 0}
1996+
m_PrefabAsset: {fileID: 0}
1997+
m_GameObject: {fileID: 1469228564561163144}
1998+
m_Material: {fileID: 0}
1999+
m_IsTrigger: 1
2000+
m_Enabled: 1
2001+
serializedVersion: 2
2002+
m_Radius: 0.15
2003+
m_Center: {x: 0, y: 0, z: 0}
19702004
--- !u!1 &3250837035476248814
19712005
GameObject:
19722006
m_ObjectHideFlags: 0

0 commit comments

Comments
 (0)