Unity 游戏框架搭建 2019 (十四、十五) 第九个示例

第九个示例(一)

在上一篇文章中,经过大量的思考我们得出了一个学习方向,那就是在项目中比较实用的小知识点。
我们大部分 Unity 做的项目呢都是移动端的项目,这里包括 iPhone、iPad 以及各种 Android 端的设备。而经过笔者统计大部分的设备屏幕宽高比都是 16:9(iPhone 5s 至 iPhone 8) 和 4:3 (iPad)。而少部分的则是接近 2:1(iPhone X) 和 3:2(iPhone 4s),还有一些比较奇葩的分辨率,比如魅族和华为的 Pad。
而我们在进行屏幕适配的时候多多少少会通过代码来写一些特定分辨率的逻辑(因为总有那么几个比较奇葩的设备)。OK,到此我们要做的事情比较明确了。
我们来做一个用来区分当前设备分辨率的工具。
我们先来写一个最简单的,判断是否是 Pad 分辨率(4:3)。

第九个示例

在开始写判断逻辑之前呢,我们先要获取当前设备的宽和高。
Unity 提供了 Screen.height 和 Screen.width 这两个 API 来为我们提供当前设备的高和宽。

判断横竖屏

设备有可能是横屏也可能是竖屏,所以我们要判断当前是横屏还是竖屏。
判断代码如下:
    
# if UNITY_EDITOR [ MenuItem ( "QFramework/9.屏幕宽高比判断" ) ] # endif private static void MenuClicked ( ) { var isLandscape = Screen . width > Screen . height ; Debug . Log ( isLandscape ? "横屏" : "竖屏" ) ; }
如下图所示,当将 Game 视图的分辨率改成 4:3 时。
输出结果为:横屏
而改成如下图所示的 3:4 时 则输出结果为:竖屏。

计算分辨率

现在我们知道了屏幕的方向,这样我们就比较好判断当前屏幕的宽高比了。 代码如下:
    
# if UNITY_EDITOR [ MenuItem ( "QFramework/9.屏幕宽高比判断" ) ] # endif private static void MenuClicked ( ) { var isLandscape = Screen . width > Screen . height ; float aspect ; if ( isLandscape ) { aspect = ( float ) Screen . width / Screen . height ; } else { aspect = ( float ) Screen . height / Screen . width ; } Debug . Log ( aspect ) ; }
由于 Screen.width 和 Screen.height 都是 int 类型的。相除可能结果也只能是整数,所以要在前边转成 float 类型。
以上的这个代码不管是将 Game 视图的分辨率设置成 4:3 还是 3:4,输出的宽高比值都是 1.333 左右,而这个宽高比值的小数点第三位都有一点浮动。所以要在判断是否是 Pad 分辨率的时候要把这个浮动范围考虑进去。

计算是否是 Pad 分辨率

有了以上准备,我们的 Pad 分辨率就比较容易写了。
代码如下
    
# if UNITY_EDITOR [ MenuItem ( "QFramework/9.屏幕宽高比判断" ) ] # endif private static void MenuClicked ( ) { var aspect = Screen . width > Screen . height ? ( float ) Screen . width / Screen . height : ( float ) Screen . height / Screen . width ; var isPad = aspect > ( 4.0f / 3 - 0.05 ) && aspect < ( 4.0f / 3 + 0.05 ) ; Debug . Log ( isPad ? "是 Pad 分辨率" : "不是 Pad 分辨率" ) ; }
关于 aspect 的计算做了一步简化,核心代码还是下边的代码,不过也比较好理解了,不多讲了。
代码的执行结果为:Game 视图的宽高比设置成 4:3 或者 3:4 的时候,则输出“是 Pad 分辨率”。如果设置成其他的则输出“不是 Pad 分辨率”。
基本上的一个功能我们算是实现完了,而且测试的结果也是正确的。

提取成方法。

我们来观察一下这几行代码
    
# if UNITY_EDITOR [ MenuItem ( "QFramework/9.屏幕宽高比判断" ) ] # endif private static void MenuClicked ( ) { var aspect = Screen . width > Screen . height ? ( float ) Screen . width / Screen . height : ( float ) Screen . height / Screen . width ; var isPad = aspect > ( 4.0f / 3 - 0.05 ) && aspect < ( 4.0f / 3 + 0.05 ) ; Debug . Log ( isPad ? "是 Pad 分辨率" : "不是 Pad 分辨率" ) ; }
其实可以提取成两个方法。一个是计算 aspect (宽高比)的,一个是判断是否是 Pad 分辨率的。
提取后的代码如下:
    
