步骤:
1.设置NGUI的UIRoot适配方案,这样保证任何分辨率下高度能保证全部呈现。(高度设置为基准高度,即做UI得时候的高度)
2.贴上脚本,把需要移动和缩放的object拖入Inspector,选择移动或缩放方案。代码如下:
using UnityEngine; using System.Collections; using System.Collections.Generic; /// <summary> /// 自适应类型 /// </summary> public enum SelfAdaptionType { LeftPanel, UpPanel, DownPanel, RightPanel } public class SelfAdaption_PC : MonoBehaviour { public SelfAdaptionType adaptionType; //自适应类型 float screenWid; float screenHei; private float baseWidth=2000f; //基准宽 private float baseHeight = 1125f; //基准高 private float baseScreenWidth = 1296f; //基准的屏幕宽(screen.width的输出值) float deltaWid; //移动偏移量 float deltaScale; //缩放比例 public List<GameObject> objsMove = new List<GameObject>(); //需要移动的物体 public List<GameObject> objsScale = new List<GameObject>(); //需要缩放的物体 void Awake() { screenWid= Screen.width; screenHei = Screen.height; deltaWid = (baseWidth - screenWid* baseHeight / screenHei)/2; deltaScale = screenWid / baseScreenWidth; SelfAdaption_PC_(); } private void SelfAdaption_PC_() { if(adaptionType.Equals(SelfAdaptionType.LeftPanel)) { MoveObjs(1); } else if(adaptionType.Equals(SelfAdaptionType.RightPanel)) { MoveObjs(-1); } else if(adaptionType.Equals(SelfAdaptionType.UpPanel)) { ScaleObjs(); } else if(adaptionType.Equals(SelfAdaptionType.DownPanel)) { ScaleObjs(); } } private bool MoveObjs(int _flag) { if (objsMove != null && objsMove.Count > 0) { foreach (var it in objsMove) { it.transform.localPosition +=(_flag)* new Vector3(deltaWid, 0, 0); } return true; } return false; } private bool ScaleObjs() { if(objsScale!=null&&objsScale.Count>0) { foreach(var it in objsScale) { Vector3 t_scale = it.transform.localScale; it.transform.localScale = new Vector3(t_scale.x*deltaScale,t_scale.y,t_scale.z); } return true; } return false; } }
PS:
1.Game里设置的基准分辨率,与screen.width和screen.height不符,导致缩放的参考值需要获取和自己设置。
2.本示例缩放不适用于不居中的的物体(此方案旨在移动布局)。
示例: