void OnSceneGUI() { PixelPerfectCamera obj = target as PixelPerfectCamera; if (obj == null) { return; } Camera camera = obj.GetComponent <Camera>(); // Show a green rect in scene view that represents the visible area when the pixel perfect correction takes effect in play mode. Vector2 gameViewSize = Handles.GetMainGameViewSize(); int gameViewWidth = (int)gameViewSize.x; int gameViewHeight = (int)gameViewSize.y; int zoom = Math.Max(1, Math.Min(gameViewHeight / obj.refResolutionY, gameViewWidth / obj.refResolutionX)); float verticalOrthoSize; float horizontalOrthoSize; if (obj.cropFrame == PixelPerfectCamera.CropFrame.StretchFill || obj.cropFrame == PixelPerfectCamera.CropFrame.Windowbox) { verticalOrthoSize = obj.refResolutionY * 0.5f / obj.assetsPPU; horizontalOrthoSize = verticalOrthoSize * ((float)obj.refResolutionX / obj.refResolutionY); } else if (obj.cropFrame == PixelPerfectCamera.CropFrame.Letterbox) { verticalOrthoSize = obj.refResolutionY * 0.5f / obj.assetsPPU; horizontalOrthoSize = verticalOrthoSize * ((float)gameViewWidth / (zoom * obj.refResolutionY)); } else if (obj.cropFrame == PixelPerfectCamera.CropFrame.Pillarbox) { horizontalOrthoSize = obj.refResolutionX * 0.5f / obj.assetsPPU; verticalOrthoSize = horizontalOrthoSize / (zoom * obj.refResolutionX / (float)gameViewHeight); } else { verticalOrthoSize = gameViewHeight * 0.5f / (zoom * obj.assetsPPU); horizontalOrthoSize = verticalOrthoSize * camera.aspect; } Handles.color = Color.green; Vector3 cameraPosition = camera.transform.position; Vector3 p1 = cameraPosition + new Vector3(-horizontalOrthoSize, verticalOrthoSize, 0.0f); Vector3 p2 = cameraPosition + new Vector3(horizontalOrthoSize, verticalOrthoSize, 0.0f); Handles.DrawLine(p1, p2); p1 = cameraPosition + new Vector3(horizontalOrthoSize, -verticalOrthoSize, 0.0f); Handles.DrawLine(p2, p1); p2 = cameraPosition + new Vector3(-horizontalOrthoSize, -verticalOrthoSize, 0.0f); Handles.DrawLine(p1, p2); p1 = cameraPosition + new Vector3(-horizontalOrthoSize, verticalOrthoSize, 0.0f); Handles.DrawLine(p2, p1); // Show a green dotted rect in scene view that represents the area defined by the reference resolution. horizontalOrthoSize = obj.refResolutionX * 0.5f / obj.assetsPPU; verticalOrthoSize = obj.refResolutionY * 0.5f / obj.assetsPPU; p1 = cameraPosition + new Vector3(-horizontalOrthoSize, verticalOrthoSize, 0.0f); p2 = cameraPosition + new Vector3(horizontalOrthoSize, verticalOrthoSize, 0.0f); Handles.DrawDottedLine(p1, p2, k_DottedLineSpacing); p1 = cameraPosition + new Vector3(horizontalOrthoSize, -verticalOrthoSize, 0.0f); Handles.DrawDottedLine(p2, p1, k_DottedLineSpacing); p2 = cameraPosition + new Vector3(-horizontalOrthoSize, -verticalOrthoSize, 0.0f); Handles.DrawDottedLine(p1, p2, k_DottedLineSpacing); p1 = cameraPosition + new Vector3(-horizontalOrthoSize, verticalOrthoSize, 0.0f); Handles.DrawDottedLine(p2, p1, k_DottedLineSpacing); }
public override void OnInspectorGUI() { LazyInit(); if (UnityEngine.Rendering.GraphicsSettings.renderPipelineAsset != null) { EditorGUILayout.HelpBox(m_Style.srpWarning, MessageType.Warning); } float originalLabelWidth = EditorGUIUtility.labelWidth; serializedObject.Update(); EditorGUILayout.PropertyField(m_AssetsPPU, m_Style.assetsPPU); if (m_AssetsPPU.intValue <= 0) { m_AssetsPPU.intValue = 1; } EditorGUILayout.BeginHorizontal(); { EditorGUILayout.PrefixLabel(m_Style.refRes); EditorGUIUtility.labelWidth = k_SingleLetterLabelWidth * (EditorGUI.indentLevel + 1); EditorGUILayout.PropertyField(m_RefResX, m_Style.x); if (m_RefResX.intValue <= 0) { m_RefResX.intValue = 1; } EditorGUILayout.PropertyField(m_RefResY, m_Style.y); if (m_RefResY.intValue <= 0) { m_RefResY.intValue = 1; } EditorGUIUtility.labelWidth = originalLabelWidth; } EditorGUILayout.EndHorizontal(); EditorGUILayout.PropertyField(m_UpscaleRT, m_Style.upscaleRT); if (!m_UpscaleRT.boolValue) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(m_PixelSnapping, m_Style.pixelSnapping); EditorGUI.indentLevel--; } EditorGUILayout.BeginHorizontal(); { EditorGUILayout.PrefixLabel(m_Style.cropFrame); EditorGUIUtility.labelWidth = k_SingleLetterLabelWidth * (EditorGUI.indentLevel + 1); EditorGUILayout.PropertyField(m_CropFrameX, m_Style.x, GUILayout.MaxWidth(40.0f)); EditorGUILayout.PropertyField(m_CropFrameY, m_Style.y); EditorGUIUtility.labelWidth = originalLabelWidth; } EditorGUILayout.EndHorizontal(); if (m_CropFrameY.boolValue && m_CropFrameX.boolValue) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(m_StretchFill, m_Style.stretchFill); EditorGUI.indentLevel--; } serializedObject.ApplyModifiedProperties(); PixelPerfectCamera obj = target as PixelPerfectCamera; if (obj != null) { EditorGUI.BeginDisabledGroup(EditorApplication.isPlaying || !obj.isActiveAndEnabled); EditorGUI.BeginChangeCheck(); bool runInEditMode = EditorGUILayout.Toggle(obj.runInEditMode, GUI.skin.button, GUILayout.Width(110.0f)); GUI.Label(GUILayoutUtility.GetLastRect(), m_Style.runInEditMode, m_Style.centeredLabel); if (EditorGUI.EndChangeCheck()) { obj.runInEditMode = runInEditMode; if (runInEditMode) { obj.GetComponent <Camera>().Render(); } else { obj.OnDisable(); } } EditorGUI.EndDisabledGroup(); if (obj.isActiveAndEnabled && (EditorApplication.isPlaying || obj.runInEditMode)) { if (Event.current.type == EventType.Layout) { m_CurrentPixelRatioValue.text = string.Format("{0}:1", obj.pixelRatio); } EditorGUI.BeginDisabledGroup(true); EditorGUILayout.LabelField(m_Style.currentPixelRatio, m_CurrentPixelRatioValue); EditorGUI.EndDisabledGroup(); } } }