这个适配是依据坐标系的象限的思想来进项适配的。參考了部分的NGUI的适配方案。

在程序的事实上,来測量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的适配的方案(插播)的更多相关文章

  1. 如何发布一个Mac应用并使其成为全球付费榜第一

    Readdle公司如何发布第一个 Mac App,并使之成为Mac App Store 全球付费排名第一的 Easy注:自从发布了<程序员如何优雅的挣零花钱?>后,就不断有同学询问怎么做A ...

  2. 如何发布一个自定义Node.js模块到NPM(详细步骤)

    咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...

  3. 使用gitbook 发布一个教程文档网站

    gitbook是一个好用的发布电子书的项目:使用gitbook 可以在本地写好文档再远程推送到库:也可以在gitbook提供的在线平台上制作电子书:要想在自己的服务器上使用gitbook 发布一个网站 ...

  4. 教你一步步发布一个开源库到 JCenter

    今天想来分享下,如何一步步自己发布一个开源库到 JCenter 这方面的博客网上已经特别多了,所以本篇并不打算仅仅只是记录流程步骤而已,而是尽可能讲清楚,为什么需要有这个步骤,让大伙知其然的同时还知其 ...

  5. 如何发布一个npm包(基于vue)

    前言:工作的时候总是使用别人的npm包,然而我有时心底会好奇自己如何发布一个npm包呢,什么时候自己的包能够被很多人喜欢并使用呢...今天我终于迈出了第一步. 前提:会使用 npm,有 vue 基础, ...

  6. 微信小程序发布一个月,世界并没有什么不同

    从某种意义上说,在张小龙身上,最可怕的事情莫过于微信小程序发布一个月,一开始的大红大紫居然渐归沉寂,曾经的风光无限已无人谈起,世界并没有什么不同. 这真像一场噩梦,一切都可怕地颠倒了.一款微信的战略级 ...

  7. 如何发布一个自定义Node.js模块到NPM(详细步骤,附Git使用方法)

    咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...

  8. 从0到1发布一个npm包

    从0到1发布一个npm包 author: @TiffanysBear 最近在项目业务中有遇到一些问题,一些通用的方法或者封装的模块在PC.WAP甚至是APP中都需要使用,但是对于业务的PC.WAP.A ...

  9. 学习python这么久,有没有考虑发布一个属于自己的模块?

    ​ 1. 为什么需要对项目分发打包? 平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而这个过程就是 打包. 打包,就是 ...

随机推荐

  1. 2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17) 日常训练

    A - Archery Tournament 题目大意:按时间顺序出现靶子和射击一个位置,靶子的圆心为(x, y)半径为r,即圆与x轴相切,靶子不会重叠,靶子被击中后消失, 每次射击找出哪个靶子被射中 ...

  2. 启动WAMPSERVER出现计算机中丢失 MSVCR110.dll

    最近电脑因为系统损坏无法启动,不得已重装系统,也让PHP程序员雷雪松下决心坚决的抛弃XP系统.这样一来跟上时代的步伐,二来也为Win7的市场占有率和消灭IE7以下浏览器做点贡献.,作为一个PHP程序员 ...

  3. 最短路径-迪杰斯特拉(dijkstra)算法及优化详解

    简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...

  4. python正则的中文处理(转)

    匹配中文时,正则表达式规则和目标字串的编码格式必须相同 print sys.getdefaultencoding() text =u"#who#helloworld#a中文x#" ...

  5. apache几个常见配置文件的作用

    进行虚拟主机配置 NameVirtuaHost *:80 表示基于名称的虚拟主机  *:80表示监听本机所有IP的80端口上提供HTTP服务,*可以设置为具体IP<VirtualHost *:8 ...

  6. ReentrantLock和ReentrantReadWriteLock对比

    本文系作者原创,转载请注明:https://www.cnblogs.com/yanfei1819/p/10314533.html ReentrantLock 一.简介 ReentrantLock重入锁 ...

  7. [xsy2238]snake

    题意:给定一条折线,问能否在不扭曲它的情况下让它完全通过一个小孔 这个条件就是:过折线上任意一点$x$存在一条直线把折线分成不与直线相交的两部分,换句话说存在(与折线只有一个交点$x$)的直线 结论是 ...

  8. 【Heap-dijkstra】CDOJ1639 云中谁寄锦书来?雁字回时,月满西楼。

    题意: 在n个点m条边的无向图上,有k个出口 从起点出发,每到一个点(包括起点),该点连出的边中有d条会被封锁 求最坏情况下到达出口的最短路 题解: 该题为dijkstra算法的拓展 由于求最坏情况下 ...

  9. (疯狂java)第二课

    (本文章只是为了好玩,没有别的意思,有理解错误之处,恳请提醒,谢谢) 三.数据类型和运算符 想了一下今天看的内容好像依然大脑停留在用C语言去理解java,感觉有点奇怪,为啥本章叫数据类型和运算符,上来 ...

  10. linux基础环境搭建(2)

    打开虚拟机,用Xshell连接之前,首先我们要获取IP的地址   先输入获取 IP的命令 ip addr 获取ipifup (网卡名字) #网卡启动ifdown (网卡名字) #网卡关闭 没有获取到的 ...