@@ -16,6 +16,7 @@ public class BasicGrabbable : GrabbableBase<BasicGrabbable.Grabber>
1616 , IColliderEventDragFixedUpdateHandler
1717 , IColliderEventDragUpdateHandler
1818 , IColliderEventDragEndHandler
19+ , IColliderEventPressUpHandler
1920 {
2021 [ Serializable ]
2122 public class UnityEventGrabbable : UnityEvent < BasicGrabbable > { }
@@ -54,7 +55,8 @@ public RigidPose grabberOrigin
5455
5556 public RigidPose grabOffset { get ; set ; }
5657 }
57-
58+ [ Tooltip ( "StickyGrabbable grabbing this BasicGrabbable" ) ]
59+ public StickyGrabbable stickyGrabbable ;
5860 private IndexedTable < ColliderButtonEventData , Grabber > m_eventGrabberSet ;
5961
6062 public bool alignPosition ;
@@ -73,6 +75,8 @@ public RigidPose grabberOrigin
7375 [ SerializeField ]
7476 private bool m_unblockableGrab = true ;
7577 [ SerializeField ]
78+ private bool m_singleItemGrab = false ;
79+ [ SerializeField ]
7680 [ FlagsFromEnum ( typeof ( ControllerButton ) ) ]
7781 private ulong m_primaryGrabButton = 0ul ;
7882 [ SerializeField ]
@@ -99,6 +103,8 @@ public RigidPose grabberOrigin
99103
100104 public bool unblockableGrab { get { return m_unblockableGrab ; } set { m_unblockableGrab = value ; } }
101105
106+ public bool singleItemGrab { get { return m_singleItemGrab ; } set { m_singleItemGrab = value ; } }
107+
102108 public UnityEventGrabbable afterGrabbed { get { return m_afterGrabbed ; } }
103109
104110 public UnityEventGrabbable beforeRelease { get { return m_beforeRelease ; } }
@@ -166,7 +172,8 @@ protected override void Awake()
166172
167173 protected virtual void OnDisable ( )
168174 {
169- ClearGrabbers ( true ) ;
175+ if ( ! m_allowMultipleGrabbers )
176+ ClearGrabbers ( true ) ;
170177 ClearEventGrabberSet ( ) ;
171178 }
172179
@@ -196,7 +203,10 @@ protected bool IsValidGrabButton(ColliderButtonEventData eventData)
196203 public virtual void OnColliderEventDragStart ( ColliderButtonEventData eventData )
197204 {
198205 if ( ! IsValidGrabButton ( eventData ) ) { return ; }
199-
206+ if ( singleItemGrab ) {
207+ ViveColliderEventCaster caster = eventData . eventCaster as ViveColliderEventCaster ;
208+ if ( ! caster . canGrab ) { return ; }
209+ }
200210 if ( ! m_allowMultipleGrabbers )
201211 {
202212 ClearGrabbers ( false ) ;
@@ -212,6 +222,12 @@ public virtual void OnColliderEventDragStart(ColliderButtonEventData eventData)
212222 if ( m_eventGrabberSet == null ) { m_eventGrabberSet = new IndexedTable < ColliderButtonEventData , Grabber > ( ) ; }
213223 m_eventGrabberSet . Add ( eventData , grabber ) ;
214224
225+ if ( singleItemGrab )
226+ {
227+ ViveColliderEventCaster caster = eventData . eventCaster as ViveColliderEventCaster ;
228+ caster . canGrab = false ;
229+ }
230+
215231 AddGrabber ( grabber ) ;
216232 }
217233
@@ -235,13 +251,40 @@ public virtual void OnColliderEventDragUpdate(ColliderButtonEventData eventData)
235251 public virtual void OnColliderEventDragEnd ( ColliderButtonEventData eventData )
236252 {
237253 if ( m_eventGrabberSet == null ) { return ; }
238-
254+ if ( ! IsValidGrabButton ( eventData ) ) { return ; }
239255 Grabber grabber ;
240256 if ( ! m_eventGrabberSet . TryGetValue ( eventData , out grabber ) ) { return ; }
241257
242258 RemoveGrabber ( grabber ) ;
243259 m_eventGrabberSet . Remove ( eventData ) ;
244260 Grabber . Release ( grabber ) ;
261+ if ( singleItemGrab ) {
262+ ViveColliderEventCaster caster = eventData . eventCaster as ViveColliderEventCaster ;
263+ caster . canGrab = true ;
264+ }
265+ }
266+ public void ForceRelease ( )
267+ {
268+ ClearEventGrabberSet ( ) ;
269+ m_beforeRelease . Invoke ( this ) ;
270+ }
271+
272+ public void OnColliderEventPressUp ( ColliderButtonEventData eventData )
273+ {
274+ if ( stickyGrabbable != null && stickyGrabbable . isGrabbed )
275+ {
276+ ForceRelease ( ) ;
277+ }
278+ if ( singleItemGrab ) {
279+ if ( ! IsValidGrabButton ( eventData ) ) { return ; }
280+ ViveColliderEventCaster caster = eventData . eventCaster as ViveColliderEventCaster ;
281+ if ( isGrabbed )
282+ {
283+ caster . canGrab = true ;
284+ m_onDrop ? . Invoke ( this ) ;
285+ }
286+ caster . canGrab = true ;
287+ }
245288 }
246289 }
247290}
0 commit comments