这里先公布一个,自己写得unityUI的适配的方案(插播)
2014-06-30 18:24
337 查看
这个适配是根据坐标系的象限的思想来进项适配的,参考了部分的NGUI的适配方案。
在程序的其实,来测量UI距离相机边界的像素然后根据比例来进行适配,个人觉得还不错。 放码!。
有个前提哦就是你要先定一个尺寸。假如我优先适配1024*768。那在放置这个脚本之前,要把自己的界面还成1024*768的哦。我是根据第一次来进行适配的哦。
在程序的其实,来测量UI距离相机边界的像素然后根据比例来进行适配,个人觉得还不错。 放码!。
有个前提哦就是你要先定一个尺寸。假如我优先适配1024*768。那在放置这个脚本之前,要把自己的界面还成1024*768的哦。我是根据第一次来进行适配的哦。
using UnityEngine; using System.Collections; #if UNITY_EDITOR using UnityEditor; #endif public enum QuadrantLayout{ Quadrant1, Quadrant2, Quadrant3, Quadrant4 } [ExecuteInEditMode] public class AutoLayout : MonoBehaviour{ [HideInInspector] public QuadrantLayout quadrant; [HideInInspector] public Vector2 margin; Vector3 lastPostion; #if UNITY_EDITOR [HideInInspector] [SerializeField] private bool isFirstLoad=true; int pixelWidth; void Awake(){ lastPostion = this.transform.localPosition; if(isFirstLoad){ updateMarginOffset(); isFirstLoad=false; }else{ resetMarginOffset(); } } void Update(){ if(!Application.isPlaying){ if(Vector3.Distance(lastPostion,this.transform.localPosition)>0.001f && Selection.activeGameObject == this.gameObject){ updateMarginOffset(); UnityEditor.EditorUtility.SetDirty(this); }else{ resetMarginOffset(); } lastPostion = this.transform.localPosition; }else{ if((int)Camera.main.pixelWidth!=pixelWidth){ resetMarginOffset(); } pixelWidth = (int)Camera.main.pixelWidth; } } #else void Start(){ resetMarginOffset(); } #endif void updateMarginOffset(){ float m = (Camera.main.WorldToScreenPoint(new Vector3(1,0,0))-Camera.main.WorldToScreenPoint(Vector3.zero)).x; float halfWidth=Camera.main.pixelWidth/2.0f/m; float halfHeight=Camera.main.pixelHeight/2.0f/m; Vector3 v = this.transform.position; //1 if(v.x>=0 && v.y>=0){ quadrant = QuadrantLayout.Quadrant1; margin = new Vector2(halfWidth-v.x,halfHeight-v.y); //2 }else if(v.x>=0 && v.y<=0){ quadrant = QuadrantLayout.Quadrant2; margin = new Vector2(halfWidth-v.x,halfHeight+v.y); //3 }else if(v.x<=0 && v.y<=0){ quadrant = QuadrantLayout.Quadrant3; margin = new Vector2(halfWidth+v.x,halfHeight+v.y); //4 }else if(v.x<=0 && v.y>=0){ quadrant = QuadrantLayout.Quadrant4; margin = new Vector2(halfWidth+v.x,halfHeight-v.y); } } void resetMarginOffset(){ Vector3 sv = Vector3.zero; float m = (Camera.main.WorldToScreenPoint(new Vector3(1,0,0))-Camera.main.WorldToScreenPoint(Vector3.zero)).x; float halfWidth=Camera.main.pixelWidth/2.0f/m; float halfHeight=Camera.main.pixelHeight/2.0f/m; switch(quadrant){ case QuadrantLayout.Quadrant1: sv = new Vector3(halfWidth-margin.x,halfHeight-margin.y,0); break; case QuadrantLayout.Quadrant2: sv = new Vector3(halfWidth-margin.x,margin.y-halfHeight,0); break; case QuadrantLayout.Quadrant3: sv = new Vector3(margin.x-halfWidth,margin.y-halfHeight,0); break; case QuadrantLayout.Quadrant4: sv = new Vector3(margin.x-halfWidth,halfHeight-margin.y,0); break; } sv.z = this.transform.position.z; transform.position = sv; } }
相关文章推荐
- 这里先发布一个,自己写得unityUI的适配的方案(插播)
- Unity游戏引擎挖坑记之3d游戏ui屏幕适配方案(二)
- 给你一个全自动的屏幕适配方案(基于SW方案)!—— 解放你和UI的双手
- 前一段时间没事用c#写了一个串口程序,这里总结一下自己的经验
- Unity公布4.6版本UI代码开源项目参与指南
- 自己开发一个 unity gui sgui
- Unity3D的GUI插件(UIToolkit,GUIX)在Unity的社区里发现一个不错的UI插件----UIToolkit.
- EF架构~终于自己架构了一个相对完整的EF方案
- android多分辨率多屏幕密度下UI适配方案
- android多分辨率多屏幕密度下UI适配方案
- Unity2D多分辨率屏幕适配方案
- 最近 因为 一个take阻塞 一直占有当前获取的lock 导致奇怪的现象 这里把自己的测试代码贴下 免得下次犯错
- 离开一个自己不喜欢的地方,我不知道是希望的开始还是结束,在未来的三个多月,这里也许是我的天堂...
- android多分辨率多屏幕密度下UI适配方案
- 制作一个页面网格,可以用来把自己所做的UI和需求图片进行位置,像素比较
- EF架构~终于自己架构了一个相对完整的EF方案
- 4.VC(ui)-拖动效果的一个实现方案
- 自己写的一个导出的程序这里主要用到一下程序
- [unity基础教程]UI方案及制作细节(NGUI/EZGUI/原生UI系统)
- [原创]一种Unity2D多分辨率屏幕适配方案