protected void ListenTriggerValue(object sender, float value) { if (!LastHitComponent || LastHitComponent.GetComponent <IMorphInteractiveComponent>() == null) { return; } //Grab IMorphComponentGrab grab = LastHitComponent.GetComponent <IMorphComponentGrab>(); if (grab == null) { return; } if (value >= 0.9f && !grab.IsGrabbed) { grab.Grab(); //Store initial distance between object and controller GrabbedComponentInitialDistance = Vector3.Distance(LastHitComponent.transform.position, transform.position); } else if (value < 0.1f && grab.IsGrabbed) { grab.Release(); } }
private void CancelInteractions() { if (LastHitComponent && LastHitComponent.GetComponent <IMorphInteractiveComponent>() != null) { //Unfocus IMorphComponentFocus focus = LastHitComponent?.GetComponent <IMorphComponentFocus>(); if (focus != null && focus.IsFocused) { focus.Unfocus(); } //Deselect IMorphComponentSelect select = LastHitComponent?.GetComponent <IMorphComponentSelect>(); if (select != null && select.IsSelected) { select.Deselect(); } //Release IMorphComponentGrab grab = LastHitComponent?.GetComponent <IMorphComponentGrab>(); if (grab != null && grab.IsGrabbed) { grab.Release(); } } }
public override void Visit(IMorphComponentGrab visitable) { base.Visit(visitable); GameObject componentGameObject = (visitable as Component)?.gameObject; if (!componentGameObject) { return; } TMorphComponentGrabWithEventTrigger grabWithEventTrigger = componentGameObject.GetComponent <TMorphComponentGrabWithEventTrigger>(); if (!grabWithEventTrigger) { grabWithEventTrigger = componentGameObject.AddComponent <TMorphComponentGrabWithEventTrigger>(); } grabWithEventTrigger.GrabValidation += GrabValidation; grabWithEventTrigger.ReleaseValidation += ReleaseValidation; grabWithEventTrigger.Grab.Grabbed += ComponentGrabbed; grabWithEventTrigger.Grab.Released += ComponentReleased; grabWithEventTrigger.WhileGrabbed += WhileGrabbed; }
protected override void BeforeUpdate() { base.BeforeUpdate(); //if no object is hit, no grab if (!Reticle.CurrentRaycastResult.isValid) { return; } //if hit object doesn't have grab component, no grab IMorphComponentGrab grab = Reticle.CurrentRaycastResult.gameObject.GetComponent <IMorphComponentGrab>(); if (grab == null) { return; } //Is begin grab if (Reticle.TriggerDown && !_wasTriggerDownLastFrame) { _wasTriggerDownLastFrame = true; _elapsedTimeWithTriggerDown = 0; } //No trigger pressed, no grab if (!_wasTriggerDownLastFrame) { return; } //User is holding trigger, compute holding time if (Reticle.Triggering) { _elapsedTimeWithTriggerDown += Time.deltaTime; } //If not triggering, release else { _elapsedTimeWithTriggerDown = 0; _wasTriggerDownLastFrame = false; ComponentReleased(this, null); if (grab.IsGrabbed) { grab.Release(); } } //If trigger held and component not yet grabbed, and wait time reached, grab component if (_wasTriggerDownLastFrame && !grab.IsGrabbed && _elapsedTimeWithTriggerDown >= _waitTimeBeforeGrab) { //Store component being grabbed CurrentlyGrabbedComponent = Reticle.CurrentRaycastResult.gameObject; //grab component grab.Grab(); } }
public virtual void Visit(IMorphComponentGrab grab) { }
public override void Visit(IMorphComponentGrab visitable) { //Override grab, we don't use event trigger for grab as Google VR reticle doesn't seem to handle begin drag/drag/end drag events }