Unity3d屏幕分辨率自适应问题

解决屏幕分辨率的脚本主要有2个(UIAdapt,ScaleAdapt)

1.UIAdapt脚本

using UnityEngine;
using System.Collections;

/// <summary>
/// 单例类 ,不用挂载
/// </summary>
public class UIAdapt {

private static UIAdapt _instance;
private static object _lock=new object();
public static UIAdapt Instance
{
get
{
lock (_lock)
{
if (_instance == null)
{
_instance = new UIAdapt();
}
return _instance;
}
}
}

float originWidth = 1334;
float originHeight = 750;

float lastWidth;
float lastHeight;

Vector2 nowHW = new Vector2();

public Vector2 GetNowHW()
{
if (Screen.width == lastWidth && Screen.height == lastHeight) return nowHW;

float ratioHW = originHeight / originWidth;

int height =(int)( Screen.width *ratioHW);
int width=0;
if(height>Screen.height)
{
height = Screen.height;
width =(int)(height / ratioHW);
}
else
{
width = Screen.width;
}

nowHW.x = width;
nowHW.y = height;

lastHeight = Screen.height;
lastWidth = Screen.width;
return nowHW;
}

public float GetScale()
{

Vector2 hw = GetNowHW();
float yScale = hw.y / originHeight;
float xScale = hw.x / originWidth;

return yScale > xScale ? xScale : yScale;

}
}

2.ScaleAdapt脚本

using UnityEngine;
using System.Collections;

public class ScaleAdapt : MonoBehaviour {

[SerializeField]
public enum HorizontalAdaptiveMode
{
NONE,
LEFT,
RIGHT
}
[SerializeField]
public enum VerticalAdaptiveMode
{
NONE,
UP,
DOWN

}
public HorizontalAdaptiveMode horMode = HorizontalAdaptiveMode.NONE;
public VerticalAdaptiveMode verMode = VerticalAdaptiveMode.NONE;
Vector2 startVector;
Vector2 lastVector;
public Vector2 nowHW;

UIPanel panel;

void Awake()
{
// panel = GameObject.FindGameObjectWithTag("GuiCamera").transform.parent.GetComponent<UIPanel>();
}
void Start () {

startVector = transform.localScale;
Adaptive();
}
#if UNITY_EDITOR
void Update ()
{
Adaptive();
}
#endif

Vector3 finScale;
void Adaptive()
{

nowHW = UIAdapt.Instance.GetNowHW();
float ratio=UIAdapt.Instance.GetScale();

if (lastVector == nowHW) return;

lastVector = nowHW;
finScale.x = startVector.x * ratio;
finScale.y = startVector.y * ratio;
finScale.z = finScale.x;
transform.localScale = finScale;

Vector3 offset = Vector3.zero;

int dir = 0;

if(horMode!=HorizontalAdaptiveMode.NONE)
{

dir = horMode == HorizontalAdaptiveMode.LEFT ? -1 : 1;
// offset += dir * Vector3.right * (panel.width - nowHW.x) / 2;
offset += dir * Vector3.right * (Screen.width - nowHW.x) / 2;

}

if(verMode!=VerticalAdaptiveMode.NONE)
{

dir = verMode == VerticalAdaptiveMode.DOWN ? -1 : 1;
// offset += dir * Vector3.up * (panel.height - nowHW.y) / 2;
offset += dir * Vector3.up * (Screen.height - nowHW.y) / 2;

}
transform.localPosition = offset;
}
}

原文地址:https://www.cnblogs.com/lovesharing/p/8901788.html

时间: 2024-10-10 23:24:29

Unity3d屏幕分辨率自适应问题的相关文章

Unity3D开发(一):NGUI之UIRoot屏幕分辨率自适应

原地址:http://blog.csdn.net/onerain88/article/details/11713299 NGUI在Unity3D游戏开发中非常常用,而NGUI对于每一个UI场景,都是以一个UIRoot为UI游戏对象树的根的,那么这个UIRoot是起什么作用的呢? 先简单看一下UIRoot中的基本属性 UIRoot游戏对象的属性只有4个,分别是缩放规则,手动高度,最小高度和最大高度 而正是这4个属性,将影响整个UI场景中整体的缩放比例,当设置好这4个属性之后,UIRoot游戏对象的

NGUI之UIRoot屏幕分辨率自适应

