This repository has been archived by the owner on Dec 5, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathGrabbingSender.cs
110 lines (95 loc) · 3.91 KB
/
GrabbingSender.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using Assets.Gamelogic.Player;
using Improbable;
using Improbable.Collections;
using Improbable.Player;
using Improbable.Unity;
using Improbable.Unity.Visualizer;
using UnityEngine;
namespace Assets.Gamelogic.Grabbing
{
// Runs on client-side player game object
[WorkerType(WorkerPlatform.UnityClient)]
public class GrabbingSender : MonoBehaviour
{
[Require] private Grab.Writer GrabWriter;
[SerializeField] private GameObject LeftHand;
[SerializeField] private GameObject RightHand;
[SerializeField] private SteamVR_TrackedController LeftController;
[SerializeField] private SteamVR_TrackedController RightController;
private void OnEnable()
{
LeftController.TriggerClicked += AttemptPickup;
RightController.TriggerClicked += AttemptPickup;
LeftController.TriggerUnclicked += AttemptDrop;
RightController.TriggerUnclicked += AttemptDrop;
}
private void AttemptPickup(object sender, ClickedEventArgs e)
{
ControllerSide controllerSide;
GameObject reachableObject;
if (ReceivedEventFrom(e, LeftController))
{
controllerSide = ControllerSide.LEFT;
reachableObject = LeftHand.GetComponent<HandCollisionHandler>().GetClosestReachableObject();
}
else
{
controllerSide = ControllerSide.RIGHT;
reachableObject = RightHand.GetComponent<HandCollisionHandler>().GetClosestReachableObject();
}
if (reachableObject != null)
{
SendPickupRequest(controllerSide, reachableObject.EntityId());
}
}
private void SendPickupRequest(ControllerSide controllerSide, EntityId reachableObjectId)
{
var update = new Grab.Update();
var grabRequestEvent = new GrabRequestEvent(reachableObjectId, controllerSide);
update.AddGrabRequest(grabRequestEvent);
GrabWriter.Send(update);
}
public void UpdateHeldEntity(ControllerSide controllerSide, Option<EntityId> grabbedObjectId)
{
var heldEntities = GrabWriter.Data.heldEntities;
heldEntities.Remove(controllerSide);
if (grabbedObjectId.HasValue)
{
heldEntities.Add(controllerSide, grabbedObjectId.Value);
}
GrabWriter.Send(new Grab.Update().SetHeldEntities(heldEntities));
}
private void AttemptDrop(object sender, ClickedEventArgs e)
{
EntityId heldObjectId;
if (ReceivedEventFrom(e, LeftController) && HoldingSomethingWith(ControllerSide.LEFT, out heldObjectId))
{
SendDropRequest(heldObjectId);
}
else if (ReceivedEventFrom(e, RightController) && HoldingSomethingWith(ControllerSide.RIGHT, out heldObjectId))
{
SendDropRequest(heldObjectId);
}
}
private bool ReceivedEventFrom(ClickedEventArgs e, SteamVR_TrackedController controller)
{
return e.controllerIndex == controller.controllerIndex;
}
private void SendDropRequest(EntityId heldObjectId)
{
var update = new Grab.Update();
var dropRequestEvent = new DropRequestEvent(heldObjectId);
update.AddDropRequest(dropRequestEvent);
GrabWriter.Send(update);
}
private bool HoldingSomethingWith(ControllerSide controllerSide, out EntityId heldItem)
{
return GrabWriter.Data.heldEntities.TryGetValue(controllerSide, out heldItem);
}
// Provides a way for grabbable objects to inform player they are not holding object
public void ForceLocalDrop(ControllerSide controllerSide)
{
UpdateHeldEntity(controllerSide, new Option<EntityId>());
}
}
}