美文网首页unity3D技术分享
Unity 游戏框架搭建 2019 (十四) 第九个示例(一)

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

作者: 凉鞋的笔记 | 来源:发表于2020-03-30 11:08 被阅读0次

    在上一篇文章中,经过大量的思考我们得出了一个学习方向,那就是在项目中比较实用的小知识点。

    我们大部分 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 时。


    006tNc79gy1fzdhzd3cdyj30u00uhths.jpg

    输出结果为:横屏

    而改成如下图所示的 3:4 时


    006tNc79gy1fzdhzh4ehtj30du040t92.jpg

    则输出结果为:竖屏。

    计算分辨率

    现在我们知道了屏幕的方向,这样我们就比较好判断当前屏幕的宽高比了。
    代码如下:

    #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);
            }
        }
    }
    

    代码执行的结果与之前的一致。

    今天的内容就这些,拜拜~。

    转载请注明地址:凉鞋的笔记:liangxiegame.com

    更多内容

    相关文章

      网友评论

        本文标题:Unity 游戏框架搭建 2019 (十四) 第九个示例(一)

        本文链接:https://www.haomeiwen.com/subject/jdimuhtx.html