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); } }
// 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)); }
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); } }
// 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); } } }
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; } } }
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); }
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); }
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); }
// 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); }
public virtual void RemoveNearbyGrabbable(Collider col, Grabbable grabObject) { if (grabObject != null && NearbyGrabbables.ContainsKey(col)) { NearbyGrabbables.Remove(col); } }
// See if we are inputting controls to grab an item public virtual bool InputCheckGrab() { // Nothing nearby to grab Grabbable closest = getClosestOrRemote(); return(GetInputDownForGrabbable(closest)); }
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); } } } }
// 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; } } }
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); } }
public void AddNearbyGrabbable(Collider col, Grabbable grabObject) { if (grabObject != null && !NearbyGrabbables.ContainsKey(col)) { NearbyGrabbables.Add(col, grabObject); } }
public virtual void RemoveValidRemoteGrabbable(Collider col, Grabbable grabObject) { if (grabObject != null && ValidRemoteGrabbables != null && ValidRemoteGrabbables.ContainsKey(col)) { ValidRemoteGrabbables.Remove(col); } }
void Start() { col = GetComponent <Collider>(); rigid = col.attachedRigidbody; ignoreColliders = GetComponentsInChildren <Collider>(); thisGrabbable = GetComponent <Grabbable>(); }
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; }
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; } } }
public void EjectMagazine() { Grabbable ejectedMag = detachMagazine(); lastEjectTime = Time.time; StartCoroutine(EjectMagRoutine(ejectedMag)); }
// Make sure all starting values are reset void resetArrowValues() { GrabbedArrow = null; arrowGrabbable = null; arrowGrabber = null; holdingArrow = false; playedDrawSound = false; }
/// <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); } } } }
void OnTriggerEnter(Collider other) { Grabbable grab = other.GetComponent <Grabbable>(); if (HeldMagazine == null && grab != null && grab.transform.name.Contains(AcceptableMagazineName)) { AttachGrabbableMagazine(grab, other); } }
// Start is called before the first frame update void Start() { grabbable = GetComponent <Grabbable>(); if (CollisionParticle != null) { CollisionParticle.Stop(); } }
private void Awake() { grab = GetComponent <Grabbable>(); if (GameObject.FindGameObjectWithTag("Player")) { input = GameObject.FindGameObjectWithTag("Player").GetComponent <InputBridge>(); } }
void OnTriggerExit(Collider other) { Grabbable grabObject = other.GetComponent <Grabbable>(); if (grabObject != null && ParentGrabber != null) { ParentGrabber.RemoveValidRemoteGrabbable(other, grabObject); } }
void OnTriggerExit(Collider other) { Grabbable g = other.GetComponent <Grabbable>(); if (g != null) { RemoveNearbyGrabbable(other, g); } }
void OnTriggerEnter(Collider other) { Grabbable g = other.GetComponent <Grabbable>(); if (g != null) { AddNearbyGrabbable(other, g); } }
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); } }
void resetFlyingGrabbable() { // No longer flying at us if (flyingGrabbable != null) { flyingGrabbable.ResetGrabbing(); flyingGrabbable = null; flyingTime = 0; } }