admin 管理员组文章数量: 887021
2024年2月19日发(作者:scanner scanner new scanner())
Unity强制屏幕纵宽比脚本
Xiaoke's Blog,unity3d中文网站,Unity3D中文网,unity3d中文论坛,unity3d学习社区,unity3d教程,Unity3D教学,Unity3D专业,unity3d中国,unity,unity开发,unity ios,unity
android,unity3d游戏,unity游戏,unity3d官网,unity中国官网,Unity强制屏幕纵宽比脚本 - XiaoKe's BlogXiaoKe's
Blog 无止境的夜~瞬息万变~一下开心~一下皱眉~
首页生活琐事日常工作技术日志我的成果杂七杂八访客留言论坛
上一篇 | 下一篇 技术日志
Unity强制屏幕纵宽比脚本作者:威阿 日期:2012-11-22字体大小: 小 中 大
强制屏幕到所需要的长宽比,可以根据需要自由选择是否应用强制比例.其中包括返回校正后的屏幕宽度,高度(/height)和鼠标位置(osition).
将这个脚本放在编译顺序较优先的文件夹中,比如 Standard Assets,
(Plugins是最先编译的),因此你可以用Js,C#等语言调用AspectUtility来使用它.首先要将它附加到Camera上,它同样可以附加给其他物体,如果你赋给其他物体,它将主动尝试找到标签为"Main
Camera"的相机.对于WantedAspectRatio这个值,常见的是4:3为1.333333,16:10为1.6,16:9为1.777778,如果屏幕的纵宽比与设定的相同,不会有任何变化.如果与设定的纵宽比不同,将用黑色填充缺少的部分.
这样会导致有些方法返回不正确,比如和会返回实际屏幕尺寸,而不是主相机的尺寸,为了纠正
这个问题,可以使用Width和Height.
同样的,osition也会有些问题,这种情况可以使用osition获取需要的值.
有一点要注意,这些变量在脚本刚唤醒的时候可能不能正确获取到,这就需要等待脚本开始后再访问它们.
当屏幕尺寸变化,例如Webplayer,采用4:3的比例,用户切换全屏后变成了16:9,这时候就需要用era()重设脚本相机.
OnGUI代码在用AspectRatioEnforcer时需要做一些额外的工作.OnGUI的代码独立于Camera画在屏幕上的.所以相机改变了矩阵尺寸,它不会自动变化.这时候我们要特别处理一下.
如果你是用GUILayout来排列GUI,可以用rea和EndArea来定义一个范围,像下面这样:
js 代码
12345function OnGUI () { ("Hello");
("there");}
修改它为:
js 代码
12345678function OnGUI ()
{ rea(Rect);
("Hello"); ("there");
a();}
如果已经用过BeginArea/EndArea,你可以直接在外面再嵌套Rect,它仍旧会处理好的.
如果你没有使用GUILayout,那么可以添加x和y的偏移来修正所有GUI的Rect,可以用t 和
t来得到偏移量,比如你平时这样写:
js 代码
12345function OnGUI () { (Rect(50, 50, 100, 30),
"Hello"); (Rect(75, 75, 100, 30), "there");}
现在改成:
js 代码
12345678function OnGUI () { var x = t;
var y = t; (Rect(x + 50, y
+ 50, 100, 30), "Hello"); (Rect(x + 75, y + 75, 100,
30), "there");}
通常在OnGUI里获得鼠标位置用的是osition,在这里我们应该改使用sePosition.
脚本
csharp 代码
82936373839464748495657585966676869767778798687888996979899100101using UnityEngine; public class
AspectUtility : MonoBehaviour { public float
_wantedAspectRatio = 1.3333333f; static float
wantedAspectRatio; static Camera cam; static Camera
backgroundCam; void Awake () { cam = camera;
if (!cam) { cam = ; } if
(!cam) { or ("No camera available");
return; } wantedAspectRatio =
_wantedAspectRatio; SetCamera(); } public
static void SetCamera () { float currentAspectRatio =
(float) / ; // If the current
aspect ratio is already approximately equal to the desired
aspect ratio, // use a full-screen Rect (in case it was
set to something else previously) if
((int)(currentAspectRatio * 100) / 100.0f ==
(int)(wantedAspectRatio * 100) / 100.0f)
{ = new Rect(0.0f, 0.0f, 1.0f, 1.0f);
if (backgroundCam)
{ Destroy(ject);
} return; } // Pillarbox
if (currentAspectRatio > wantedAspectRatio)
{ float inset = 1.0f -
wantedAspectRatio/currentAspectRatio; =
new Rect(inset/2, 0.0f, 1.0f-inset, 1.0f); } //
Letterbox else { float inset = 1.0f -
currentAspectRatio/wantedAspectRatio; =
new Rect(0.0f, inset/2, 1.0f, 1.0f-inset); } if
(!backgroundCam) { // Make a new camera behind the
normal camera which displays black; otherwise the unused space
is undefined backgroundCam = new
GameObject("BackgroundCam", typeof(Camera)).camera;
= ue;
lags = olor;
oundColor = ;
gMask = 0; } } public
static int screenHeight { get { return
(int)( * ); } }
public static int screenWidth { get
{ return (int)( *
); } } public static int
xOffset { get { return (int)( *
.x); } } public static int yOffset
{ get { return (int)( *
.y); } } public static Rect
screenRect { get { return new
Rect(.x * , .y * ,
* , *
); } } public static Vector3
mousePosition { get { Vector3 mousePos =
osition; mousePos.y -=
(int)(.y * ); mousePos.x -=
(int)(.x * ); return
mousePos; } } public static Vector2
guiMousePosition { get { Vector2 mousePos =
osition; mousePos.y =
(mousePos.y, .y * ,
.y * + * );
mousePos.x = (mousePos.x, .x *
, .x * + *
); return mousePos; } }}
脚本:
csharp 代码
82936373839464748495657585966676869767778798687888996979899597using UnityEngine;
public class AspectUtility : MonoBehaviour { public float
_wantedAspectRatio = 1.5f; public bool landscapeModeOnly =
true; static public bool _landscapeModeOnly = true;
static float wantedAspectRatio; static Camera cam;
static Camera backgroundCam; void Awake ()
{ _landscapeModeOnly = landscapeModeOnly; cam
= camera; if (!cam) { cam = ;
("Setting the main camera " + ); }
else { ("Setting the main camera " +
); } if (!cam)
{ or ("No camera available");
return; } wantedAspectRatio =
_wantedAspectRatio; SetCamera(); } public
static void SetCamera () { float currentAspectRatio =
0.0f; if(ation ==
apeRight ||
ation == apeLeft)
{ ("");
currentAspectRatio = (float) /
; } else {
("?"); if( >
&& _landscapeModeOnly)
{ currentAspectRatio = (float) /
; } else
{ currentAspectRatio = (float) /
; } } // If the
current aspect ratio is already approximately equal to the
desired aspect ratio, // use a full-screen Rect (in case
it was set to something else previously)
("currentAspectRatio = " + currentAspectRatio + ",
wantedAspectRatio = " + wantedAspectRatio); if
((int)(currentAspectRatio * 100) / 100.0f ==
(int)(wantedAspectRatio * 100) / 100.0f)
{ = new Rect(0.0f, 0.0f, 1.0f, 1.0f);
if (backgroundCam)
{ Destroy(ject);
} return; } // Pillarbox
if (currentAspectRatio > wantedAspectRatio)
{ float inset = 1.0f -
wantedAspectRatio/currentAspectRatio; =
new Rect(inset/2, 0.0f, 1.0f-inset, 1.0f); } //
Letterbox else { float inset = 1.0f -
currentAspectRatio/wantedAspectRatio; =
new Rect(0.0f, inset/2, 1.0f, 1.0f-inset); } if
(!backgroundCam) { // Make a new camera behind the
normal camera which displays black; otherwise the unused space
is undefined backgroundCam = new
GameObject("BackgroundCam", typeof(Camera)).camera;
= ue;
lags = olor;
oundColor = ;
gMask = 0; } } public
static int screenHeight { get { return
(int)( * ); } }
public static int screenWidth { get
{ return (int)( *
); } } public static int
xOffset { get { return (int)( *
.x); } } public static int yOffset
{ get { return (int)( *
.y); } } public static Rect
screenRect { get { return new
Rect(.x * , .y * ,
* , *
); } } public static Vector3
mousePosition { get { Vector3 mousePos =
osition; mousePos.y -=
(int)(.y * ); mousePos.x -=
(int)(.x * ); return
mousePos; } } public static Vector2
guiMousePosition { get { Vector2 mousePos =
osition; mousePos.y =
(mousePos.y, .y * ,
.y * + * );
mousePos.x = (mousePos.x, .x *
, .x * + *
); return mousePos; } }}
原文:/?title=AspectRatioEnforcer
Tags: UnityUnity guigui 游戏开发游戏开发 gui比例gui比例 屏幕屏幕 游戏屏幕游戏屏幕 界面界面
译者:威阿,转载请注明来自
相关日志: 输出Unity的场景文件为Obj模型文件[465]Unity CEO访谈:Unreal投机 Unity简单实在[678]Unity 4.0正式发布!官网同步改版.[1477]Unity 3.5.6发布及更新说明[1473]Unity3.5.5发布,更新列表.[2205]Unity内建Package简要说明[2646]
在Unity编辑器上增加你自己的工具[2392]Unity3.5.1版本更新修正列表[2518]Unity3.5中内建精简字体字库方法讲解[5790]久违的更新-Unity3.5正式版发布!(中文版更新说明)[8998]
分页: [1][2][3][4][5]1011
模式: 全部显示[共164个相关文章]评论: 0 | 引用: 0 | 查看次数:
发表评论
昵 称: 内 容:
密 码: 游客发言不需要密码.
正在加载编辑器...
选 项:禁止表情转换 禁止自动转换链接 禁止自动转换关键字
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭
关于我Name:XiaoKeAge:28QQ:3122828
Tel:134****2989Weibo:@Unity3(sina,qq,163)Msn:VrMsn#l:MineVR#
Unity引擎Unity QQ Group: 2453819,34643309,7838310Unity Sina Group: 110440Unity BaiduHi: 1049402
Unity Official IRC: Links
Unity Magazine: LinksUnity CN Froum: LinksUnity Wiki: Links
Unity CN Answers: LinksUnity Forum: Links
最新评论虽然很少在mac下看flash了,但还是很感谢你。...thx,不过发现与 ClickToFlash 这个...可用。
来实现
Thanks!我的装了没有用,我的RMBP15,10.8 只装...可以更改
动态加载a...楼主,这是用什么语言做的?转换后,空间坐标怎么办?...2009的max早就把fbx插件集成了。还装什么插...请问用户想添加一张从网上刚下载的壁纸进行替换,,是...灰常感谢[Lovely]感谢!
最新留言威哥又要开始发威拉。
娃哈哈~~~“适当调节遮挡区栅格的密度.根据你游戏物体体积权衡...威大,我在试着做游戏优化,在遮挡剔除这部分,我把遮...我加QQ群,怎么没有通过啊博主你好,请问U3D里的把所有物体的线框显示出来是...谢谢啊,不过unity每次发布beta版本我都不知...您好,大神,能帮我看个flash导出的问题吗,当我...你好!刚刚看了你的教程,也在优酷上加了关注!希望能...博主威武!!!好厉害的说!!支持一个~~
...博主,偶然来到这里,我决定关注你了,你是我的,不,...用户面板登录用户注册统计日志: 616 篇评论: 956 个留言: 214 个会员: 475 人在线: 10 人
访问: 10387493 次
建站时间: 2004-08-26日历2013年1月日一二三四五六
372829303112
类别首页生活琐事 [159]
日常工作 [80]
我的成果 [92]
访客留言论坛
标签云集技术日志 [185]
杂七杂八 [100]
存档201201月02月05月07月08月10月11月12月201101月02月03月04月05月
06月07月09月10月201001月03月04月05月06月07月09月10月11月12月06月07月08月09月10月07月08月09月10月11月06月07月08月09月10月
200901月02月03月04月05月11月12月200801月02月03月05月06月
12月200701月02月03月04月05月11月12月200601月02月03月07月08月
09月10月11月12月200501月02月03月04月05月06月07月11月12月200411月12月
搜索关键字 类 型 日志标题 日志内容 日志评论 引用通告
支持
Powered By PJBlog CopyRight 2005 - 2008, XiaoKe's Blog xhtml
| css | 网站统计 关闭提示
关闭确 认 取 消
版权声明:本文标题:unity强制屏幕纵宽比足本[整理版] 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1708314802h519388.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论