Skip to content

Commit 5257f22

Browse files
committed
Fix possible exception when Unity.XR.Hands isn't installed
This can happen if the library isn't installed and UnityXRFingerTrackingProvider is loaded through reflection.
1 parent 4cc3b6b commit 5257f22

File tree

1 file changed

+11
-8
lines changed

1 file changed

+11
-8
lines changed

Source/CustomAvatar/Tracking/UnityXR/UnityXRFingerTrackingProvider.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
// You should have received a copy of the GNU Lesser General Public License
1515
// along with this program. If not, see <https://www.gnu.org/licenses/>.
1616

17+
using System.Collections;
1718
using System.Collections.Generic;
1819
using System.Diagnostics.CodeAnalysis;
1920
using System.Linq;
@@ -29,17 +30,18 @@ namespace CustomAvatar.Tracking.UnityXR
2930
internal class UnityXRFingerTrackingProvider : IFingerTrackingProvider, ITickable
3031
{
3132
// these values are based on Index controllers and may not work as well with others
32-
private static readonly float[] kOpenFingerCurls = { -17f, 7f, 11f, 13f, 10f };
33-
private static readonly float[] kClosedFingerCurls = { 136f, 291f, 291f, 292f, 287f };
33+
private static readonly float[] kOpenFingerCurls = [-17f, 7f, 11f, 13f, 10f];
34+
private static readonly float[] kClosedFingerCurls = [136f, 291f, 291f, 292f, 287f];
3435

35-
private readonly List<XRHandSubsystem> _subsystems = new();
36+
// Can't use XRHandSubsystem for field types since they'll fail to load if Unity.XR.Hands isn't installed.
37+
private readonly IList _subsystems = new List<XRHandSubsystem>();
3638

3739
private readonly float[] _leftHandFingerCurls = new float[5];
3840
private readonly float[] _rightHandFingerCurls = new float[5];
3941

4042
private readonly BeatSaberUtilities _beatSaberUtilities;
4143

42-
private XRHandSubsystem _subsystem;
44+
private ISubsystem _subsystem;
4345

4446
private bool _leftJointsTracked;
4547
private bool _rightJointsTracked;
@@ -57,8 +59,9 @@ public void Tick()
5759
return;
5860
}
5961

60-
SubsystemManager.GetSubsystems(_subsystems);
61-
XRHandSubsystem subsystem = _subsystems.FirstOrDefault(s => s.running);
62+
var subsystems = (List<XRHandSubsystem>)_subsystems;
63+
SubsystemManager.GetSubsystems(subsystems);
64+
XRHandSubsystem subsystem = subsystems.FirstOrDefault(s => s.running);
6265

6366
if (subsystem == null)
6467
{
@@ -67,12 +70,12 @@ public void Tick()
6770

6871
if (_subsystem != null)
6972
{
70-
_subsystem.updatedHands -= OnUpdatedHands;
73+
((XRHandSubsystem)_subsystem).updatedHands -= OnUpdatedHands;
7174
}
7275

7376
_subsystem = subsystem;
7477

75-
_subsystem.updatedHands += OnUpdatedHands;
78+
subsystem.updatedHands += OnUpdatedHands;
7679
}
7780

7881
private void OnUpdatedHands(XRHandSubsystem handSubsystem, XRHandSubsystem.UpdateSuccessFlags updateSuccessFlags, XRHandSubsystem.UpdateType updateType)

0 commit comments

Comments
 (0)