来自:http://blog.csdn.net/oneRain88/article/details/11713299 NGUI在Unity3D游戏开发中非常常用,而NGUI对于每一个UI场景,都是以一个UIRoot为UI游戏对象树的根的,那么这个UIRoot是起什么作用的呢? 先简单看一下UIRoot中的基本属性 UIRoot游戏对象的属性只有4个,分别是缩放规则,手动高度,最小高度和最大高度 而正是这4个属性,将影响整个UI场景中整体的缩放比例,当设置好这4个属性之后,UIRoot游戏对象的相

Android不同手机屏幕分辨率自适应【转】

有必要了解的 Android中常见的单位 dip, dp, px, sp之间的区别: dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖像素.px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多.pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用:sp: scal

利用CSS3中的clac()实现按照屏幕分辨率自适应宽度

1.简介 calc()看其外表像个函数.平时在制作页面的时候,总会碰到有的元素是100%的宽度(例如body元素).如果元素宽度为100%时,其自身不带其他盒模型属性设置还好,要是有别的,那将导致盒子撑破.比如说,有一个边框,或者说有margin和padding,这些都会让你的盒子撑破.我们换句话来说,如果你的元素宽度是100%时,只要你在元素中添加了border,padding,margin任何一值,都将会把元素盒子撑破(标准模式下,除IE怪异模式).平时我们碰到这样的现象时,只能通过改变结构

Delphi 窗体自适应屏幕分辨率的改进

Delphi:窗体自适应屏幕分辨率的改进 http://blog.sciencenet.cn/blog-39148-544498.html 在窗体依据屏幕分辨率自适应调整尺度方面,昨天的工作可以说是一个突破点.昨天的工作找到了长期以来我的原有方案的问题所在,这是非常关键的.但是昨天晚上的解决方案并不完美,今天的这个才是比较完美的解决版. 先补充说明一下这个问题的重要性.这本来只是一个很小的技术问题,但在现有的Windows软件开发过程中,这个问题非常常见.一些非常著名的商业化软件,也会发现这方面

窗体自适应屏幕分辨率

话说Delphi有个很强的窗体设计器,这一点让VC粉丝垂涎三尺而不可得.但是,Delphi里设计的窗体并没有自动适应屏幕分辨率的属性,也就是说,软件设计时调整完美的窗体控件布局,在不同屏幕分辨率的机器上运行时可能会变得面目全非.控件之间会相互移位,有的甚至移出窗体再也找不到了. 这个问题在网上搜索过多次,但大都依据控件方法ScaleBy或者ChangeScale.采用这两个方法进行自适应调整,我自己都试过,但效果并不理想.后来我自己也写了一个继承自窗体的基类,覆盖构造函数,调用自己的一个设备分辨

rem实现页面自适应屏幕分辨率

<html> <body> <div class="test"></div> </body> </html> 默认情况下1rem=16px;   font-size: 62.5%, 1rem=10px;   以下按照屏幕分辨率设置font-size的百分率, 可以保证div的宽高比在不同分辨率下保持一致,    页面字体大小使用rem同理 /*根据屏幕分辨率自适应大小*/ @media (max-width:192

Unity3D NGUI自适应屏幕分辨率(2014/4/17更新)

原地址:http://blog.csdn.net/asd237241291/article/details/8126619 原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 本文链接地址:Unity3D NGUI自适应屏幕分辨率 1.UIRoot:根据高度自适应屏幕分辨率. NGUI根目录的UIRoot组件自带了根据高度自适应分辨率的功能. Scaling Style属性可选择三种不同的缩放策略. PixelPerfect 完美像素:直接显示设定好的像素.当屏幕高度低于minimum

Unity3D Android手机屏幕分辨率问题

Android手机屏幕分辨率五花八门,导致开发时不好把握,还好各个引擎对这个屏幕分辨率问题都有较好的处理方式:unity3D 也为我们提供了一个不错的解决方案. 在Unity3D 进行 android 游戏开发时,对于不同分辨率下的显示效果就像是摄像机的自动平移了一般,看了不少游戏,对于 Unity3D 开发 android 游戏貌似都没有做相应的屏幕分辨率的处理,而是随摄像机的自动移动,把场景做大些不至于出现空白背景. 其实 Unity3D 开发3D游戏,对于不同的分辨率,我们只需要设置 1