1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #if UGUI_1_0_0_OR_NEWER
- using UnityEngine;
- using UnityEngine.UI;
-
- public class CustomCanvasScaler : CanvasScaler
- {
- private Canvas m_RootCanvas;
- private const float kLogBase = 2;
-
- protected override void OnEnable()
- {
- m_RootCanvas = GetComponent<Canvas>();
- base.OnEnable();
- }
-
- protected override void HandleScaleWithScreenSize()
- {
- Vector2 screenSize;
- if (m_RootCanvas.worldCamera != null)
- {
- screenSize = new Vector2(m_RootCanvas.worldCamera.pixelWidth, m_RootCanvas.worldCamera.pixelHeight);
- }
- else
- {
- screenSize = new Vector2(Screen.width, Screen.height);
- }
-
- // Multiple display support only when not the main display. For display 0 the reported
- // resolution is always the desktops resolution since its part of the display API,
- // so we use the standard none multiple display method. (case 741751)
- int displayIndex = m_RootCanvas.targetDisplay;
- if (displayIndex > 0 && displayIndex < Display.displays.Length)
- {
- Display disp = Display.displays[displayIndex];
- screenSize = new Vector2(disp.renderingWidth, disp.renderingHeight);
- }
-
- float scaleFactor = 0;
- switch (m_ScreenMatchMode)
- {
- case ScreenMatchMode.MatchWidthOrHeight:
- {
- // We take the log of the relative width and height before taking the average.
- // Then we transform it back in the original space.
- // the reason to transform in and out of logarithmic space is to have better behavior.
- // If one axis has twice resolution and the other has half, it should even out if widthOrHeight value is at 0.5.
- // In normal space the average would be (0.5 + 2) / 2 = 1.25
- // In logarithmic space the average is (-1 + 1) / 2 = 0
- float logWidth = Mathf.Log(screenSize.x / m_ReferenceResolution.x, kLogBase);
- float logHeight = Mathf.Log(screenSize.y / m_ReferenceResolution.y, kLogBase);
- float logWeightedAverage = Mathf.Lerp(logWidth, logHeight, m_MatchWidthOrHeight);
- scaleFactor = Mathf.Pow(kLogBase, logWeightedAverage);
- break;
- }
- case ScreenMatchMode.Expand:
- {
- scaleFactor = Mathf.Min(screenSize.x / m_ReferenceResolution.x, screenSize.y / m_ReferenceResolution.y);
- break;
- }
- case ScreenMatchMode.Shrink:
- {
- scaleFactor = Mathf.Max(screenSize.x / m_ReferenceResolution.x, screenSize.y / m_ReferenceResolution.y);
- break;
- }
- }
-
- SetScaleFactor(scaleFactor);
- SetReferencePixelsPerUnit(m_ReferencePixelsPerUnit);
- }
- }
- #endif
|