/// <summary> /// When the technique is activated /// </summary> public override void OnActivation(VRIL_ControllerActionEventArgs e) { // only ray hand triggers WIM if (e.ControllerIndex != 1) { return; } if (RegisteredControllers.Count > 1) { // differentiate between ButtonStates if (TravelOnRelease && e.ButtonInteractionType == VRIL_ButtonInteractionType.Released) { OnTravel(e); } else if (e.ButtonInteractionType == VRIL_ButtonInteractionType.Pressed) { if (!IsActivated && !DelayToNextTravel) { TargetPosition = Viewpoint.transform.position - new Vector3(0, DistanceViewpointToGround, 0); Velocity = ViewpointVelocity; CurrentScale = Vector3.one; CurrentScale *= ScaleFactor; CreateWim(); IsActivated = true; StartCoroutine(WIM()); } } } else { Debug.LogError($"<b>{nameof(VRIL_WIM)}:</b>\n This technique requires at least two controllers!"); } }
/// <summary> /// When the technique stops /// </summary> public override void OnStop(VRIL_ControllerActionEventArgs e) { // When a coroutine is stared via a IEnumerator, stopping it without the // same IEnumerator won't work. So this next line is useless without the object // StopCoroutine(ISith()); IsActivated = false; }
/// <summary> /// Called when the interaction technique selected an object /// </summary> /// <param name="e">ControllerActionEventArgs</param> public virtual void OnSelection(VRIL_ControllerActionEventArgs e) { foreach (VRIL_Interactable interactable in SelectableObjects) { if (interactable.Selection_ObjectAttachment == ObjectAttachmentTypes.NotAttached) { interactable.OnSelection(); } else if (interactable.Selection_ObjectAttachment == ObjectAttachmentTypes.AttachedToHand) { interactable.OnSelection(RegisteredControllers[DominantControllerIndex]); } else { interactable.OnSelection(RegisteredControllers[0].transform.position, interactable.transform.rotation); } if (!SelectedObjects.Contains(interactable)) { SelectedObjects.Add(interactable); } } SelectableObjects.Clear(); }
/// <summary> /// Technique selection /// </summary> /// <param name="e">ControllerEvent</param> public override void OnSelection(VRIL_ControllerActionEventArgs e) { if (!manipulationModeActivated) { base.OnSelection(e); } }
protected IEnumerator GrabTheAir(VRIL_ControllerActionEventArgs e) { PrevPosition = RegisteredControllers[0].transform.position; while (IsActivated) { Vector3 newDiff = (RegisteredControllers[0].transform.position - PrevPosition) * MovementScalor; Vector3 nextPosition = Vector3.zero; if (EnableNavigationX) { nextPosition.x = newDiff.x; } if (EnableNavigationY) { nextPosition.y = newDiff.y; } if (EnableNavigationZ) { nextPosition.z = newDiff.z; } SaveDistancesToViewpoint(); World.transform.position += nextPosition; PrevPosition = RegisteredControllers[0].transform.position; TransferSelectedObjects(); yield return(null); } StopAudio(); }
/// <summary> /// Called when the interaction technique should interact with the selected objects /// </summary> /// <param name="e">ControllerActionEventArgs</param> public virtual void OnInteraction(VRIL_ControllerActionEventArgs e) { foreach (VRIL_Interactable interactable in SelectableObjects) { bool pressed = (e.ButtonInteractionType == VRIL_ButtonInteractionType.Pressed) ? true : false; interactable.OnInteraction(pressed); } }
/// <summary> /// When the technique is activated /// </summary> public override void OnActivation(VRIL_ControllerActionEventArgs e) { if (!IsActivated) { IsActivated = true; StartCoroutine(ISith()); } }
/// <summary> /// Select objects only if a button is pressed /// </summary> /// <param name="e"></param> public override void OnSelection(VRIL_ControllerActionEventArgs e) { // differentiate between ButtonStates if (e.ButtonInteractionType == VRIL_ButtonInteractionType.Released) { base.OnRelease(e); } else if (e.ButtonInteractionType == VRIL_ButtonInteractionType.Pressed) { base.OnSelection(e); } }
/// <summary> /// Called when the interaction technique should release an object /// </summary> /// <param name="e">ControllerActionEventArgs</param> public virtual void OnRelease(VRIL_ControllerActionEventArgs e) { foreach (VRIL_Interactable interactable in SelectableObjects) { interactable.OnRelease(interactable.transform.position); } foreach (VRIL_Interactable interactable in SelectedObjects) { interactable.OnRelease(interactable.transform.position); } SelectableObjects.Clear(); SelectedObjects.Clear(); }
/// <summary> /// Activate the technique which starts the coroutine. If no controllers are active, an error will be shown. /// </summary> /// <param name="e">ControllerEvent</param> public override void OnActivation(VRIL_ControllerActionEventArgs e) { if (this.RegisteredControllers.Count > 1) { if (!IsActivated) { IsActivated = true; StartCoroutine(ShowRay()); } } else { Debug.LogError($"<b>{nameof(VRIL_DepthRay)}:</b>\n requires at least two controllers!"); } }
/// <summary> /// Technique is activated /// </summary> /// <param name="e"></param> public override void OnActivation(VRIL_ControllerActionEventArgs e) { if (RegisteredControllers.Count > 0) { if (!IsActivated) { IsActivated = true; StartCoroutine(ShowRay()); } } else { Debug.LogError($"<b>{nameof(VRIL_SingleRayCast)}:</b>\n No controller registered"); } }
/// <summary> /// Technique activation /// </summary> /// <param name="e">ControllerEvent</param> public override void OnActivation(VRIL_ControllerActionEventArgs e) { if (this.RegisteredControllers.Count > 1) { if (!selectionModeActivated && !manipulationModeActivated) { LineRenderer.enabled = true; selectionModeActivated = true; StartCoroutine(SpindleAndWheelSelection()); } } else { Debug.LogError($"<b>{nameof(VRIL_SpindleAndWheel)}:</b>\n This technique requires at least two controllers!"); } }
/// <summary> /// Technique interaction /// </summary> /// <param name="e">ControllerEvent</param> public override void OnInteraction(VRIL_ControllerActionEventArgs e) { if (this.RegisteredControllers.Count > 1) { if (SelectedObjects.Count >= 1 && !manipulationModeActivated) { base.OnInteraction(e); selectionModeActivated = false; manipulationModeActivated = true; StartCoroutine(SpindleAndWheelManpulation()); } } else { Debug.LogError($"<b>{nameof(VRIL_SpindleAndWheel)}:</b>\n This technique requires at least two controllers!"); } }
/// <summary> /// Technique is activated /// </summary> /// <param name="e"></param> public override void OnActivation(VRIL_ControllerActionEventArgs e) { if (RegisteredControllers.Count > 0) { if (!TravelDisablesTechnique) { if (e.ButtonInteractionType == VRIL_ButtonInteractionType.Pressed) { if (IsActivated) { IsActivated = false; PositionSelected = false; if (HitEntity != null) { HitEntity.SetActive(false); } } else { IsActivated = true; StartCoroutine(SelectPosition(e)); } } } else { // differentiate between ButtonStates if (TravelOnRelease && e.ButtonInteractionType == VRIL_ButtonInteractionType.Released) { OnTravel(e); } else if (e.ButtonInteractionType == VRIL_ButtonInteractionType.Pressed) { if (!IsActivated) { IsActivated = true; StartCoroutine(SelectPosition(e)); } } } } else { Debug.LogError($"<b>{nameof(VRIL_BlinkTeleport)}:</b>\n No controller registered"); } }
/// <summary> /// Notify manager with action event /// </summary> /// <param name="fromSource">Source input from SteamVR</param> /// <param name="vRIL_ButtonType">Specified VRIL ButtonType in Inspector</param> /// <param name="vRIL_ButtonInteractionType">Specified VRIL InteractionType in Inspector</param> public void NotifyControllerActionEvent(SteamVR_Input_Sources fromSource, VRIL_ButtonType vRIL_ButtonType, VRIL_ButtonInteractionType vRIL_ButtonInteractionType) { VRIL_ControllerActionEventArgs v = new VRIL_ControllerActionEventArgs { ButtonType = vRIL_ButtonType, ButtonInteractionType = vRIL_ButtonInteractionType }; if (fromSource == SteamVR_Input_Sources.LeftHand) { v.ControllerIndex = 0; } else if (fromSource == SteamVR_Input_Sources.RightHand) { v.ControllerIndex = 1; } manager.OnControllerAction(v); }
public override void OnTravel(VRIL_ControllerActionEventArgs e) { // if a valid position is selected, travel is triggered if (PositionSelected && !DelayToNextTravel) { // allow no other input while travelling to target position Manager.InputLocked = true; TravelMode = true; SaveDistancesToViewpoint(); PlayAudio(); StartCoroutine(DashMovement()); DelayToNextTravel = true; } if (HitEntity) { HitEntity.SetActive(false); } IsActivated = false; }
//[HideInInspector] public bool InputLocked = false; /// <summary> /// Should be called when a Controller input happened (Button pressed for example) /// <para>Notifies all registered techniques for a specific controller</para> /// </summary> /// <param name="e">VRIL_ControllerActionEventArgs</param> /// <see cref="VRIL_ControllerActionEventArgs"/> public void OnControllerAction(VRIL_ControllerActionEventArgs e) { if (InputLocked) { return; } if (e == null) { Debug.LogWarning( $"<b>{nameof(VRIL_Manager)}:</b>\n {nameof(VRIL_ControllerActionEventArgs)} was null at {nameof(OnControllerAction)}"); return; } if (e.ControllerIndex > RegisteredControllers.Count - 1) { Debug.LogWarning( $"<b>{nameof(VRIL_Manager)}:</b>\n {nameof(VRIL_ControllerActionEventArgs)} ControllerIndex was greater than registered controller number at {nameof(OnControllerAction)}"); return; } foreach (VRIL_InteractionTechniqueBase technique in RegisteredControllers[e.ControllerIndex] .InteractionTechniques) { if (technique != null) { technique.ControllerAction(this, e); } } foreach (VRIL_NavigationTechniqueBase technique in RegisteredControllers[e.ControllerIndex] .NavigationTechniques) { if (technique != null) { technique.ControllerAction(this, e); } } }
public override void OnActivation(VRIL_ControllerActionEventArgs e) { if (RegisteredControllers.Count > 0) { // differentiate between ButtonStates if (e.ButtonInteractionType == VRIL_ButtonInteractionType.Released) { IsActivated = false; } else if (e.ButtonInteractionType == VRIL_ButtonInteractionType.Pressed) { if (!IsActivated) { OnTravel(e); } } } else { Debug.LogError($"<b>{nameof(VRIL_GrabTheAir)}:</b>\n No controller registered"); } }
/// <summary> /// Called from <see cref="VRIL_Manager"/> when a button is pressed /// </summary> /// <param name="sender">sending class</param> /// <param name="e">EventArgs that contains the controller, buttonType, buttonInteractionType</param> /// <see cref="VRIL_Manager"/> /// <seealso cref="VRIL_ControllerActionEventArgs"/> public override void ControllerAction(object sender, VRIL_ControllerActionEventArgs e) { bool actionDone = false; foreach (VRIL_ActionMapping mapping in Mappings) { if (mapping.ButtonType == e.ButtonType) { switch (mapping.ActionType) { case VRIL_ActionTypes.None: actionDone = true; break; case VRIL_ActionTypes.OnActivation: // invoked once if (!actionDone) { actionDone = true; OnActivation(e); } break; case VRIL_ActionTypes.OnTravel: // invoked once if (!actionDone) { actionDone = true; OnTravel(e); } break; case VRIL_ActionTypes.CustomScript: mapping.Script.OnCall(); break; } } } }
/// <summary> /// Called when the travel should be performed /// </summary> /// <param name="e">ControllerActionEventArgs</param> public override void OnTravel(VRIL_ControllerActionEventArgs e) { if (IsActivated && !DelayToNextTravel) { // if a valid position is selected, travel is triggered if (PositionSelected) { PlayAudio(); SaveDistancesToViewpoint(); Viewpoint.transform.position = TargetPosition; TransferSelectedObjects(); PositionSelected = false; Timer = 0.0f; DelayToNextTravel = true; // blink scene away immediately if (SceneBlinksAway) { SteamVR_Fade.View(SceneOffColor, 0); SceneOff = true; } } if (HitEntity != null) { HitEntity.SetActive(false); } IsActivated = false; // in case travel does not disabled technique, selection mode is actived again if (!TravelDisablesTechnique) { IsActivated = true; StartCoroutine(SelectPosition(e)); } } }
/// <summary> /// Called from <see cref="VRIL_Manager"/> when a button is pressed /// </summary> /// <param name="sender">sending class</param> /// <param name="e">EventArgs that contains the controller, buttonType, buttonInteractionType</param> /// <see cref="VRIL_Manager"/> /// <seealso cref="VRIL_ControllerActionEventArgs"/> public override void ControllerAction(object sender, VRIL_ControllerActionEventArgs e) { foreach (VRIL_ActionMapping mapping in Mappings) { if (mapping.ButtonType == e.ButtonType) { switch (mapping.ActionType) { case VRIL_ActionTypes.None: break; case VRIL_ActionTypes.OnSelection: OnSelection(e); break; case VRIL_ActionTypes.OnActivation: OnActivation(e); break; case VRIL_ActionTypes.OnInteraction: OnInteraction(e); break; case VRIL_ActionTypes.OnRelease: OnRelease(e); break; case VRIL_ActionTypes.OnStop: OnStop(e); break; case VRIL_ActionTypes.CustomScript: mapping.Script.OnCall(); break; } } } }
void Update() { if (LeftHand != null && RightHand != null) { if (Input.GetKeyDown(KeyCode.Alpha1)) { selectedController = Controller.LeftController; UIText.text = "Selected Controller: LeftController"; } if (Input.GetKeyDown(KeyCode.Alpha2)) { selectedController = Controller.RightController; UIText.text = "Selected Controller: RightController"; } if (Input.GetKeyDown(KeyCode.Alpha3)) { selectedController = Controller.AdditionalController; UIText.text = "Selected Controller: 3rd Controller"; } if (Input.GetMouseButtonDown(0)) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(0, VRIL.Base.VRIL_ButtonType.Button1, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager?.OnControllerAction(e); } if (Input.GetMouseButtonUp(0)) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(0, VRIL.Base.VRIL_ButtonType.Button1, VRIL.Base.VRIL_ButtonInteractionType.Released); Manager?.OnControllerAction(e); } if (Input.GetMouseButtonDown(1)) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(2, VRIL.Base.VRIL_ButtonType.Button1, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager?.OnControllerAction(e); } if (Input.GetMouseButtonUp(1)) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(2, VRIL.Base.VRIL_ButtonType.Button1, VRIL.Base.VRIL_ButtonInteractionType.Released); Manager?.OnControllerAction(e); } if (Input.GetKeyDown(KeyCode.R)) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(1, VRIL.Base.VRIL_ButtonType.Touchpad, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager?.OnControllerAction(e); } if (Input.GetKeyDown(KeyCode.F) && pressedF == false) { if (selectedController == Controller.LeftController) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(0, VRIL.Base.VRIL_ButtonType.Trigger, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager?.OnControllerAction(e); } else if (selectedController == Controller.RightController) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(1, VRIL.Base.VRIL_ButtonType.Trigger, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager?.OnControllerAction(e); } else { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(2, VRIL.Base.VRIL_ButtonType.Trigger, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager?.OnControllerAction(e); } pressedF = true; } if (Input.GetKeyUp(KeyCode.F) && pressedF) { if (selectedController == Controller.LeftController) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(0, VRIL.Base.VRIL_ButtonType.Trigger, VRIL.Base.VRIL_ButtonInteractionType.Released); Manager?.OnControllerAction(e); } else if (selectedController == Controller.RightController) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(1, VRIL.Base.VRIL_ButtonType.Trigger, VRIL.Base.VRIL_ButtonInteractionType.Released); Manager?.OnControllerAction(e); } else { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(2, VRIL.Base.VRIL_ButtonType.Trigger, VRIL.Base.VRIL_ButtonInteractionType.Released); Manager?.OnControllerAction(e); } pressedF = false; } // stop all if (Input.GetKey(KeyCode.Space)) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(0, VRIL.Base.VRIL_ButtonType.Button2, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager?.OnControllerAction(e); VRIL_ControllerActionEventArgs e2 = new VRIL_ControllerActionEventArgs(2, VRIL.Base.VRIL_ButtonType.Button2, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager?.OnControllerAction(e2); } // rotation if (Input.GetKey(KeyCode.Q)) { if (selectedController == Controller.LeftController) { LeftHand.transform.Rotate(0, -RotationFactor, 0); } else if (selectedController == Controller.RightController) { RightHand.transform.Rotate(0, -RotationFactor, 0); } else { AdditionalHand.transform.Rotate(0, -RotationFactor, 0); } } if (Input.GetKey(KeyCode.E)) { if (selectedController == Controller.LeftController) { LeftHand.transform.Rotate(0, RotationFactor, 0); } else if (selectedController == Controller.RightController) { RightHand.transform.Rotate(0, RotationFactor, 0); } else { AdditionalHand.transform.Rotate(0, RotationFactor, 0); } } // up down if (Input.GetKey(KeyCode.W)) { if (selectedController == Controller.LeftController) { LeftHand.transform.localPosition = new Vector3(LeftHand.transform.position.x, LeftHand.transform.position.y + MoveFactor, LeftHand.transform.position.z); } else if (selectedController == Controller.RightController) { RightHand.transform.localPosition = new Vector3(RightHand.transform.position.x, RightHand.transform.position.y + MoveFactor, RightHand.transform.position.z); } else { AdditionalHand.transform.localPosition = new Vector3(AdditionalHand.transform.position.x, AdditionalHand.transform.position.y + MoveFactor, AdditionalHand.transform.position.z); } } if (Input.GetKey(KeyCode.S)) { if (selectedController == Controller.LeftController) { LeftHand.transform.localPosition = new Vector3(LeftHand.transform.position.x, LeftHand.transform.position.y - MoveFactor, LeftHand.transform.position.z); } else if (selectedController == Controller.RightController) { RightHand.transform.localPosition = new Vector3(RightHand.transform.position.x, RightHand.transform.position.y - MoveFactor, RightHand.transform.position.z); } else { AdditionalHand.transform.localPosition = new Vector3(AdditionalHand.transform.position.x, AdditionalHand.transform.position.y - MoveFactor, AdditionalHand.transform.position.z); } } } }
void Update() { if (LeftHand != null && RightHand != null && Manager != null && Viewpoint != null) { if (Input.GetKeyDown(KeyCode.Alpha1)) { SelectedController = Controller.LeftController; UIText.text = "Selected Controller: LeftController"; } if (Input.GetKeyDown(KeyCode.Alpha2)) { SelectedController = Controller.RightController; UIText.text = "Selected Controller: RightController"; } if (Input.GetMouseButtonDown(0)) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(ControllerNumberMapping[SelectedController], VRIL.Base.VRIL_ButtonType.Button1, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager.OnControllerAction(e); } if (Input.GetMouseButtonUp(0)) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(ControllerNumberMapping[SelectedController], VRIL.Base.VRIL_ButtonType.Button1, VRIL.Base.VRIL_ButtonInteractionType.Released); Manager.OnControllerAction(e); } if (Input.GetMouseButtonDown(1)) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(ControllerNumberMapping[SelectedController], VRIL.Base.VRIL_ButtonType.Button1, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager.OnControllerAction(e); } if (Input.GetMouseButtonUp(1)) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(ControllerNumberMapping[SelectedController], VRIL.Base.VRIL_ButtonType.Button1, VRIL.Base.VRIL_ButtonInteractionType.Released); Manager.OnControllerAction(e); } if (Input.GetKeyDown(KeyCode.R)) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(ControllerNumberMapping[SelectedController], VRIL.Base.VRIL_ButtonType.Touchpad, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager.OnControllerAction(e); } if (Input.GetKeyDown(KeyCode.F) && pressedF == false) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(ControllerNumberMapping[SelectedController], VRIL.Base.VRIL_ButtonType.Trigger, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager.OnControllerAction(e); pressedF = true; } if (Input.GetKeyUp(KeyCode.F) && pressedF) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(ControllerNumberMapping[SelectedController], VRIL.Base.VRIL_ButtonType.Trigger, VRIL.Base.VRIL_ButtonInteractionType.Released); Manager.OnControllerAction(e); pressedF = false; } // stop all if (Input.GetKey(KeyCode.Space)) { VRIL_ControllerActionEventArgs e = new VRIL_ControllerActionEventArgs(0, VRIL.Base.VRIL_ButtonType.Button2, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager.OnControllerAction(e); VRIL_ControllerActionEventArgs e2 = new VRIL_ControllerActionEventArgs(2, VRIL.Base.VRIL_ButtonType.Button2, VRIL.Base.VRIL_ButtonInteractionType.Pressed); Manager.OnControllerAction(e2); } // rotation if (Input.GetKey(KeyCode.Q)) { Viewpoint.transform.Rotate(0, -RotationFactor, 0); } if (Input.GetKey(KeyCode.E)) { Viewpoint.transform.Rotate(0, RotationFactor, 0); } if (Input.GetKey(KeyCode.W)) { if (SelectedController == Controller.LeftController) { LeftHand.transform.position = new Vector3(LeftHand.transform.position.x, LeftHand.transform.position.y + MoveFactor, LeftHand.transform.position.z); } else if (SelectedController == Controller.RightController) { RightHand.transform.position = new Vector3(RightHand.transform.position.x, RightHand.transform.position.y + MoveFactor, RightHand.transform.position.z); } } if (Input.GetKey(KeyCode.S)) { if (SelectedController == Controller.LeftController) { LeftHand.transform.position = new Vector3(LeftHand.transform.position.x, LeftHand.transform.position.y - MoveFactor, LeftHand.transform.position.z); } else if (SelectedController == Controller.RightController) { RightHand.transform.position = new Vector3(RightHand.transform.position.x, RightHand.transform.position.y - MoveFactor, RightHand.transform.position.z); } } if (Input.GetKey(KeyCode.Y)) { if (SelectedController == Controller.LeftController) { LeftHand.transform.Rotate(-RotationFactor, 0, 0); } else if (SelectedController == Controller.RightController) { RightHand.transform.Rotate(-RotationFactor, 0, 0); } } if (Input.GetKey(KeyCode.X)) { if (SelectedController == Controller.LeftController) { LeftHand.transform.Rotate(RotationFactor, 0, 0); } else if (SelectedController == Controller.RightController) { RightHand.transform.Rotate(RotationFactor, 0, 0); } } if (Input.GetKey(KeyCode.A)) { if (SelectedController == Controller.LeftController) { LeftHand.transform.Rotate(0, -RotationFactor, 0); } else if (SelectedController == Controller.RightController) { RightHand.transform.Rotate(0, -RotationFactor, 0); } } if (Input.GetKey(KeyCode.D)) { if (SelectedController == Controller.LeftController) { LeftHand.transform.Rotate(0, RotationFactor, 0); } else if (SelectedController == Controller.RightController) { RightHand.transform.Rotate(0, RotationFactor, 0); } } } else { Debug.LogWarning("Controller, Manager or Viewpoint not set! No action is performed."); } }
/// <summary> /// Called when the travel should be performed /// </summary> /// <param name="e">ControllerActionEventArgs</param> public abstract void OnTravel(VRIL_ControllerActionEventArgs e);
public override void OnTravel(VRIL_ControllerActionEventArgs e) { PlayAudio(); IsActivated = true; StartCoroutine(GrabTheAir(e)); }
/// <summary> /// Called when the technique is activated /// </summary> /// <param name="e">ControllerActionEventArgs</param> public abstract void OnActivation(VRIL_ControllerActionEventArgs e);
/// <summary> /// Technique stop /// </summary> /// <param name="e">ControllerEvent</param> public override void OnStop(VRIL_ControllerActionEventArgs e) { selectionModeActivated = false; manipulationModeActivated = false; LineRenderer.enabled = false; }
/// <summary> /// Stop interaction technique and coroutine /// </summary> /// <param name="e"></param> public override void OnStop(VRIL_ControllerActionEventArgs e) { IsActivated = false; }
/// <summary> /// Coroutine for vizualization of the target selection /// It is "virtual" to allow custom ray implementation in future (such as curved trajectories or just a straight line) /// </summary> /// <returns>WaitForSeconds()</returns> protected virtual IEnumerator SelectPosition(VRIL_ControllerActionEventArgs e) { TeleportLineRenderer.enabled = true; while (IsActivated) { // disable hit entity to avoid ray cast blocking if (HitEntity != null) { HitEntity.SetActive(false); } TeleportLineRenderer.startColor = InvalidPositionColor; TeleportLineRenderer.endColor = InvalidPositionColor; // first point of curve is at controller Vector3 p0 = RegisteredControllers[0].transform.position; List <Vector3> positions = new List <Vector3>() { p0 }; // save last point Vector3 lastPoint = p0; bool hit = false; Vector3 InitialVelocity = RegisteredControllers[0].transform.forward * CurveVelocity; Vector3 velocity = transform.TransformDirection(InitialVelocity); float t = 0; // calculate all points for (int i = 1; i <= NumberOfRayFragments && !hit; i++) { t += 0.3f / ParabolicCurveDeriv(velocity, Physics.gravity, t).magnitude; Vector3 curPoint = GetTrajectoryVector(p0, velocity, Physics.gravity, t); Vector3 diff = curPoint - lastPoint; Ray ray = new Ray(lastPoint, diff.normalized); // check next trajectory part for object collision if (Physics.Raycast(ray, out RaycastHit raycastHit, diff.magnitude)) { VRIL_Navigable navigableObject = raycastHit.transform.gameObject.GetComponent <VRIL_Navigable>(); // valid position in case it is navigable and angle is allowed if (navigableObject && Vector3.Angle(raycastHit.normal, Vector3.up) <= MaximumSurfaceAngle) { TargetPosition = raycastHit.point; PositionSelected = true; if (HitEntity != null) { HitEntity.transform.position = TargetPosition + new Vector3(0f, DistanceHitEntityToGround, 0f); HitEntity.SetActive(true); HitEntity.transform.up = raycastHit.normal; } TargetPosition += new Vector3(0, DistanceViewpointToGround, 0); TeleportLineRenderer.startColor = ValidPositionColor; TeleportLineRenderer.endColor = ValidPositionColor; } else { PositionSelected = false; } positions.Add(raycastHit.point); hit = true; }
/// <summary> /// Called when the interaction technique should stop /// </summary> /// <param name="e">ControllerActionEventArgs</param> public abstract void OnStop(VRIL_ControllerActionEventArgs e);