示例#1
0
        void checkRemoteCollision()
        {
            // Should we unignore this object if we are no longer pulling it towards us?
            if (remoteIgnoredGrabbable != null && ThisGrabber.RemoteGrabbingGrabbable != remoteIgnoredGrabbable)
            {
                // If we are holding this object then let the settings take care of it
                if (ThisGrabber.HeldGrabbable == remoteIgnoredGrabbable)
                {
                    remoteIgnoredGrabbable = null;
                }
                // Otherwise we dropped it mid flight and should unignore it
                else
                {
                    IgnoreGrabbableCollisions(remoteIgnoredGrabbable, false);
                    remoteIgnoredGrabbable = null;
                }
            }

            // Ignore collision with object we started pulling towards us
            if (ThisGrabber.RemoteGrabbingGrabbable != null && ThisGrabber.RemoteGrabbingGrabbable != remoteIgnoredGrabbable)
            {
                remoteIgnoredGrabbable = ThisGrabber.RemoteGrabbingGrabbable;
                IgnoreGrabbableCollisions(remoteIgnoredGrabbable, true);
            }
        }
示例#2
0
        // Assign new held Item, then grab the item into our hand / controller
        public void GrabGrabbable(Grabbable item)
        {
            // We are trying to grab something else
            if (flyingGrabbable != null && item != flyingGrabbable)
            {
                return;
            }

            // Make sure we aren't flying an object at us still
            resetFlyingGrabbable();

            // Drop whatever we were holding
            if (HeldGrabbable != null && HeldGrabbable)
            {
                Debug.Log("Try release:" + HeldGrabbable.name);
                TryRelease();
            }

            // Assign new grabbable
            HeldGrabbable = item;

            // Just grabbed something, no longer fresh.
            FreshGrip = false;
            Debug.Log("Grabbb in grabber: " + item.name);
            // Let item know it's been grabbed
            item.GrabItem(this);
            Grab?.Invoke(new GrabbableEventArgs(item, this));
        }
示例#3
0
        public void GrabAmmo(Grabber grabber)
        {
            if (GetAmmo() != null)
            {
                GameObject ammo = Instantiate(GetAmmo(), grabber.transform.position, grabber.transform.rotation) as GameObject;
                Grabbable  g    = ammo.GetComponent <Grabbable>();

                // Disable rings for performance
                GrabbableRingHelper grh = ammo.GetComponentInChildren <GrabbableRingHelper>();
                if (grh)
                {
                    Destroy(grh);
                    RingHelper r = ammo.GetComponentInChildren <RingHelper>();
                    Destroy(r.gameObject);
                }


                // Offset to hand
                ammo.transform.parent        = grabber.transform;
                ammo.transform.localPosition = -g.GrabPositionOffset;
                ammo.transform.parent        = null;

                grabber.GrabGrabbable(g);
            }
        }
示例#4
0
        // Update is called once per frame
        void Update()
        {
            ClosestGrabbable = getClosestGrabbable();

            // Can we grab something
            if (HeldItem == null && ClosestGrabbable != null)
            {
                float secondsSinceDrop = Time.time - ClosestGrabbable.LastDropTime;
                if (secondsSinceDrop < MaxDropTime)
                {
                    GrabGrabbable(ClosestGrabbable);
                }
            }

            // Keep snapped to us or drop
            if (HeldItem != null)
            {
                // Something picked this up or changed transform parent
                if (HeldItem.BeingHeld || HeldItem.transform.parent != transform)
                {
                    ReleaseAll();
                }
                else
                {
                    // We are holding this item
                    if (ScaleItem != 1f)
                    {
                        float scaleTo = HeldItem.OriginalScale * ScaleItem;
                        HeldItem.transform.localScale = Vector3.Lerp(HeldItem.transform.localScale, new Vector3(scaleTo, scaleTo, scaleTo), Time.deltaTime * 30f);
                    }

                    // Make  sure this can't be grabbed from the snap zone
                    if (HeldItem.enabled || (disabledColliders[0] != null && disabledColliders[0].enabled))
                    {
                        disableGrabbable(HeldItem);
                    }

                    // Lock into place
                    if (offset)
                    {
                        HeldItem.transform.localPosition    = offset.LocalPositionOffset;
                        HeldItem.transform.localEulerAngles = offset.LocalRotationOffset;
                    }
                    else
                    {
                        HeldItem.transform.localPosition    = Vector3.zero;
                        HeldItem.transform.localEulerAngles = Vector3.zero;
                    }
                }
            }

            // Can't drop item. Lerp to position if not being held
            if (!CanDropItem && trackedItem != null && HeldItem == null)
            {
                if (!trackedItem.BeingHeld)
                {
                    GrabGrabbable(trackedItem);
                }
            }
        }
