这里先发布一个,自己写得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;
	}
}
时间: 2024-08-05 20:28:24

这里先发布一个,自己写得unityUI的适配的方案(插播)的相关文章

这里先公布一个,自己写得unityUI的适配的方案(插播)

这个适配是根据坐标系的象限的思想来进项适配的,参考了部分的NGUI的适配方案. 在程序的其实,来测量UI距离相机边界的像素然后根据比例来进行适配,个人觉得还不错. 放码!. 有个前提哦就是你要先定一个尺寸.假如我优先适配1024*768.那在放置这个脚本之前,要把自己的界面还成1024*768的哦.我是根据第一次来进行适配的哦. using UnityEngine; using System.Collections; #if UNITY_EDITOR using UnityEditor; #en

Android 开发中踩过的坑之九: 发布一个aar的注意事项

现在Android支持aar格式发布一个模块, 提供给其他人使用. aar其实是jar和一些资源文件的zip包. 解决了过去jar包不能分享资源的局限. 1 要尽量避免定义内部接口, 这其实是一个编程习惯, 接口interface最好是独立定义, 避免定义在类的内部. 因为当你发布aar时, 内部的接口在混淆后会独立成一个外部的接口Outer$InnerInterface. 然后麻烦来了, 别人在实现这个类的时候必须也写成XXX implement Outer$InnerInterface{}的

发布一个参考ssdb,用go实现的类似redis的高性能nosql:ledisdb

起因 ledisdb是一个参考ssdb,采用go实现,底层基于leveldb,类似redis的高性能nosql数据库,提供了kv,list,hash以及zset数据结构的支持. 我们现在的应用极大的依赖redis,但随着我们用户量越来越大,redis的内存越来越不够用,并且replication可能还会导致超时问题.虽然后续我们可以通过添加多台机器来解决,但是在现有机器配置下面,我们仍希望单台机器承载更多的用户.另外,因为业务的特性,我们其实并不需要将所有的数据放到内存,只需要存放当前活跃用户.

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

咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着,以极少的文字说明以及极少的代码书写为原则来给大家演示! 文章中上传的模块不具备任何意义! 一.封装node.js模块时的必须项 1.创建package.json 每一个完整封装的node模块,必须含有一个参数明确的package.json文件! 以下为package.json的最精简配置: { "n

发布一个python服务框架iserver(带压力测试数据)

Iserver简介 Iserver是一个用python编写的网络服务框架(编译版本3.4.1),使用的是epool网络模型 测试机配置 处理器 2x Genuine Intel(R) CPU T2050 @ 1.60GHz 内存 2060MB (673MB used) nginx开启进程数 root 2413 2409 0 09:17 pts/0 00:00:00 grep -i nginx www 2414 2411 2 09:17 ? 00:00:00 nginx: worker proce

利用jws发布一个查询员工信息的Web服务(员工信息存储在数据库中)

这是<基于服务的软件系统>的课程设计: 一.作业要求 编写查询员工信息的Web服务(员工信息存储在数据库中).第一个Web服务:输入员工号,返回该员工号的员工的基本信息,包括员工号.员工名称.所在部门.出生日期.职位.职称.入职日期等信息.第二个Web服务:输入部门.职称,返回该部门具有该职称的所有员工的基本信息,员工基本信息与上面相同.分别针对上述两个Web服务,分别编写调用这两个Web服务的程序(或网页).要求在输入界面上输入待查询数据,调用Web服务,并将Web服务返回的员工信息查询结果

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

? 1. 为什么需要对项目分发打包? 平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而这个过程就是 打包. 打包,就是将你的源代码进一步封装,并且将所有的项目部署工作都事先安排好,这样使用者拿到后即装即用,不用再操心如何部署的问题(如果你不想对照着一堆部署文档手工操作的话). 不管你是在工作中,还是业余准备自己写一个可以上传到 PyPI 的项目,你都要学会如何打包你的项目. Python 发展了这么些年了,项目打包

自定义及发布一个webservice服务

自定义及发布一个webservice服务    - 声明 某个业务服务为webservice服务       通过@webservice 注解来声明    - 发布webservice服务       Endpoint.publish()发布 (默认对public修饰的方法进行发布)    - 通过wsimport生成本地代理来访问自己发布的webservice       wsimport 1.发布自定义webservice phone.java package ws.myWebService

开源一个C#写的Android和IOS都能跑的 打击感强的RPG玩玩。

不废话直接上图 关于下载和打开 没错,我强调过很多次的,Unity3D开发的.  如果你还不懂Unity3D 的基本开发套路,如何打开Unity如何安装Unity这些问题.我建议你先不要索要源代码. 下载后,直接打开这个工程......  然后打开根目录下载ManTuLanSi这个Scence  ,如果你是用PC,就可以按  ASDW开前  来控制前后左右.痛快的打一下怪吧. 源代码齐全吗?? 因为美术资源是别人的,所以实际源代码会有部分美术资源替换了.不过,代码还是这份代码.完全没变. 能商用