这篇文章主要讲的是ngui 自适应和对齐,因为自己用的都达不到想要的效果,这是在其他博客上看到的。给大家分享一下。
我一直对那些在屏幕适应上出现问题的人推荐使用UIRoot的ManualHeight。

先提供三个截图。看看效果是否是你想要的。旁边空白出来的地方,你需要和策划、美术商量用一些背景挡住。

1、正常开发分辨率下:

ngui 自适应和对齐

2、看起来较细的分辨率:

ngui 自适应和对齐

3、看起来较宽的分辨率:

ngui 自适应和对齐

使用注意:
1、和策划制定好开发时分辨率。这很重要,要保证所有UI都在同样的分辨率下制作。
2、把我这个脚本挂在UIRoot上。UIRoot的Scaling Style修改为FixedSize。
3、aspectRatioHeight、aspectRatioWidth分别为开发时的高和宽。
4、每个UIRoot都需要调整ManualHeight到和策划制定的高度。
5、Unity3D的Game窗口,调整到相应的分辨率。
(感谢成都-大强提供以下版本。注意:UICamera.onScreenResize是3.0+版本的,如果报错请删除即可)
  1. [csharp] view plaincopy
  2. using UnityEngine;
  3. [ExecuteInEditMode]
  4. [RequireComponent(typeof(UIRoot))]
  5. public class SZUIRootScale : MonoBehaviour
  6. {
  7. public int aspectRatioHeight;
  8. public int aspectRatioWidth;
  9. public bool runOnlyOnce = false;
  10. private UIRoot mRoot;
  11. private bool mStarted = false;
  12. void Awake()
  13. {
  14. UICamera.onScreenResize += ScreenSizeChanged;
  15. }
  16. void OnDestroy()
  17. {
  18. UICamera.onScreenResize -= ScreenSizeChanged;
  19. }
  20. void Start()
  21. {
  22. mRoot = NGUITools.FindInParents<UIRoot>(this.gameObject);
  23. mRoot.scalingStyle = UIRoot.Scaling.FixedSize;
  24. this.Update();
  25. mStarted = true;
  26. }
  27. void ScreenSizeChanged()
  28. {
  29. if (mStarted && runOnlyOnce) {
  30. this.Update();
  31. }
  32. }
  33. void Update()
  34. {
  35. float defaultAspectRatio = aspectRatioWidth * 1f / aspectRatioHeight;
  36. float currentAspectRatio = Screen.width * 1f / Screen.height;
  37. if (defaultAspectRatio > currentAspectRatio) {
  38. int horizontalManualHeight = Mathf.FloorToInt(aspectRatioWidth / currentAspectRatio);
  39. mRoot.manualHeight = horizontalManualHeight;
  40. } else {
  41. mRoot.manualHeight = aspectRatioHeight;
  42. }
  43. if (runOnlyOnce && Application.isPlaying) {
  44. this.enabled = false;
  45. }
  46. }
  47. }
关于各种对齐的UI部件

如图

ngui 自适应和对齐


这种对齐方式,很简单设置anchor即可。
NGUI里的例子可见是对UI Root来做anchor的,可是如果我们UI制作是做成prefab来保存,实时实例化加载的话,就会自动失去对UI Root 的 anchor关系。

其实很简单,只要这些UI部件是针对本UI最外层的UISprite来做anchor,然后在加载后实时将 target 改为UI Root即可

ngui 自适应和对齐