• # Unity 游戏框架搭建 2019 (三十四、三十五) 9 ~ 10 示例整理


    第九个示例

    目前代码如下:

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

    第九个示例没有太大的问题,不管是类名还是目录名、菜单名、代码文件名,以及它每个方法所在的类都没有太大的问题。

    所以只需要更改菜单的顺序就好了。

    更改后,MenuItem 代码如下:

    #if UNITY_EDITOR
    		[MenuItem("QFramework/4.屏幕宽高比判断", false, 4)]
    #endif
    		private static void MenuClicked()
    		{
    			Debug.Log(IsPadResolution() ? "是 Pad 分辨率" : "不是 Pad 分辨率");
    			Debug.Log(IsPhoneResolution() ? "是 Phone 分辨率" : "不是 Phone 分辨率");
    			Debug.Log(IsiPhoneXResolution() ? "是 iPhone X 分辨率" : "不是 iPhone X 分辨率");
    		}
    
    

    目录结构如下:

    006tNc79gy1fzfrfari0wj30hc0auabk.jpg

    第九个示例很容易整理成第四个示例。

    第十个示例

    目前代码如下:

    #if UNITY_EDITOR
    using UnityEditor;
    #endif
    
    using UnityEngine;
    
    namespace QFramework
    {
    	public class TransformLocalPosImprovements
    	{
    #if UNITY_EDITOR
    		[MenuItem("QFramework/10.Transform 赋值优化")]
    #endif
    		private static void GenerateUnityPackageName()
    		{
    			var transform = new GameObject("transform").transform;
    
    			TransformSimplify.SetLocalPosX(transform, 5.0f);
    			TransformSimplify.SetLocalPosY(transform, 5.0f);
    			TransformSimplify.SetLocalPosZ(transform, 5.0f);
    		}
    	}
    }
    

    做如下更改:

    • MenuItem:10.Transform 赋值优化 => 5.Transform 赋值优化 并加上顺序号 5。
    • 目录名:10.Transform 赋值优化 = > 5.Transform 赋值优化。
    • MenuItem 方法名:GenerateUnityPackageName => MenuClicked

    这样就可以了。

    更改后菜单如下:
    006tNc79gy1fzfrfhpkjfj309o061tao.jpg

    目录结构如下:
    006tNc79gy1fzfrfk4sefj30jw09wmym.jpg

    到目前为止还比较顺利。但是呢代码中使用的 TransformSimplify 这个类,是在别的文件中定义的。

    而目前的这个示例仅仅有 MenuItem 方法,没有 TransformSimplify 实现代码,为什么会这样呢?

    因为我们在整理之前,对 Transform 的 API 做了两次简化,而我们的示例是一个一个独立写的,所以第一次简化的时候写了一个示例并且创建了一个 Transform 的简化类,第二次也一样也创建了一个 Transform 的简化类,而这两个类在之后整理的时候被合并成一个 Transform 的简化类了。

    这种情况,我们以后还会遇到的,可能有无数个 Transform 的简化方法。而我们的写示例的顺序,就是一个示例一个示例地写,这样写的好处就是初学者友好,也比较容易收集知识点。但是随着示例越写越多,会产生一些问题,比如代码重复实现,类需要合并等等,以目前我们的实力来说是没法搞定的,我们要学习新的东西。但是新的东西,要在我们排序完菜单顺序比较好一些。

    这个问题我们先记下来。

    要做的事情:

    • (完成) 备份:导出文件,并取一个合理的名字。
    • 整理完菜单顺序后,学习新的知识,解决随着示例增多可能出现类需要合并的问题。

    OK,我们接着整理第十一个示例

    第十一个示例

    代码如下

    
    using System;
    #if UNITY_EDITOR
    using UnityEditor;
    #endif
    
    using UnityEngine;
    
    namespace QFramework
    {
    	public class TransformSimplify
    	{
    		/// <summary>
    		/// 重置操作
    		/// </summary>
    		/// <param name="trans">Trans.</param>
    		public static void Identity(Transform trans)
    		{
    			trans.localPosition = Vector3.zero;
    			trans.localScale = Vector3.one;
    			trans.localRotation = Quaternion.identity;
    		}
    		
    		public static void SetLocalPosX(Transform transform, float x)
    		{
    			var localPos = transform.localPosition;
    			localPos.x = x;
    			transform.localPosition = localPos;
    		}
    		
    		public static void SetLocalPosY(Transform transform, float y)
    		{
    			var localPos = transform.localPosition;
    			localPos.y = y;
    			transform.localPosition = localPos;
    		}
    		
    		public static void SetLocalPosZ(Transform transform, float z)
    		{
    			var localPos = transform.localPosition;
    			localPos.z = z;
    			transform.localPosition = localPos;
    		}
    		
    		public static void SetLocalPosXY(Transform transform, float x, float y)
    		{
    			var localPos = transform.localPosition;
    			localPos.x = x;
    			localPos.y = y;
    			transform.localPosition = localPos;
    		}
    		
    		public static void SetLocalPosXZ(Transform transform, float x, float z)
    		{
    			var localPos = transform.localPosition;
    			localPos.x = x;
    			localPos.z = z;
    			transform.localPosition = localPos;
    		}
    		
    		public static void SetLocalPosYZ(Transform transform, float y, float z)
    		{
    			var localPos = transform.localPosition;
    			localPos.y = y;
    			localPos.z = z;
    			transform.localPosition = localPos;
    		}
    	}
    	
    	public class TransformIdentity : MonoBehaviour
    	{
    		
    #if UNITY_EDITOR
    		[MenuItem("QFramework/11.Transform 归一化")]
    #endif
    		private static void MenuClicked()
    		{
    			var transform = new GameObject("transform").transform;
    
    			TransformSimplify.Identity(transform);
    		}
    	}
    }
    

    这个示例可以和第五个示例进行合并。

    合并后的代码如下:

    #if UNITY_EDITOR
    using UnityEngine;
    using UnityEditor;
    #endif
    
    namespace QFramework
    {
    	public class TransformSimplify
    	{
    #if UNITY_EDITOR
    		[MenuItem("QFramework/5.Transform API 简化/1.赋值优化", false, 5)]
    #endif
    		private static void MenuClicked1()
    		{
    			var transform = new GameObject("transform").transform;
    
    			SetLocalPosX(transform, 5.0f);
    			SetLocalPosY(transform, 5.0f);
    			SetLocalPosZ(transform, 5.0f);
    		}
    		
    #if UNITY_EDITOR
    		[MenuItem("QFramework/5.Transform API 简化/2.重置", false 6)]
    #endif
    		private static void MenuClicked2()
    		{
    			var transform = new GameObject("transform").transform;
    
    			Identity(transform);
    		}
    		
    		/// <summary>
    		/// 重置操作
    		/// </summary>
    		/// <param name="trans">Trans.</param>
    		public static void Identity(Transform trans)
    		{
    			trans.localPosition = Vector3.zero;
    			trans.localScale = Vector3.one;
    			trans.localRotation = Quaternion.identity;
    		}
    		
    		public static void SetLocalPosX(Transform transform, float x)
    		{
    			var localPos = transform.localPosition;
    			localPos.x = x;
    			transform.localPosition = localPos;
    		}
    		
    		public static void SetLocalPosY(Transform transform, float y)
    		{
    			var localPos = transform.localPosition;
    			localPos.y = y;
    			transform.localPosition = localPos;
    		}
    		
    		public static void SetLocalPosZ(Transform transform, float z)
    		{
    			var localPos = transform.localPosition;
    			localPos.z = z;
    			transform.localPosition = localPos;
    		}
    		
    		public static void SetLocalPosXY(Transform transform, float x, float y)
    		{
    			var localPos = transform.localPosition;
    			localPos.x = x;
    			localPos.y = y;
    			transform.localPosition = localPos;
    		}
    		
    		public static void SetLocalPosXZ(Transform transform, float x, float z)
    		{
    			var localPos = transform.localPosition;
    			localPos.x = x;
    			localPos.z = z;
    			transform.localPosition = localPos;
    		}
    		
    		public static void SetLocalPosYZ(Transform transform, float y, float z)
    		{
    			var localPos = transform.localPosition;
    			localPos.y = y;
    			localPos.z = z;
    			transform.localPosition = localPos;
    		}
    	}
    }
    

    菜单如下:
    006tNc79gy1fzfrgcolu4j30bj05v40v.jpg

    目录及文件如下:

    006tNc79gy1fzfrgfic15j30m40c6wgh.jpg

    而第一个示例的文件夹已经被笔者删除了。

    第十二个示例

    代码如下

    using System;
    
    #if UNITY_EDITOR
    using UnityEditor;
    #endif
    
    using UnityEngine;
    using Random = UnityEngine.Random;
    
    namespace QFramework
    {
    	public class MathUtil
    	{
    		/// <summary>
    		/// 输入百分比返回是否命中概率
    		/// </summary>
    		public static bool Percent(int percent)
    		{
    			return Random.Range (0, 100) <= percent;
    		}
    	}
    	public class PercentFunction : MonoBehaviour
    	{
    #if UNITY_EDITOR
    		[MenuItem("QFramework/12.概率函数")]
    #endif
    		private static void MenuClicked()
    		{
    			Debug.Log(MathUtil.Percent(50));
    		}
    	}
    }
    

    整理步骤:

    1. 合并 MathUtil 类和 PercentFunction 类为 MathUtil.cs
    2. 菜单的标题 从 12 改成 6,而顺序改成 7 (因为 5 和 6 已经被第五个示例用了)。
    3. 目录名改成与菜单名一致。

    更改后代码如下:

    #if UNITY_EDITOR
    using UnityEditor;
    #endif
    
    using UnityEngine;
    using Random = UnityEngine.Random;
    
    namespace QFramework
    {
    	public class MathUtil
    	{
    		/// <summary>
    		/// 输入百分比返回是否命中概率
    		/// </summary>
    		public static bool Percent(int percent)
    		{
    			return Random.Range (0, 100) <= percent;
    		}
    
    #if UNITY_EDITOR
    		[MenuItem("QFramework/6.概率函数", false, 7)]
    #endif
    		private static void MenuClicked()
    		{
    			Debug.Log(Percent(50));
    		}
    	}
    }
    

    目录结构如下
    006tNc79gy1fzfrgl47anj30iq09sq49.jpg

    菜单如下
    006tNc79gy1fzfrgppbsjj30i00aegrz.jpg

    OK,第十二个示例整理完了

    第十三个示例

    代码如下:

    #if UNITY_EDITOR
    using UnityEditor;
    #endif
     
    using UnityEngine;
    
    namespace QFramework
    {
        public class GameObjectSimplify
        {
            public static void Show(GameObject gameObj)
            {
                gameObj.SetActive(true);
            }
    
            public static void Hide(GameObject gameObj)
            {
                gameObj.SetActive(false);
            }
        }
        
        public class GameObejctActiveImprovements
        {
    #if UNITY_EDITOR
            [MenuItem("QFramework/13.GameObejct 的显示、隐藏简化")]
    #endif
            private static void MenuClicked()
            {
                var gameObject = new GameObject();
    
                GameObjectSimplify.Hide(gameObject);
            }
        }
    }
    

    整理步骤:

    1. 类合并为 GameObjectSimplify
    2. 菜单顺序更改以及标题顺序更改
    3. 代码文件名和目录更改

    整理之后代码如下:

    #if UNITY_EDITOR
    using UnityEditor;
    #endif
     
    using UnityEngine;
    
    namespace QFramework
    {
        public class GameObjectSimplify
        {
            public static void Show(GameObject gameObj)
            {
                gameObj.SetActive(true);
            }
    
            public static void Hide(GameObject gameObj)
            {
                gameObj.SetActive(false);
            }
    
    #if UNITY_EDITOR
            [MenuItem("QFramework/7.GameObejct API 简化/显示、隐藏简化", false, 8)]
    #endif
            private static void MenuClicked()
            {
                var gameObject = new GameObject();
    
                Hide(gameObject);
            }
        }
    }
    

    编译之后,菜单栏编程如下:
    006tNc79gy1fzfrgv15puj30nu09w465.jpg

    目录结构如下:

    006tNc79gy1fzfrgy93eej30iq0aw0u6.jpg

    到此,全部的菜单顺序整理完了。

    小结:

    遗留问题:

    • (完成) 第八个示例与之前的示例代码重复,功能重复。
    • (完成) 方法所在类的命名有问题。
    • (完成) 菜单栏显示顺序问题(new)。
    • (完成) 弃用的代码警告

    遗留问题终于全部解决了,我们的整理阶段也要接近尾声了。

    今天就写到这,我们下一篇再见,拜拜~ 。

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

    更多内容

  • 相关阅读:
    nodeJs-querystring 模块
    nodeJs-process对象
    nodejs-Path模块
    nodejs-os模块
    nodejs-CommonJS规范
    nodejs-Events模块
    nodejs-Http模块
    nodejs-Cluster模块
    转:AOP与JAVA动态代理
    转:jdk动态代理实现
  • 原文地址:https://www.cnblogs.com/liangxiegame/p/12684799.html
Copyright © 2020-2023  润新知