1
1
// Copyright (c) Reality Collective. All rights reserved.
2
2
// Licensed under the MIT License. See LICENSE in the project root for license information.
3
3
4
+ using RealityCollective . Utilities . Extensions ;
4
5
using RealityToolkit . Input . Events ;
5
6
using RealityToolkit . Input . Interactors ;
7
+ using System . Collections . Generic ;
6
8
using UnityEngine ;
7
9
using UnityEngine . Events ;
8
10
@@ -18,7 +20,7 @@ public class SteeringWheelBehaviour : BaseInteractionBehaviour
18
20
{
19
21
[ SerializeField ]
20
22
[ Tooltip ( "Controls the threshold angle for steering when at maximum steering in either direction." ) ]
21
- [ Range ( 1f , 179f ) ]
23
+ [ Range ( 1f , 45 ) ]
22
24
private float steeringAngleLimit = 45f ;
23
25
24
26
[ SerializeField , Tooltip ( "If set, the steering resets to neutral on release." ) ]
@@ -39,7 +41,7 @@ public class SteeringWheelBehaviour : BaseInteractionBehaviour
39
41
private float elapsedResetTime ;
40
42
private Quaternion resetStartRotation ;
41
43
private Quaternion neutralSteeringRotation = Quaternion . Euler ( 0f , 0f , 0f ) ;
42
- private IControllerInteractor currentInteractor ;
44
+ private readonly List < IControllerInteractor > interactors = new ( ) ;
43
45
private float currentAngle ;
44
46
45
47
/// <summary>
@@ -103,7 +105,7 @@ protected override void Awake()
103
105
/// <inheritdoc/>
104
106
protected override void Update ( )
105
107
{
106
- if ( currentInteractor == null && ! resetting )
108
+ if ( interactors . Count == 0 && ! resetting )
107
109
{
108
110
return ;
109
111
}
@@ -123,64 +125,69 @@ protected override void Update()
123
125
return ;
124
126
}
125
127
126
- var angle = FindSteeringWheelAngle ( ) ;
128
+ var angle = FindWheelAngle ( ) ;
127
129
var angleDifference = currentAngle - angle ;
128
130
Rotate ( - angleDifference ) ;
129
131
currentAngle = angle ;
130
132
}
131
133
132
134
/// <inheritdoc/>
133
- protected override void OnFirstGrabEntered ( InteractionEventArgs eventArgs )
135
+ protected override void OnGrabEntered ( InteractionEventArgs eventArgs )
134
136
{
135
137
if ( eventArgs . Interactor is not IControllerInteractor controllerInteractor )
136
138
{
137
139
return ;
138
140
}
139
141
140
- currentInteractor = controllerInteractor ;
141
- currentAngle = FindSteeringWheelAngle ( ) ;
142
+ interactors . EnsureListItem ( controllerInteractor ) ;
143
+ currentAngle = FindWheelAngle ( ) ;
142
144
}
143
145
144
146
/// <inheritdoc/>
145
- protected override void OnLastGrabExited ( InteractionExitEventArgs eventArgs )
147
+ protected override void OnGrabExited ( InteractionExitEventArgs eventArgs )
146
148
{
147
- currentAngle = FindSteeringWheelAngle ( ) ;
148
- currentInteractor = null ;
149
+ if ( eventArgs . Interactor is not IControllerInteractor controllerInteractor )
150
+ {
151
+ return ;
152
+ }
153
+
154
+ interactors . SafeRemoveListItem ( controllerInteractor ) ;
155
+ currentAngle = FindWheelAngle ( ) ;
149
156
150
157
if ( resetsToNeutral )
151
158
{
152
159
ReturnToNeutral ( ) ;
153
160
}
154
161
}
155
162
156
- /// <summary>
157
- /// Rotates the steering wheel by <paramref name="angle"/>.
158
- /// </summary>
159
- /// <param name="angle">The euler angle to rotate by.</param>
160
- private void Rotate ( float angle )
163
+ private float FindWheelAngle ( )
161
164
{
162
- resetting = false ;
165
+ var totalAngle = 0f ;
163
166
164
- var rotation = transform . localEulerAngles ;
165
- var updated = rotation . z + angle ;
166
- CurrentSteeringAngle = updated ;
167
- }
167
+ foreach ( var interactor in interactors )
168
+ {
169
+ var direction = FindLocalPoint ( interactor . GameObject . transform . position ) ;
170
+ totalAngle += FindRotationSensitivity ( ) * ConvertToAngle ( direction ) ;
171
+ }
168
172
169
- private float FindSteeringWheelAngle ( )
170
- {
171
- var direction = FindLocalPoint ( currentInteractor . GameObject . transform . position ) ;
172
- return ConvertToAngle ( direction ) * FindRotationSensitivity ( ) ;
173
+ return totalAngle ;
173
174
}
174
175
175
- private Vector2 FindLocalPoint ( Vector3 position ) => upTransform . InverseTransformPoint ( position ) ;
176
+ private Vector2 FindLocalPoint ( Vector3 position ) => upTransform . InverseTransformPoint ( position ) . normalized ;
176
177
177
178
private float ConvertToAngle ( Vector2 direction ) => Vector2 . SignedAngle ( upTransform . up , direction ) ;
178
179
179
- private float FindRotationSensitivity ( ) => 1f ;
180
+ private float FindRotationSensitivity ( ) => 1f / interactors . Count ;
181
+
182
+ private void Rotate ( float angle )
183
+ {
184
+ resetting = false ;
185
+
186
+ var rotation = transform . localEulerAngles ;
187
+ var updated = rotation . z + angle ;
188
+ CurrentSteeringAngle = updated ;
189
+ }
180
190
181
- /// <summary>
182
- /// Returns the steering wheel to neutral position.
183
- /// </summary>
184
191
private void ReturnToNeutral ( )
185
192
{
186
193
if ( resetting )
0 commit comments