Esempio n. 1
0
        protected virtual void SetupCanvas()
        {
            Canvas canvas = GetComponent <Canvas>();

            if (canvas == null || canvas.renderMode != RenderMode.WorldSpace)
            {
                VRTK_Logger.Error(VRTK_Logger.GetCommonMessage(VRTK_Logger.CommonMessageKeys.REQUIRED_COMPONENT_MISSING_FROM_GAMEOBJECT, "VRTK_UICanvas", "Canvas", "the same", " that is set to `Render Mode = World Space`"));
                return;
            }

            RectTransform canvasRectTransform = canvas.GetComponent <RectTransform>();
            Vector2       canvasSize          = canvasRectTransform.rect.size;
            //copy public params then disable existing graphic raycaster
            GraphicRaycaster        defaultRaycaster = canvas.gameObject.GetComponent <GraphicRaycaster>();
            VRTK_UIGraphicRaycaster customRaycaster  = canvas.gameObject.GetComponent <VRTK_UIGraphicRaycaster>();

            //if it doesn't already exist, add the custom raycaster
            if (customRaycaster == null)
            {
                customRaycaster = canvas.gameObject.AddComponent <VRTK_UIGraphicRaycaster>();
            }

            if (defaultRaycaster != null && defaultRaycaster.enabled)
            {
                customRaycaster.ignoreReversedGraphics = defaultRaycaster.ignoreReversedGraphics;
                customRaycaster.blockingObjects        = defaultRaycaster.blockingObjects;

                //Use Reflection to transfer the BlockingMask
                customRaycaster.GetType().GetField("m_BlockingMask", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(customRaycaster, defaultRaycaster.GetType().GetField("m_BlockingMask", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(defaultRaycaster));

                defaultRaycaster.enabled = false;
            }

            //add a box collider and background image to ensure the rays always hit
            if (canvas.gameObject.GetComponent <BoxCollider>() == null)
            {
                Vector2 pivot  = canvasRectTransform.pivot;
                float   zSize  = 0.1f;
                float   zScale = zSize / canvasRectTransform.localScale.z;

                canvasBoxCollider           = canvas.gameObject.AddComponent <BoxCollider>();
                canvasBoxCollider.size      = new Vector3(canvasSize.x, canvasSize.y, zScale);
                canvasBoxCollider.center    = new Vector3(canvasSize.x / 2 - canvasSize.x * pivot.x, canvasSize.y / 2 - canvasSize.y * pivot.y, zScale / 2f);
                canvasBoxCollider.isTrigger = true;
            }

            if (canvas.gameObject.GetComponent <Rigidbody>() == null)
            {
                canvasRigidBody             = canvas.gameObject.AddComponent <Rigidbody>();
                canvasRigidBody.isKinematic = true;
            }

            if (CREATE_DRAGGABLE_PANEL)
            {
                draggablePanelCreation = StartCoroutine(CreateDraggablePanel(canvas, canvasSize));
            }

            CreateActivator(canvas, canvasSize);
        }
Esempio n. 2
0
        protected virtual void SetupCanvas()
        {
            if (this == null || !isActiveAndEnabled || VRTK4_EventSystem.Instance == null)
            {
                return;
            }

            Canvas canvas = GetComponent <Canvas>();

            if (canvas == null || canvas.renderMode != RenderMode.WorldSpace)
            {
                Debug.LogError(
                    string.Format("{0} REQUIRED_COMPONENT_MISSING_FROM_GAMEOBJECT {1} Make sure {2}",
                                  nameof(VRTK4_UICanvas), gameObject.name, "that Canvas is set to `Render Mode = World Space`"),
                    gameObject);
                return;
            }

            RectTransform canvasRectTransform = canvas.GetComponent <RectTransform>();
            Vector2       canvasSize          = canvasRectTransform.sizeDelta;
            //copy public params then disable existing graphic raycaster
            GraphicRaycaster         defaultRaycaster = canvas.gameObject.GetComponent <GraphicRaycaster>();
            VRTK4_UIGraphicRaycaster customRaycaster  =
                canvas.gameObject.GetComponent <VRTK4_UIGraphicRaycaster>();

            //if it doesn't already exist, add the custom raycaster
            if (customRaycaster == null)
            {
                customRaycaster = canvas.gameObject.AddComponent <VRTK4_UIGraphicRaycaster>();
            }

            if (defaultRaycaster != null && defaultRaycaster.enabled)
            {
                customRaycaster.ignoreReversedGraphics = defaultRaycaster.ignoreReversedGraphics;
                customRaycaster.blockingObjects        = defaultRaycaster.blockingObjects;

                //Use Reflection to transfer the BlockingMask
                customRaycaster.GetType()
                .GetField("m_BlockingMask",
                          BindingFlags.Instance | BindingFlags.NonPublic).SetValue(
                    customRaycaster,
                    defaultRaycaster.GetType()
                    .GetField("m_BlockingMask", BindingFlags.Instance | BindingFlags.NonPublic)
                    .GetValue(defaultRaycaster));

                defaultRaycaster.enabled = false;
            }

            //add a box collider and background image to ensure the rays always hit
            if (canvas.gameObject.GetComponent <BoxCollider>() == null)
            {
                Vector2 pivot  = canvasRectTransform.pivot;
                float   zSize  = 0.1f;
                float   zScale = canvasRectTransform.localScale.z > 0 ? zSize / canvasRectTransform.localScale.z : 1;


                canvasBoxCollider        = canvas.gameObject.AddComponent <BoxCollider>();
                canvasBoxCollider.size   = new Vector3(canvasSize.x, canvasSize.y, zScale);
                canvasBoxCollider.center = new Vector3(canvasSize.x / 2 - canvasSize.x * pivot.x,
                                                       canvasSize.y / 2 - canvasSize.y * pivot.y, zScale / 2f);
                canvasBoxCollider.isTrigger        = true;
                canvasBoxCollider.gameObject.layer = UnityEngine.LayerMask.NameToLayer("UI");
            }

            if (canvas.gameObject.GetComponent <Rigidbody>() == null)
            {
                canvasRigidBody             = canvas.gameObject.AddComponent <Rigidbody>();
                canvasRigidBody.isKinematic = true;
            }

            draggablePanelCreation = StartCoroutine(CreateDraggablePanel(canvas, canvasSize));
            CreateActivator(canvas, canvasSize);
        }