示例#5
0
        void Start()
        {
            if (dummyGrabbable == null)
            {
                var go = new GameObject("Dummy Grabbable");
                dummyGrabbable = go.AddComponent <Grabbable>();
                dummyGrabbable.transform.parent        = transform;
                dummyGrabbable.transform.localPosition = Vector3.zero;
                dummyGrabbable.transform.localRotation = Quaternion.identity;



                // Copy over grab points
                List <Transform> grabs = new List <Transform>();
                for (int x = 0; x < GrabPoints.Count; x++)
                {
                    GrabPoint g = GrabPoints[x];
                    grabs.Add(g.transform);
                }
                dummyGrabbable.GrabPoints      = grabs;
                dummyGrabbable.GrabMechanic    = GrabType.Snap;
                dummyGrabbable.ParentHandModel = false;
                dummyGrabbable.CanBeDropped    = false;

                // Copy settings over from reference object if available
                if (GrabObject != null)
                {
                    dummyGrabbable.GrabButton = GrabObject.GrabButton;
                    dummyGrabbable.Grabtype   = GrabObject.Grabtype;
                }
            }
        }
示例#6
0
        IEnumerator EjectMagRoutine(Grabbable ejectedMag)
        {
            if (ejectedMag != null && ejectedMag.GetComponent <Rigidbody>() != null)
            {
                Rigidbody ejectRigid = ejectedMag.GetComponent <Rigidbody>();

                // Wait before ejecting

                // Move clip down before we eject it
                ejectedMag.transform.parent = transform;

                if (ejectedMag.transform.localPosition.y > -ClipSnapDistance)
                {
                    ejectedMag.transform.localPosition = new Vector3(0, -0.1f, 0);
                }

                // Eject with physics force
                ejectedMag.transform.parent = null;
                ejectRigid.AddForce(-ejectedMag.transform.up * EjectForce, ForceMode.VelocityChange);

                yield return(new WaitForFixedUpdate());

                ejectedMag.transform.parent = null;
            }

            yield return(null);
        }
示例#7
0
        protected virtual bool isValidGrabbale(Collider col, Grabbable grab)
        {
            // Object has been deactivated. Remove it
            if (col == null || grab == null || !grab.isActiveAndEnabled || !col.enabled)
            {
                return(false);
            }
            // Not considered grabbable any longer. May have been picked up, marked, etc.
            else if (!grab.IsGrabbable())
            {
                return(false);
            }
            // Snap Zone without an item isn't a valid grab. Want to skip this unless something is inside
            else if (grab.GetComponent <SnapZone>() != null && grab.GetComponent <SnapZone>().HeldItem == null)
            {
                return(false);
            }
            // Position was manually set outside of break distance
            // No longer possible for it to be the closestGrabbable
            else if (grab == ClosestGrabbable)
            {
                if (grab.BreakDistance > 0 && Vector3.Distance(grab.transform.position, transform.position) > grab.BreakDistance)
                {
                    return(false);
                }
            }

            return(true);
        }
示例#8
0
        public virtual bool GetInputDownForGrabbable(Grabbable grabObject)
        {
            if (grabObject == null)
            {
                return(false);
            }

            // Check Hold Controls
            HoldType   closestHoldType   = getHoldType(grabObject);
            GrabButton closestGrabButton = GetGrabButton(grabObject);

            // Hold to grab controls
            if (closestHoldType == HoldType.HoldDown)
            {
                bool grabInput = getGrabInput(closestGrabButton) >= GripAmount;

                if (closestGrabButton == GrabButton.Grip && !FreshGrip)
                {
                    return(false);
                }

                //if(HandSide == ControllerHand.Left && InputBridge.Instance.LeftTrigger > 0.9f) {
                //    Debug.Log("Trigger Down");
                //}

                return(grabInput);
            }
            // Check Toggle Controls
            else if (closestHoldType == HoldType.Toggle)
            {
                return(getToggleInput(closestGrabButton));
            }

            return(false);
        }
