Skip to content

Commit 904d777

Browse files
dariollawwong
authored andcommitted
single item grabbing, handle stickygrabbable holding basic grabbable
- added single item grabbing to avoid grabbing group of objects - added ability to let go of objects on a basic grabbable when a sticky grabbable is holding a basic grabbable
1 parent 4459bb8 commit 904d777

File tree

2 files changed

+50
-5
lines changed

2 files changed

+50
-5
lines changed

Assets/HTC.UnityPlugin/ViveInputUtility/Scripts/Misc/BasicGrabbable.cs

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

Assets/HTC.UnityPlugin/ViveInputUtility/Scripts/ViveColliderEvent/ViveColliderEventCaster.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ public class ViveColliderEventCaster : ColliderEventCaster, IViveRoleComponent
3232
private ScrollType m_scrollType = ScrollType.Auto;
3333
[SerializeField]
3434
private Vector2 m_scrollDeltaScale = new Vector2(1f, -1f);
35-
35+
[SerializeField]
36+
private bool m_canGrab = true;
37+
public bool canGrab { get { return m_canGrab; } set { m_canGrab = value; } }
3638
public ViveRoleProperty viveRole { get { return m_viveRole; } }
3739
public ScrollType scrollType { get { return m_scrollType; } set { m_scrollType = value; } }
3840
public Vector2 scrollDeltaScale { get { return m_scrollDeltaScale; } set { m_scrollDeltaScale = value; } }

0 commit comments

Comments
 (0)