public static void DrawComponent(Rect rect, WindowComponent component, int customKey) { var key = UnityEngine.UI.Windows.Utilities.UIWSMath.GetKey(component.GetHashCode(), customKey); if (Event.current.type == EventType.MouseUp || Event.current.type == EventType.MouseDown || Event.current.type == EventType.MouseMove) { if (WindowLayoutUtilities.tempPreviewTimers.ContainsKey(key) == true) { WindowLayoutUtilities.tempPreviewTimers[key] = 0d; } } if (Event.current.type == EventType.Repaint) { if (WindowLayoutUtilities.tempPreviewTimers.TryGetValue(key, out var timer) == true) { if (EditorApplication.timeSinceStartup - timer > 100d) { if (WindowLayoutUtilities.tempPreviewRects.TryGetValue(key, out var bufferRect) == true) { if (Mathf.Abs(rect.width - bufferRect.width) > 1f || Mathf.Abs(rect.height - bufferRect.height) > 1f) { WindowLayoutUtilities.tempPreviewRects.Remove(key); if (WindowLayoutUtilities.tempPreviewBuffer.TryGetValue(key, out var t) == true) { Object.DestroyImmediate(t); } WindowLayoutUtilities.tempPreviewBuffer.Remove(key); WindowLayoutUtilities.tempPreviewTimers.Remove(key); } } } } } if (WindowLayoutUtilities.tempPreviewBuffer.TryGetValue(key, out var buffer) == true) { EditorGUI.DrawTextureTransparent(rect, buffer, ScaleMode.ScaleToFit); } else if (Event.current.type == EventType.Repaint) { var camera = new GameObject("Camera", typeof(Camera)); camera.hideFlags = HideFlags.HideAndDontSave; var cameraInstance = camera.GetComponent <Camera>(); var canvas = new GameObject("Canvas", typeof(Canvas), typeof(UnityEngine.UI.CanvasScaler)); canvas.hideFlags = HideFlags.HideAndDontSave; var instance = Object.Instantiate(component, canvas.transform); instance.gameObject.hideFlags = HideFlags.HideAndDontSave; instance.SetTransformAs(component.transform as RectTransform); var canvasInstance = canvas.GetComponent <Canvas>(); canvasInstance.renderMode = RenderMode.ScreenSpaceCamera; canvasInstance.worldCamera = cameraInstance; cameraInstance.clearFlags = CameraClearFlags.Depth; var canvases = canvas.GetComponentsInChildren <Canvas>(); foreach (var c in canvases) { c.enabled = false; } var canvasScaler = canvas.GetComponent <UnityEngine.UI.CanvasScaler>(); canvasScaler.uiScaleMode = UnityEngine.UI.CanvasScaler.ScaleMode.ScaleWithScreenSize; canvasScaler.referenceResolution = new Vector2(rect.width, 0f); canvasScaler.screenMatchMode = UnityEngine.UI.CanvasScaler.ScreenMatchMode.MatchWidthOrHeight; canvasScaler.matchWidthOrHeight = 0f; var type = canvasScaler.GetType(); var binds = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic; type.GetField("m_Canvas", binds).SetValue(canvasScaler, canvasInstance); type.GetMethod("Handle", binds).Invoke(canvasScaler, null); Canvas.ForceUpdateCanvases(); var rt = new RenderTexture((int)rect.width, (int)rect.height, 32, RenderTextureFormat.ARGB32); WindowLayoutUtilities.tempPreviewBuffer.Add(key, rt); WindowLayoutUtilities.tempPreviewRects.Add(key, rect); WindowLayoutUtilities.tempPreviewTimers.Add(key, EditorApplication.timeSinceStartup); cameraInstance.Render(); EditorApplication.delayCall += () => { foreach (var c in canvases) { c.enabled = true; } cameraInstance.targetTexture = rt; cameraInstance.Render(); cameraInstance.targetTexture = null; foreach (var c in canvases) { c.enabled = false; } EditorApplication.delayCall += () => { GameObject.DestroyImmediate(camera); GameObject.DestroyImmediate(canvas); }; }; } }