示例#9
0
        // Assign new held Item, then grab the item into our hand / controller
        public virtual void GrabGrabbable(Grabbable item)
        {
            // We are trying to grab something else
            if (flyingGrabbable != null && item != flyingGrabbable)
            {
                return;
            }

            // Make sure we aren't flying an object at us still
            resetFlyingGrabbable();

            // Drop whatever we were holding
            if (HeldGrabbable != null && HeldGrabbable)
            {
                TryRelease();
            }

            // Assign new grabbable
            HeldGrabbable = item;

            // Just grabbed something, no longer fresh.
            FreshGrip = false;

            // Fire off Grabber event
            if (onGrabEvent != null)
            {
                onGrabEvent.Invoke(item);
            }

            // Let item know it's been grabbed
            item.GrabItem(this);
        }
示例#10
0
 public virtual void RemoveNearbyGrabbable(Collider col, Grabbable grabObject)
 {
     if (grabObject != null && NearbyGrabbables.ContainsKey(col))
     {
         NearbyGrabbables.Remove(col);
     }
 }
示例#11
0
        // See if we are inputting controls to grab an item
        public virtual bool InputCheckGrab()
        {
            // Nothing nearby to grab
            Grabbable closest = getClosestOrRemote();

            return(GetInputDownForGrabbable(closest));
        }
示例#12
0
        void OnTriggerEnter(Collider other)
        {
            Grabbable grab = other.GetComponent <Grabbable>();

            if (grab != null)
            {
                if (grab.transform.name.Contains(AcceptBulletName))
                {
                    // Weapon is full
                    if (Weapon.GetBulletCount() >= Weapon.MaxInternalAmmo)
                    {
                        return;
                    }

                    // Drop the bullet and add ammo to gun
                    grab.DropItem(false, true);
                    grab.transform.parent = null;
                    GameObject.Destroy(grab.gameObject);

                    // Up Ammo Count
                    GameObject b = new GameObject();
                    b.AddComponent <Bullet>();
                    b.transform.parent = Weapon.transform;

                    // Play Sound
                    if (InsertSound)
                    {
                        VRUtils.Instance.PlaySpatialClipAt(InsertSound, transform.position, 1f, 0.5f);
                    }
                }
            }
        }
示例#13
0
        // Start is called before the first frame update
        void Start()
        {
            mainCam   = Camera.main.transform;
            grabbable = transform.parent.GetComponent <Grabbable>();
            canvas    = GetComponent <Canvas>();
            scaler    = GetComponent <CanvasScaler>();
            text      = GetComponent <Text>();

            if (text == null)
            {
                Debug.LogWarning("No Text Component Found on RingHelper");
                return;
            }

            _initalOpacity  = text.color.a;
            _currentOpacity = _initalOpacity;

            // Assign left / right grabbers
            Grabber[] grabs = GameObject.FindGameObjectWithTag("Player").GetComponentsInChildren <Grabber>();
            foreach (var g in grabs)
            {
                if (g.HandSide == ControllerHand.Left)
                {
                    leftGrabber = g;
                }
                else if (g.HandSide == ControllerHand.Right)
                {
                    rightGrabber = g;
                }
            }
        }
示例#14
0
        public void DoDismemberment(Grabber grabbedBy)
        {
            if (ReplaceGrabbableWith && grabbedBy != null)
            {
                if (grabbedBy.HeldGrabbable)
                {
                    grabbedBy.HeldGrabbable.DropItem(grabbedBy, true, true);
                }

                if (ReplaceGrabbableWith)
                {
                    ReplaceGrabbableWith.SetActive(true);
                    Grabbable g = ReplaceGrabbableWith.GetComponent <Grabbable>();
                    g.transform.parent     = null;
                    g.transform.localScale = Vector3.one;
                    g.UpdateOriginalParent();

                    grabbedBy.GrabGrabbable(g);
                }
            }

            if (ShrinkBone)
            {
                ShrinkBone.localScale = Vector3.zero;
                ShrinkBone.gameObject.SetActive(false);
            }

            if (EnableOnDetach)
            {
                EnableOnDetach.SetActive(true);
            }
        }
