这个适配是依据坐标系的象限的思想来进项适配的。參考了部分的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. StyleCop setting

    StyleCop下载地址:http://stylecop.codeplex.com/ -Documentation Rules 文档化注释规则 -Element Documentaion 变量的文档化 ...

  2. 在 Ubuntu 系统安装 Redi

    在 Ubuntu 系统安装 Redi 可以使用以下命令: $sudo apt-get update $sudo apt-get install redis-server 启动 Redis $ redi ...

  3. python全局变量被覆盖的问题

    下面的情况,foo全局变量会被局部变量覆盖掉,这样在其它地方使用的值就是空值. g_foo = '' #全局变量 def set(): g_foo = 'abc' # 给全局变量赋值 def use_ ...

  4. 524. Longest Word in Dictionary through Deleting【Medium】【删除后得到的字典中的最长单词】

    Given a string and a string dictionary, find the longest string in the dictionary that can be formed ...

  5. RedisDesktopManager-0.9.3 for windows (转)

    redis数据库的可视化工具 官方出了RedisDesktopManager-0.9.8版本后要购买了.之前自用的Windows版本0.9.3.817有需要的可以使用.解压直接启动即可.主要以备自用! ...

  6. 合并区间(LintCode)

    合并区间 给出若干闭合区间,合并所有重叠的部分. 样例 给出的区间列表 => 合并后的区间列表: [ [ [1, 3], [1, 6], [2, 6], => [8, 10], [8, 1 ...

  7. 洛谷——P2388 阶乘之乘

    P2388 阶乘之乘 题目背景 不告诉你…… 题目描述 求出1!*2!*3!*4!*……*n!的末尾有几个零 输入输出格式 输入格式: n(n<=10^8) 输出格式: 有几个零 输入输出样例 ...

  8. qwb与学姐 (带秩并查集)

    qwb与学姐 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 149  Solved: 54[Submit][Status][Web Board] Des ...

  9. CDH-hive支持insert、update、delete操作

    开发要求hive支持update操作,搞张临时表测试下,报错如下: 配置hive-site.xml CDH进入hive配置页,选择高级,找到hive-site.xml的HIve客户端高级配置段代码段, ...

  10. Spring的Web服务

    Spring支持:使用JAX-RPC暴露服务,访问Web服务 除了上面所说的支持方法,你还可以用XFire xfire.codehaus.org 来暴露你的服务.XFire是一个轻量级的SOAP库,目 ...