123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- using UnityEngine;
- namespace FairyGUI
- {
- /// <summary>
- ///
- /// </summary>
- [ExecuteInEditMode]
- [AddComponentMenu("FairyGUI/UI Content Scaler")]
- public class UIContentScaler : MonoBehaviour
- {
- /// <summary>
- ///
- /// </summary>
- public enum ScaleMode
- {
- ConstantPixelSize,
- ScaleWithScreenSize,
- ConstantPhysicalSize
- }
- /// <summary>
- ///
- /// </summary>
- public enum ScreenMatchMode
- {
- MatchWidthOrHeight,
- MatchWidth,
- MatchHeight
- }
- /// <summary>
- ///
- /// </summary>
- public ScaleMode scaleMode;
- /// <summary>
- ///
- /// </summary>
- public ScreenMatchMode screenMatchMode;
- /// <summary>
- ///
- /// </summary>
- public int designResolutionX;
- /// <summary>
- ///
- /// </summary>
- public int designResolutionY;
- /// <summary>
- ///
- /// </summary>
- public int fallbackScreenDPI = 96;
- /// <summary>
- ///
- /// </summary>
- public int defaultSpriteDPI = 96;
- /// <summary>
- ///
- /// </summary>
- public float constantScaleFactor = 1;
- /// <summary>
- /// 当false时,计算比例时会考虑designResolutionX/Y的设置是针对横屏还是竖屏。否则不考虑。
- /// </summary>
- public bool ignoreOrientation = false;
- [System.NonSerialized]
- public static float scaleFactor = 1;
- [System.NonSerialized]
- public static int scaleLevel = 0;
- [System.NonSerialized]
- bool _changed;
- void OnEnable()
- {
- if (Application.isPlaying)
- {
- //播放模式下都是通过Stage自带的UIContentScaler实现调整的,所以这里只是把参数传过去
- UIContentScaler scaler = Stage.inst.gameObject.GetComponent<UIContentScaler>();
- if (scaler != this)
- {
- scaler.scaleMode = scaleMode;
- if (scaleMode == ScaleMode.ScaleWithScreenSize)
- {
- scaler.designResolutionX = designResolutionX;
- scaler.designResolutionY = designResolutionY;
- scaler.screenMatchMode = screenMatchMode;
- scaler.ignoreOrientation = ignoreOrientation;
- }
- else if (scaleMode == ScaleMode.ConstantPhysicalSize)
- {
- scaler.fallbackScreenDPI = fallbackScreenDPI;
- scaler.defaultSpriteDPI = defaultSpriteDPI;
- }
- else
- {
- scaler.constantScaleFactor = constantScaleFactor;
- }
- scaler.ApplyChange();
- GRoot.inst.ApplyContentScaleFactor();
- }
- }
- else //Screen width/height is not reliable in OnEnable in editmode
- _changed = true;
- }
- void Update()
- {
- if (_changed)
- {
- _changed = false;
- ApplyChange();
- }
- }
- void OnDestroy()
- {
- if (!Application.isPlaying)
- {
- scaleFactor = 1;
- scaleLevel = 0;
- }
- }
- //For UIContentScalerEditor Only, as the Screen.width/height is not correct in OnInspectorGUI
- /// <summary>
- ///
- /// </summary>
- public void ApplyModifiedProperties()
- {
- _changed = true;
- }
- /// <summary>
- ///
- /// </summary>
- public void ApplyChange()
- {
- float screenWidth;
- float screenHeight;
- if (Application.isPlaying) //In case of multi display, we keep using the display which Stage object resides.
- {
- screenWidth = Stage.inst.width;
- screenHeight = Stage.inst.height;
- }
- else
- {
- screenWidth = Screen.width;
- screenHeight = Screen.height;
- }
- if (scaleMode == ScaleMode.ScaleWithScreenSize)
- {
- if (designResolutionX == 0 || designResolutionY == 0)
- return;
- int dx = designResolutionX;
- int dy = designResolutionY;
- if (!ignoreOrientation && (screenWidth > screenHeight && dx < dy || screenWidth < screenHeight && dx > dy))
- {
- //scale should not change when orientation change
- int tmp = dx;
- dx = dy;
- dy = tmp;
- }
- if (screenMatchMode == ScreenMatchMode.MatchWidthOrHeight)
- {
- float s1 = (float)screenWidth / dx;
- float s2 = (float)screenHeight / dy;
- scaleFactor = Mathf.Min(s1, s2);
- }
- else if (screenMatchMode == ScreenMatchMode.MatchWidth)
- scaleFactor = (float)screenWidth / dx;
- else
- scaleFactor = (float)screenHeight / dy;
- }
- else if (scaleMode == ScaleMode.ConstantPhysicalSize)
- {
- float dpi = Screen.dpi;
- if (dpi == 0)
- dpi = fallbackScreenDPI;
- if (dpi == 0)
- dpi = 96;
- scaleFactor = dpi / (defaultSpriteDPI == 0 ? 96 : defaultSpriteDPI);
- }
- else
- scaleFactor = constantScaleFactor;
- if (scaleFactor > 10)
- scaleFactor = 10;
- UpdateScaleLevel();
- StageCamera.screenSizeVer++;
- }
- void UpdateScaleLevel()
- {
- if (scaleFactor > 3)
- scaleLevel = 3; //x4
- else if (scaleFactor > 2)
- scaleLevel = 2; //x3
- else if (scaleFactor > 1)
- scaleLevel = 1; //x2
- else
- scaleLevel = 0;
- }
- }
- }
|