123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- using System;
- using System.Linq;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.UI;
- using UnityEditor;
- using Rokid.UXR.Interaction;
- namespace Rokid.UXR.Editor
- {
- using props = CanvasRenderTexture.Properties;
- [CustomEditor(typeof(CanvasRenderTexture))]
- public class CanvasRenderTextureEditor : EditorBase
- {
- private static List<CanvasRenderer> _tmpRenderers = new List<CanvasRenderer>();
- private static List<Graphic> _tmpGraphics = new List<Graphic>();
- public new CanvasRenderTexture target
- {
- get
- {
- return base.target as CanvasRenderTexture;
- }
- }
- protected override void OnEnable()
- {
- var canvasProp = serializedObject.FindProperty(props.Canvas);
- Draw(props.Resolution, props.DimensionDriveMode, (resProp, modeProp) =>
- {
- Rect rect = GUILayoutUtility.GetRect(0, EditorGUIUtility.singleLineHeight);
- Rect labelRect = rect;
- labelRect.width = EditorGUIUtility.labelWidth;
- Rect dropdownRect = rect;
- dropdownRect.x = rect.xMax - 70;
- dropdownRect.width = 70;
- Rect contentRect = rect;
- contentRect.xMin = labelRect.xMax;
- contentRect.xMax = dropdownRect.xMin;
- GUI.Label(labelRect, resProp.displayName);
- if (modeProp.intValue == (int)CanvasRenderTexture.DriveMode.Auto && canvasProp.objectReferenceValue != null)
- {
- using (new EditorGUI.DisabledScope(true))
- {
- EditorGUI.Vector2IntField(contentRect, GUIContent.none, target.CalcAutoResolution());
- }
- }
- else
- {
- resProp.vector2IntValue = EditorGUI.Vector2IntField(contentRect, GUIContent.none, resProp.vector2IntValue);
- }
- EditorGUI.PropertyField(dropdownRect, modeProp, GUIContent.none);
- });
- Draw(props.PixelsPerUnit, props.GenerateMipMaps, (pixelsPerUnit, mipmaps) =>
- {
- var driveMode = serializedObject.FindProperty(props.DimensionDriveMode);
- if (driveMode.intValue == (int)CanvasRenderTexture.DriveMode.Auto)
- {
- EditorGUILayout.PropertyField(pixelsPerUnit);
- }
- EditorGUILayout.PropertyField(mipmaps);
- });
- }
- protected override void OnBeforeInspector()
- {
- base.OnBeforeInspector();
- bool isEmpty;
- AutoFix(AutoFixIsUsingScreenSpaceCanvas(), AutoFixSetToWorldSpaceCamera, "The OverlayRenderer only supports Canvases that are set to World Space.");
- AutoFix(isEmpty = AutoFixIsMaskEmpty(), AutoFixAssignUIToMask, "The rendering Mask is empty, it needs to contain at least one layer for rendering to function.");
- if (!isEmpty)
- {
- AutoFix(AutoFixAnyCamerasRenderingTargetLayers(), AutoFixRemoveRenderingMaskFromCameras, "Some cameras are rendering using a layer that is specified here as a Rendering layer. This can cause the UI to be rendered twice.");
- AutoFix(AutoFixAnyRenderersOnUnrenderedLayers(), AutoFixMoveRenderersToMaskedLayers, "Some CanvasRenderers are using a layer that is not included in the rendered LayerMask.");
- }
- }
- #region AutoFix
- private bool AutoFix(bool needsFix, Action fixAction, string message)
- {
- if (needsFix)
- {
- using (new EditorGUILayout.HorizontalScope())
- {
- EditorGUILayout.HelpBox(message, MessageType.Warning);
- if (GUILayout.Button("Auto-Fix", GUILayout.ExpandHeight(true)))
- {
- fixAction();
- }
- }
- }
- return needsFix;
- }
- private bool AutoFixIsUsingScreenSpaceCanvas()
- {
- Canvas canvas = target.GetComponent<Canvas>();
- if (canvas == null)
- {
- return false;
- }
- return canvas.renderMode != RenderMode.WorldSpace;
- }
- private void AutoFixSetToWorldSpaceCamera()
- {
- Canvas canvas = target.GetComponent<Canvas>();
- if (canvas != null)
- {
- Undo.RecordObject(canvas, "Set Canvas To World Space");
- canvas.renderMode = RenderMode.WorldSpace;
- }
- }
- private bool AutoFixIsMaskEmpty()
- {
- var layerProp = serializedObject.FindProperty(props.RenderLayers);
- return layerProp.intValue == 0;
- }
- public void AutoFixAssignUIToMask()
- {
- Undo.RecordObject(target, "Set Overlay Mask");
- var layerProp = serializedObject.FindProperty(props.RenderLayers);
- layerProp.intValue = CanvasRenderTexture.DEFAULT_UI_LAYERMASK;
- serializedObject.ApplyModifiedProperties();
- }
- private bool AutoFixAnyRenderersOnUnrenderedLayers()
- {
- var canvasProp = serializedObject.FindProperty(props.Canvas);
- Canvas canvas = canvasProp.objectReferenceValue as Canvas;
- if (canvas == null)
- {
- return false;
- }
- canvas.gameObject.GetComponentsInChildren(_tmpRenderers);
- foreach (var renderer in _tmpRenderers)
- {
- int layer = renderer.gameObject.layer;
- if (((1 << layer) & target.RenderingLayers) == 0)
- {
- return true;
- }
- }
- return false;
- }
- private void AutoFixMoveRenderersToMaskedLayers()
- {
- var canvasProp = serializedObject.FindProperty(props.Canvas);
- Canvas canvas = canvasProp.objectReferenceValue as Canvas;
- if (canvas == null)
- {
- return;
- }
- var maskedLayers = AutoFixGetMaskedLayers();
- var targetLayer = maskedLayers.FirstOrDefault();
- canvas.gameObject.GetComponentsInChildren(_tmpRenderers);
- foreach (var renderer in _tmpRenderers)
- {
- int layer = renderer.gameObject.layer;
- if ((layer & target.RenderingLayers) == 0)
- {
- Undo.RecordObject(renderer.gameObject, "Set Overlay Layer");
- renderer.gameObject.layer = targetLayer;
- }
- }
- }
- private bool AutoFixAnyCamerasRenderingTargetLayers()
- {
- var cameras = FindObjectsOfType<Camera>();
- foreach (var camera in cameras)
- {
-
- if (camera == target.OverlayCamera)
- {
- continue;
- }
- if ((camera.cullingMask & target.RenderingLayers) != 0)
- {
- return true;
- }
- }
- return false;
- }
- private void AutoFixRemoveRenderingMaskFromCameras()
- {
- var cameras = FindObjectsOfType<Camera>();
- foreach (var camera in cameras)
- {
- Undo.RecordObject(camera, "Set Camera Culling Mask");
- camera.cullingMask = camera.cullingMask & ~target.RenderingLayers;
- }
- }
- private List<int> AutoFixGetMaskedLayers()
- {
- List<int> maskedLayers = new List<int>();
- for (int i = 0; i < 32; i++)
- {
- if ((target.RenderingLayers & (1 << i)) != 0)
- {
- maskedLayers.Add(i);
- }
- }
- return maskedLayers;
- }
- #endregion
- }
- }
|