示例#15
0
 public void AddNearbyGrabbable(Collider col, Grabbable grabObject)
 {
     if (grabObject != null && !NearbyGrabbables.ContainsKey(col))
     {
         NearbyGrabbables.Add(col, grabObject);
     }
 }
示例#16
0
 public virtual void RemoveValidRemoteGrabbable(Collider col, Grabbable grabObject)
 {
     if (grabObject != null && ValidRemoteGrabbables != null && ValidRemoteGrabbables.ContainsKey(col))
     {
         ValidRemoteGrabbables.Remove(col);
     }
 }
示例#17
0
 void Start()
 {
     col             = GetComponent <Collider>();
     rigid           = col.attachedRigidbody;
     ignoreColliders = GetComponentsInChildren <Collider>();
     thisGrabbable   = GetComponent <Grabbable>();
 }
示例#18
0
        public void GrabArrow(Arrow arrow)
        {
            arrowGrabber = ClosestGrabber;

            // Signal the grabbable that we're being held
            GrabbedArrow = arrow.GetComponent <Arrow>();
            GrabbedArrow.ShaftCollider.enabled = false;

            arrowGrabbable = arrow.GetComponent <Grabbable>();

            if (arrowGrabbable)
            {
                arrowGrabbable.GrabItem(arrowGrabber);
                arrowGrabber.HeldGrabbable = arrowGrabbable;
                arrowGrabbable.AddControllerVelocityOnDrop = false;
            }


            Collider playerCollder = GameObject.FindGameObjectWithTag("Player").GetComponentInChildren <Collider>();

            if (playerCollder)
            {
                Physics.IgnoreCollision(GrabbedArrow.ShaftCollider, playerCollder);
            }

            holdingArrow = true;
        }
示例#19
0
        float minTimeBetweenGrabs = 0.2f; // In Seconds

        public override void OnGrab(Grabber grabber)
        {
            if (g == null)
            {
                g = GetComponent <Grabbable>();
            }

            // Never hold this item
            g.DropItem(grabber, false, false);

            // Don't grab this if we are currently grabbing / remote grabbing a different item
            if (grabber.RemoteGrabbingItem || grabber.HoldingItem)
            {
                return;
            }

            // Call the event
            if (OnGrabEvent != null)
            {
                // Don't want to repeatedly do grabs if this is a hold item
                if (Time.time - lastGrabTime >= minTimeBetweenGrabs)
                {
                    OnGrabEvent.Invoke(grabber);
                    lastGrabTime = Time.time;
                }
            }
        }
示例#20
0
        public void EjectMagazine()
        {
            Grabbable ejectedMag = detachMagazine();

            lastEjectTime = Time.time;

            StartCoroutine(EjectMagRoutine(ejectedMag));
        }
示例#21
0
 // Make sure all starting values are reset
 void resetArrowValues()
 {
     GrabbedArrow    = null;
     arrowGrabbable  = null;
     arrowGrabber    = null;
     holdingArrow    = false;
     playedDrawSound = false;
 }
