using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.XR.Interaction.Toolkit; public class LeverController : MonoBehaviour { private Transform pivot; //The lever will use a pivot point private Transform grabHand; // ONLY ONE HAND WORKS RIGHT NOW. NEED A SOLUTION! SET HAND TRANSFORM IN onSelectedEntered() // IN INTERACTION EVENTS UNTIL A BETTER SOLUTION private bool leverGrabbed; private bool eventCalled; private Vector3 handDelta; private Vector3 lastPosition; //These UnityEvent objects can be set in the inspector as any public methods from scripts [SerializeField] private UnityEvent onUp; [SerializeField] private UnityEvent onDown; public float minAngle = 20f; public float maxAngle = 75f; public float hapticAmplitude = 1f; public float hapticDuration = 0.1f; void Awake() { pivot = transform.parent; leverGrabbed = false; pivot.eulerAngles = new Vector3(pivot.eulerAngles.x, pivot.eulerAngles.y, minAngle); } void Update() { if (leverGrabbed) { handDelta = lastPosition - grabHand.position; //The vector of hand movement between frames pivot.RotateAround(pivot.position, pivot.forward, 200 * handDelta.y); //Is a Time.deltaTime multiplication needed here? //Two following if statements set the up and down position angles and call events when angle is met //Only one event is called per grab because the logic is in the update method if(pivot.eulerAngles.z < minAngle) { pivot.eulerAngles = new Vector3(pivot.rotation.x, pivot.rotation.y, minAngle); if (!eventCalled) { onUp.Invoke(); grabHand.gameObject.GetComponent().SendHapticImpulse(hapticAmplitude, hapticDuration); eventCalled = true; } } else if(pivot.eulerAngles.z > maxAngle) { pivot.eulerAngles = new Vector3(pivot.rotation.x, pivot.rotation.y, maxAngle); if (!eventCalled) { onDown.Invoke(); grabHand.gameObject.GetComponent().SendHapticImpulse(hapticAmplitude, hapticDuration); eventCalled = true; } } lastPosition = grabHand.position; } } public void GrabLever(Transform hand) { leverGrabbed = !leverGrabbed; grabHand = hand; handDelta = Vector3.zero; lastPosition = grabHand.position; eventCalled = false; } }