AR Portal Closer
VR Portal Interaction
Nav Rota Canvas not showing
using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; [AddComponentMenu("Radial Menu Framework/RMF Core Script")] public class RMF_RadialMenu : MonoBehaviour { [HideInInspector] public RectTransform rt; //public RectTransform baseCircleRT; //public Image selectionFollowerImage; [Tooltip("Adjusts the radial menu for use with a gamepad or joystick. You might need to edit this script if you're not using the default horizontal and vertical input axes.")] public bool useGamepad = false; [Tooltip("With lazy selection, you only have to point your mouse (or joystick) in the direction of an element to select it, rather than be moused over the element entirely.")] public bool useLazySelection = true; [Tooltip("If set to true, a pointer with a graphic of your choosing will aim in the direction of your mouse. You will need to specify the container for the selection follower.")] public bool useSelectionFollower = true; [Tooltip("If using the selection follower, this must point to the rect transform of the selection follower's container.")] public RectTransform selectionFollowerContainer; [Tooltip("This is the text object that will display the labels of the radial elements when they are being hovered over. If you don't want a label, leave this blank.")] public Text textLabel; [Tooltip("This is the list of radial menu elements. This is order-dependent. The first element in the list will be the first element created, and so on.")] public List<RMF_RadialMenuElement> elements = new List<RMF_RadialMenuElement>(); [Tooltip("Controls the total angle offset for all elements. For example, if set to 45, all elements will be shifted +45 degrees. Good values are generally 45, 90, or 180")] public float globalOffset = 0f; [HideInInspector] public float currentAngle = 0f; //Our current angle from the center of the radial menu. [HideInInspector] public int index = 0; //The current index of the element we're pointing at. private int elementCount; private float angleOffset; //The base offset. For example, if there are 4 elements, then our offset is 360/4 = 90 private int previousActiveIndex = 0; //Used to determine which buttons to unhighlight in lazy selection. private PointerEventData pointer; private OVRGazePointer gazePointer; public Vector3 vRotCenter_to_GazePointer; public float xComp; public float yComp; public int idxSelected = 0; CanvasGroup CG; void Awake() { gazePointer = GameObject.Find("GazePointerRing").GetComponent<OVRGazePointer>(); pointer = new PointerEventData(EventSystem.current); rt = GetComponent<RectTransform>(); if (rt == null) Debug.LogError("Radial Menu: Rect Transform for radial menu " + gameObject.name + " could not be found. Please ensure this is an object parented to a canvas."); if (useSelectionFollower && selectionFollowerContainer == null) Debug.LogError("Radial Menu: Selection follower container is unassigned on " + gameObject.name + ", which has the selection follower enabled."); elementCount = elements.Count; angleOffset = (360f / (float)elementCount); //Loop through and set up the elements. for (int i = 0; i < elementCount; i++) { if (elements[i] == null) { Debug.LogError("Radial Menu: element " + i.ToString() + " in the radial menu " + gameObject.name + " is null!"); continue; } elements[i].parentRM = this; elements[i].setAllAngles((angleOffset * i) + globalOffset, angleOffset); elements[i].assignedIndex = i; } } void Start() { CG = GetComponent<CanvasGroup>(); if (useGamepad) { EventSystem.current.SetSelectedGameObject(gameObject, null); //We'll make this the active object when we start it. Comment this line to set it manually from another script. if (useSelectionFollower && selectionFollowerContainer != null) selectionFollowerContainer.localRotation = Quaternion.Euler(0, 0, -globalOffset); //Point the selection follower at the first element. } } public void onNavSelect() { if (CG.alpha > 0.0f) idxSelected = index; } // Update is called once per frame void Update() { //If your gamepad uses different horizontal and vertical joystick inputs, change them here! //============================================================================================== bool joystickMoved = Input.GetAxis("Horizontal") != 0.0 || Input.GetAxis("Vertical") != 0.0; //============================================================================================== vRotCenter_to_GazePointer = gazePointer.gameObject.transform.position - transform.position; xComp = Vector3.Dot(vRotCenter_to_GazePointer, transform.right); yComp = Vector3.Dot(vRotCenter_to_GazePointer, transform.up); float rawAngle; //if (!useGamepad) // rawAngle = Mathf.Atan2(Input.mousePosition.y - rt.position.y, Input.mousePosition.x - rt.position.x) * Mathf.Rad2Deg; //else rawAngle = Mathf.Atan2(yComp, xComp) * Mathf.Rad2Deg; //If no gamepad, update the angle always. Otherwise, only update it if we've moved the joystick. //if (!useGamepad) // currentAngle = normalizeAngle(-rawAngle + 90 - globalOffset + (angleOffset / 2f)); //else if (joystickMoved) currentAngle = normalizeAngle(-rawAngle + 90 - globalOffset + (angleOffset / 2f)); //Handles lazy selection. Checks the current angle, matches it to the index of an element, and then highlights that element. if (angleOffset != 0 && useLazySelection) { //Current element index we're pointing at. index = (int)(currentAngle / angleOffset); if (elements[index] != null) { //Select it. selectButton(index); //If we click or press a "submit" button (Button on joystick, enter, or spacebar), then we'll execut the OnClick() function for the button. if (Input.GetMouseButtonDown(0) || Input.GetButtonDown("Submit")) { ExecuteEvents.Execute(elements[index].button.gameObject, pointer, ExecuteEvents.submitHandler); } } } if(idxSelected != -1) elements[idxSelected].highlightThisElement(pointer); //Select this one //Updates the selection follower if we're using one. if (useSelectionFollower && selectionFollowerContainer != null) { if (!useGamepad || joystickMoved) selectionFollowerContainer.localRotation = Quaternion.Euler(0, 0, rawAngle + 270); } } //Selects the button with the specified index. private void selectButton(int sel) { //if (elements[sel].active == false)//active means selected //{ for (int i = 0; i < elementCount; i++) { elements[i].unHighlightThisElement(pointer); //Deselect the last one. } elements[sel].highlightThisElement(pointer); //Select this one previousActiveIndex = sel; } //} //Keeps angles between 0 and 360. private float normalizeAngle(float angle) { angle = angle % 360f; if (angle < 0) angle += 360; return angle; } }