BasicAction GetSecondaryAction(InteractableRaw thisInteractable, InteractorRaw interactor) { BasicAction action = null; switch (secondary) { case SecondGrab.None: action = new NothingAction(thisInteractable, interactor); break; case SecondGrab.Switch: action = new SwitchAction(thisInteractable, interactor); break; case SecondGrab.Scale: break; case SecondGrab.LookAt: var updateType = followType == FollowType.Transform ? UpdateEvents.BeforeRender : UpdateEvents.FixedUpdate; action = new LookAtAction(thisInteractable, interactor, ((FollowAction)grab.grabbedObjects[0].action).offset, true, updateType); break; } return(action); }
public Transform CreateOffset(InteractorRaw interactor) { var grabPoint = new GameObject($"GrabPoint [{attach.ToString()}]").transform; grabPoint.parent = transform; switch (attach) { case AttachType.Origin: grabPoint.localPosition = Vector3.zero; grabPoint.localRotation = Quaternion.identity; break; case AttachType.ConstantOffset: grabPoint.localPosition = constPosOffset; grabPoint.localRotation = constRotOffset; break; case AttachType.GrabOffset: grabPoint.position = interactor.transform.position; grabPoint.rotation = interactor.transform.rotation; break; } return(grabPoint); }
public void NotifyGrab(InteractorRaw interactor) { if (!interactor) { return; } if (grabbedObjects.Count == 0) { } BasicAction grabTypeAction = null; //Utils.CleanInteractions.CleanInteracableTouching(interactor, ref parent.touch.touchedObjects); if (grabbedObjects.Count < 1) { grabTypeAction = parent.PrimaryActionEvent(parent, interactor); } else //bool canGrab if (grabbedObjects.Count == 1) { grabTypeAction = parent.SecondaryActionEvent(parent, interactor); } if (grabTypeAction != null) { grabbedObjects.Add(new GrabData(interactor, parent, grabTypeAction)); parent.Grabbed?.Invoke(interactor); GrabProccess(); } }
public GrabData(InteractorRaw _hand, InteractableRaw _interactable, BasicAction _action) { interactor = _hand; interactable = _interactable; action = _action; kinematicOnRelease = interactable.mainRigidbody.isKinematic; gravityOnRelease = interactable.mainRigidbody.useGravity; }
int GetUngrabindex(InteractorRaw interactor = null) { int index = -1; if (interactor != null) { for (int i = 0; i < grabbedObjects.Count; i++) { if (interactor == grabbedObjects[i].interactor) { index = i; break; } } } else { index = grabbedObjects.Count - 1; } return(index); }
public void NotifyUnGrab(InteractorRaw interactor = null) { if (grabbedObjects.Count == 0) { return; } int removeIndex = GetUngrabindex(interactor); if (removeIndex == -1) { return; } if (grabbedObjects.Count == 1) //if last hand is leaving { UnGrabProcess(); } grabbedObjects[removeIndex].Destroy(); grabbedObjects.RemoveAt(removeIndex); if (grabbedObjects.Count >= 1) { CascadeActions(); } parent.UnGrabbed?.Invoke(interactor); if (handsGrabbing < 0) { Debug.LogError("Too many ungrabs " + interactor, parent); } }
public virtual BasicAction GetDrivePrimaryAction(InteractableRaw thisInteractable, InteractorRaw interactor) { //return base.GetPrimaryAction(interactor); Transform offset = thisInteractable.CreateOffset(interactor); //if (driveType == DriveTypes.Directional) // switch (thisInteractable.followType) // { // case FollowType.Transform: // return new DirectionalTransformDriveAction(this, thisInteractable, interactor, offset); // case FollowType.Rigidbody: // return new DirectionalRigidbodyDriveAction(this, thisInteractable, interactor, offset); // case FollowType.Joint: // return new DirectionalDriveJointAction(this, thisInteractable.mainRigidbody, interactor, offset); // } //else if (driveType == DriveTypes.Rotational) // switch (thisInteractable.followType) // { // case FollowType.Transform: // return new RotationalTransformDriveAction(this, thisInteractable, interactor, offset); // case FollowType.Rigidbody: // break; // case FollowType.Joint: // break; // } return(null); }
public virtual BasicAction GetPrimaryAction(InteractableRaw thisInteractable, InteractorRaw interactor) { Transform offset = thisInteractable.CreateOffset(interactor); switch (thisInteractable.followType) { case FollowType.Transform: if (!thisInteractable.preciseRotate) { return(new GrabFollowTransformAction(thisInteractable, interactor, offset)); } else { return(new GrabFollowTransformPosDifRotAction(thisInteractable, interactor, offset)); } case FollowType.Rigidbody: if (!thisInteractable.preciseRotate) { return(new GrabFollowVelocityAction(thisInteractable, interactor, offset)); } else { return(new GrabFollowRigidbodyForceAtPointAction(thisInteractable, interactor, offset)); } case FollowType.Joint: return(new GrabFollowJointAction(thisInteractable, interactor, offset)); } return(null); }
public void UnGrab(InteractorRaw interactor) => interactor.UnGrab(this);
public void Grab(InteractorRaw interactor) => interactor.Grab(this);