コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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();
                }
            }
        }
コード例 #3
0
        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;
        }
コード例 #4
0
        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();
            }
        }
コード例 #5
0
 public virtual void Visit(IMorphComponentGrab grab)
 {
 }
コード例 #6
0
 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
 }