using UnityEngine ; # if UNITY_EDITOR using UnityEditor ; # endif namespace QFramework { public class ResolutionCheck { # if UNITY_EDITOR [ MenuItem ( "QFramework/9.屏幕宽高比判断" ) ] # endif private static void MenuClicked ( ) { Debug . Log ( IsPadResolution ( ) ? "是 Pad 分辨率" : "不是 Pad 分辨率" ) ; } /// <summary> /// 获取屏幕宽高比 /// </summary> /// <returns></returns> public static float GetAspectRatio ( ) { return Screen . width > Screen . height ? ( float ) Screen . width / Screen . height : ( float ) Screen . height / Screen . width ; } public static bool IsPadResolution ( ) { var aspect = GetAspectRatio ( ) ; return aspect > ( 4.0f / 3 - 0.05 ) && aspect < ( 4.0f / 3 + 0.05 ) ; } } }
代码执行的结果与之前的一致。

第九个示例(二)

在上一篇文章中,我们完成了 Pad 设备分辨率的判断。我们今天把剩下的其他分辨率都搞定。

16:9 手机分辨率

大部分手机是 16 : 9 的。 所以代码如下。
    
/// <summary> /// 是否是手机分辨率 16:9 /// </summary> /// <returns></returns> public static bool IsPhoneResolution ( ) { var aspect = GetAspectRatio ( ) ; return aspect > 16.0f / 9 - 0.05 && aspect < 16.0f / 9 + 0.05 ; }

3:2 (iPhone 4s)

    
/// <summary> /// 是否是手机分辨率 3:2 3 / 2 = 1.5 /// </summary> /// <returns></returns> public static bool IsPhone15Resolution ( ) { var aspect = GetAspectRatio ( ) ; return aspect > 3.0f / 2 - 0.05 && aspect < 3.0f / 2 + 0.05 ; }

2436:1125 (iPhone X)

    
/// <summary> /// 是否是iPhone X 分辨率 2436:1125 /// </summary> /// <returns></returns> public static bool IsiPhoneXResolution ( ) { var aspect = GetAspectRatio ( ) ; return aspect > 2436.0f / 1125 - 0.05 && aspect < 2436.0f / 1125 + 0.05 ; }

其他

相信扩展机型的规律大家应该掌握了,这里就不多说了。
完整示例代码如下:
    
using UnityEngine ; # if UNITY_EDITOR using UnityEditor ; # endif namespace QFramework { public class ResolutionCheck { # if UNITY_EDITOR [ MenuItem ( "QFramework/9.屏幕宽高比判断" ) ] # endif private static void MenuClicked ( ) { Debug . Log ( IsPadResolution ( ) ? "是 Pad 分辨率" : "不是 Pad 分辨率" ) ; Debug . Log ( IsPhoneResolution ( ) ? "是 Phone 分辨率" : "不是 Phone 分辨率" ) ; Debug . Log ( IsiPhoneXResolution ( ) ? "是 iPhone X 分辨率" : "不是 iPhone X 分辨率" ) ; } /// <summary> /// 获取屏幕宽高比 /// </summary> /// <returns></returns> public static float GetAspectRatio ( ) { return Screen . width > Screen . height ? ( float ) Screen . width / Screen . height : ( float ) Screen . height / Screen . width ; } /// <summary> /// 是否是 Pad 分辨率 4 : 3 /// </summary> /// <returns></returns> public static bool IsPadResolution ( ) { var aspect = GetAspectRatio ( ) ; return aspect > 4.0f / 3 - 0.05 && aspect < 4.0f / 3 + 0.05 ; } /// <summary> /// 是否是手机分辨率 16:9 /// </summary> /// <returns></returns> public static bool IsPhoneResolution ( ) { var aspect = GetAspectRatio ( ) ; return aspect > 16.0f / 9 - 0.05 && aspect < 16.0f / 9 + 0.05 ; } /// <summary> /// 是否是iPhone X 分辨率 2436:1125 /// </summary> /// <returns></returns> public static bool IsiPhoneXResolution ( ) { var aspect = GetAspectRatio ( ) ; return aspect > 2436.0f / 1125 - 0.05 && aspect < 2436.0f / 1125 + 0.05 ; } } }
到此呢,我们可以进行一次导出了。
今天内容就这些。
转载请注明地址:凉鞋的笔记: liangxiegame.com

更多内容

  • QQ 交流群: 623597263
  • Unity 进阶小班 :
  • 主要训练内容:
  • 框架搭建训练(第一年)
  • 跟着案例学 Shader(第一年)
  • 副业的孵化(第二年、第三年)
  • 权益、授课形式等具体详情请查看 《小班产品手册》 :https://liangxiegame.com/master/intro
  • 关注公众号:liangxiegame 获取第一时间更新通知及更多的免费内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值