第九個示例
目前程式碼如下:
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 解析度");
}
目錄結構如下:
第九個示例很容易整理成第四個示例。
第十個示例
目前程式碼如下:
#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
這樣就可以了。
更改後選單如下:
目錄結構如下:
到目前為止還比較順利。但是呢程式碼中使用的 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;
}
}
}
選單如下:
目錄及檔案如下:
而第一個示例的資料夾已經被筆者刪除了。
第十二個示例
程式碼如下
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));
}
}
}
整理步驟:
- 合併 MathUtil 類和 PercentFunction 類為 MathUtil.cs
- 選單的標題 從 12 改成 6,而順序改成 7 (因為 5 和 6 已經被第五個示例用了)。
- 目錄名改成與選單名一致。
更改後程式碼如下:
#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));
}
}
}
目錄結構如下
選單如下
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);
}
}
}
整理步驟:
- 類合併為 GameObjectSimplify
- 選單順序更改以及標題順序更改
- 程式碼檔名和目錄更改
整理之後程式碼如下:
#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);
}
}
}
編譯之後,選單欄程式設計如下:
目錄結構如下:
到此,全部的選單順序整理完了。
小結:
遺留問題:
- (完成) 第八個示例與之前的示例程式碼重複,功能重複。
- (完成) 方法所在類的命名有問題。
- (完成) 選單欄顯示順序問題(new)。
- (完成) 棄用的程式碼警告
遺留問題終於全部解決了,我們的整理階段也要接近尾聲了。
今天就寫到這,我們下一篇再見,拜拜~ 。
轉載請註明地址:涼鞋的筆記:liangxiegame.com
更多內容
-
QFramework 地址:https://github.com/liangxiegame/QFramework
-
QQ 交流群:623597263
-
Unity 進階小班:
- 主要訓練內容:
- 框架搭建訓練(第一年)
- 跟著案例學 Shader(第一年)
- 副業的孵化(第二年、第三年)
- 權益、授課形式等具體詳情請檢視《小班產品手冊》:https://liangxiegame.com/master/intro
- 主要訓練內容:
-
關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。