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

涼鞋的筆記發表於2020-04-25

第九個示例

目前程式碼如下:

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

更多內容

相關文章