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); }
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); }