这里先发布一个,自己写得unityUI的适配的方案(插播)
这个适配是依据坐标系的象限的思想来进项适配的。參考了部分的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的适配的方案(插播)的更多相关文章
- 如何发布一个Mac应用并使其成为全球付费榜第一
Readdle公司如何发布第一个 Mac App,并使之成为Mac App Store 全球付费排名第一的 Easy注:自从发布了<程序员如何优雅的挣零花钱?>后,就不断有同学询问怎么做A ...
- 如何发布一个自定义Node.js模块到NPM(详细步骤)
咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...
- 使用gitbook 发布一个教程文档网站
gitbook是一个好用的发布电子书的项目:使用gitbook 可以在本地写好文档再远程推送到库:也可以在gitbook提供的在线平台上制作电子书:要想在自己的服务器上使用gitbook 发布一个网站 ...
- 教你一步步发布一个开源库到 JCenter
今天想来分享下,如何一步步自己发布一个开源库到 JCenter 这方面的博客网上已经特别多了,所以本篇并不打算仅仅只是记录流程步骤而已,而是尽可能讲清楚,为什么需要有这个步骤,让大伙知其然的同时还知其 ...
- 如何发布一个npm包(基于vue)
前言:工作的时候总是使用别人的npm包,然而我有时心底会好奇自己如何发布一个npm包呢,什么时候自己的包能够被很多人喜欢并使用呢...今天我终于迈出了第一步. 前提:会使用 npm,有 vue 基础, ...
- 微信小程序发布一个月,世界并没有什么不同
从某种意义上说,在张小龙身上,最可怕的事情莫过于微信小程序发布一个月,一开始的大红大紫居然渐归沉寂,曾经的风光无限已无人谈起,世界并没有什么不同. 这真像一场噩梦,一切都可怕地颠倒了.一款微信的战略级 ...
- 如何发布一个自定义Node.js模块到NPM(详细步骤,附Git使用方法)
咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...
- 从0到1发布一个npm包
从0到1发布一个npm包 author: @TiffanysBear 最近在项目业务中有遇到一些问题,一些通用的方法或者封装的模块在PC.WAP甚至是APP中都需要使用,但是对于业务的PC.WAP.A ...
- 学习python这么久,有没有考虑发布一个属于自己的模块?
1. 为什么需要对项目分发打包? 平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而这个过程就是 打包. 打包,就是 ...
随机推荐
- 排序算法总结(C语言版)
排序算法总结(C语言版) 1. 插入排序 1.1 直接插入排序 1.2 Shell排序 2. 交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择 ...
- Java之static理解
说到关键字static,首先想到了常量,静态变量,本文我总结了下static的用法. 1.静态变量 可以被赋值,便于类访问. 2.静态方法 静态方法与静态变量都可以被private.public修饰. ...
- SSH Secure File Transfer上传文件错误:encountered 1 errors during the transfer解决办法
在使用SSH 工具向Linux服务器上传文件时,弹出 encountered 1 errors during the transfer 错误. 解决方案: 1.准备上传的那个文件所在目录路径存在(), ...
- cocos2d-x addImageAsync()异步加载资源成功之后的场景跳转问题
http://blog.csdn.net/w20175357/article/details/23546985 1.先说说addImageAsync()异步加载图片的问题 做游戏的时候现在资源的比较大 ...
- bss、data、text、heap(堆)与stack(栈)
bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量(static)的一块内存区域. bss是英文Block Started by Symbol的简称. b ...
- hdu 4135 Co-prime (素数打表+容斥原理)
题目链接 题意:问从A到B中与N互素的个数. 题解: 利用容斥原理:先求出与n互为素数的个数. 可以先将 n 进行素因子分解,然后用区间 x 除以 素因子,就得到了与 n 的 约数是那个素因子的个数, ...
- Linux操作命令(七)
本次实验将介绍 Linux 命令中 cut.paste 和 tr 命令的用法. cut paste tr 1.cut cut命令是一个将文本按列进行切分的小工具,他可以指定分隔每列的定界符. 如果一行 ...
- go chapter 8 - 初始化对象
http://blog.haohtml.com/archives/14239 struct定义的属性如果是小写开头的,那么该属性不是public的,不能跨包调用 (implicit assignmen ...
- ASP.NET总结——更改后
这篇重新整理的总结,我做了很久,也在草稿箱中放了很久,一直感觉没有达到和老师谈话后的水平,感觉还是需要增加一些修改,希望读者能提出宝贵意见.既这篇博客之前,我发表了一篇ASP.net的总结,在结构上, ...
- 初识C#设计模式
利用设计模式可以使我们的代码更灵活,更容易扩展,更容易维护.各种面向对象的程序设计语言都提供了基本相同的机制:比如类.继承.派生.多态等等.但是又有各自的特色,C# 中的反射机制便是一个很重要的工具, ...