示例#22
0
        /// <summary>
        /// This is typically called by the GrabAction on the SnapZone
        /// </summary>
        /// <param name="grabber"></param>
        public void GrabEquipped(Grabber grabber)
        {
            if (grabber != null)
            {
                if (HeldItem)
                {
                    // Not allowed to be removed
                    if (!CanBeRemoved())
                    {
                        return;
                    }

                    var g = HeldItem;
                    if (DuplicateItemOnGrab)
                    {
                        ReleaseAll();

                        // Position next to grabber if somewhat far away
                        if (Vector3.Distance(g.transform.position, grabber.transform.position) > 0.2f)
                        {
                            g.transform.position = grabber.transform.position;
                        }

                        // Instantiate the object before it is grabbed
                        GameObject go = Instantiate(g.gameObject, transform.position, Quaternion.identity) as GameObject;
                        if (nextBallIsGold == true)
                        {
                            go.GetComponent <Ball>().SetGoldBall(true);
                            nextBallIsGold = false;
                        }
                        else
                        {
                            go.GetComponent <Ball>().SetGoldBall(false);
                        }
                        Grabbable grab = go.GetComponent <Grabbable>();

                        // Ok to attach it to snap zone now
                        this.GrabGrabbable(grab);

                        // Finish Grabbing the desired object
                        grabber.GrabGrabbable(g);
                    }
                    else
                    {
                        ReleaseAll();

                        // Position next to grabber if somewhat far away
                        if (Vector3.Distance(g.transform.position, grabber.transform.position) > 0.2f)
                        {
                            g.transform.position = grabber.transform.position;
                        }

                        // Do grab
                        grabber.GrabGrabbable(g);
                    }
                }
            }
        }
示例#23
0
        void OnTriggerEnter(Collider other)
        {
            Grabbable grab = other.GetComponent <Grabbable>();

            if (HeldMagazine == null && grab != null && grab.transform.name.Contains(AcceptableMagazineName))
            {
                AttachGrabbableMagazine(grab, other);
            }
        }
示例#24
0
        // Start is called before the first frame update
        void Start()
        {
            grabbable = GetComponent <Grabbable>();

            if (CollisionParticle != null)
            {
                CollisionParticle.Stop();
            }
        }
示例#25
0
        private void Awake()
        {
            grab = GetComponent <Grabbable>();

            if (GameObject.FindGameObjectWithTag("Player"))
            {
                input = GameObject.FindGameObjectWithTag("Player").GetComponent <InputBridge>();
            }
        }
示例#26
0
        void OnTriggerExit(Collider other)
        {
            Grabbable grabObject = other.GetComponent <Grabbable>();

            if (grabObject != null && ParentGrabber != null)
            {
                ParentGrabber.RemoveValidRemoteGrabbable(other, grabObject);
            }
        }
示例#27
0
        void OnTriggerExit(Collider other)
        {
            Grabbable g = other.GetComponent <Grabbable>();

            if (g != null)
            {
                RemoveNearbyGrabbable(other, g);
            }
        }
示例#28
0
        void OnTriggerEnter(Collider other)
        {
            Grabbable g = other.GetComponent <Grabbable>();

            if (g != null)
            {
                AddNearbyGrabbable(other, g);
            }
        }
示例#29
0
        public void GrabGrabbable(Grabbable grab)
        {
            // Grab is already in Snap Zone
            if (grab.transform.parent != null && grab.transform.parent.GetComponent <SnapZone>() != null)
            {
                return;
            }

            if (HeldItem != null)
            {
                ReleaseAll();
            }

            HeldItem = grab;

            // Set scale factor
            // Use SnapZoneScale if specified
            if (grab.GetComponent <SnapZoneScale>())
            {
                _scaleTo = grab.GetComponent <SnapZoneScale>().Scale;
            }
            else
            {
                _scaleTo = ScaleItem;
            }

            // Is there an offset to apply?
            SnapZoneOffset off = grab.GetComponent <SnapZoneOffset>();

            if (off)
            {
                offset = off;
            }
            else
            {
                offset = grab.gameObject.AddComponent <SnapZoneOffset>();
                offset.LocalPositionOffset = Vector3.zero;
                offset.LocalRotationOffset = Vector3.zero;
            }

            // Disable the grabbable. This is picked up through a Grab Action
            disableGrabbable(grab);

            grab.transform.parent = transform;

            // Call event
            if (OnSnapEvent != null)
            {
                OnSnapEvent.Invoke(grab);
            }

            if (SoundOnSnap)
            {
                VRUtils.Instance.PlaySpatialClipAt(SoundOnSnap, transform.position, 0.75f);
            }
        }
示例#30
0
 void resetFlyingGrabbable()
 {
     // No longer flying at us
     if (flyingGrabbable != null)
     {
         flyingGrabbable.ResetGrabbing();
         flyingGrabbable = null;
         flyingTime      = 0;
     }
 }