Unity 遊戲框架搭建 2019 (二十六) 第一輪整理完結
昨天呢我們把第八個示例整理完了。整理之後學習了類的第一作用:方法的集合,還有 Obselete 這個 API。並且在進行整理的時候貫徹了我們新的約定和規則:先確保功能有效,再去做變更和刪除。
今天我們在往下接著整理第九個示例
第九個示例
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; } } }
我們先看些類的名字,ResolutionCheck,這個沒有太大的問題。所以這個示例就留著。
第十個示例
#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; SetLocalPosX(transform, 5.0f); SetLocalPosY(transform, 5.0f); SetLocalPosZ(transform, 5.0f); } 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; } } }
同樣也是沒啥太大的問題,也留著。
第十一個示例
#if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; namespace QFramework { public class TransformIdentity : MonoBehaviour { #if UNITY_EDITOR [MenuItem("QFramework/11.Transform 歸一化")] #endif private static void MenuClicked() { 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; } } }
類的名字沒有問題,但是到這裡筆者發現這個類裡的方法是可以和 第十個示例: TransformLocalPosImprovements 放在一個類裡的,因為都是對 Transform API 的簡化。
類名字可以叫 TransformSimplify。
類的定義如下:
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;
}
}
很簡單,就是把上一個示例與這個示例的方法都複製到了這裡,類的定義位置在 TransformIdentity 的上方。
接下來,我們要把原來的實現方法做中轉,再加上 Obselete 屬性。這步就不展示了,內容與上一篇文章一致,
第十二個示例
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class PercentFunction : MonoBehaviour
{
#if UNITY_EDITOR
[MenuItem("QFramework/12.概率函式")]
#endif
private static void MenuClicked()
{
Debug.Log(Percent(50));
}
/// <summary>
/// 輸入百分比返回是否命中概率
/// </summary>
public static bool Percent(int percent)
{
return Random.Range (0, 100) <= percent;
}
}
}
這個程式碼的類名就有點問題了,叫做 PercentFunction,Percent 呢,是數學計算,所以我們把這個方法歸到 MathUtil 這個類裡。
程式碼如下:
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));
}
/// <summary>
/// 輸入百分比返回是否命中概率
/// </summary>
[Obsolete("方法已棄用,請使用 MathUtil.Percent")]
public static bool Percent(int percent)
{
return MathUtil.Percent(percent);
}
}
}
第十三個示例
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace QFramework
{
public class GameObejctActiveImprovements
{
#if UNITY_EDITOR
[MenuItem("QFramework/13.GameObejct 的顯示、隱藏簡化")]
#endif
private static void MenuClicked()
{
var gameObject = new GameObject();
Hide(gameObject);
}
public static void Show(GameObject gameObj)
{
gameObj.SetActive(true);
}
public static void Hide(GameObject gameObj)
{
gameObj.SetActive(false);
}
}
}
與 TransformSimplify 一樣,我們也定義一個 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);
}
}
public class GameObejctActiveImprovements
{
#if UNITY_EDITOR
[MenuItem("QFramework/13.GameObejct 的顯示、隱藏簡化")]
#endif
private static void MenuClicked()
{
var gameObject = new GameObject();
GameObjectSimplify.Hide(gameObject);
}
[Obsolete("方法已啟用,請使用 GameObjectSimplify.Show")]
public static void Show(GameObject gameObj)
{
GameObjectSimplify.Show(gameObj);
}
[Obsolete("方法已啟用,請使用 GameObjectSimplify.Hide")]
public static void Hide(GameObject gameObj)
{
GameObjectSimplify.Hide(gameObj);
}
}
}
到此呢,我們十三個示例都做了一輪整理。整理之後又要回頭去解決一些整理過程中發現的問題。這部分內容我們在下一篇開始解決。
今天的內容就這些,拜拜~
轉載請註明地址:涼鞋的筆記:liangxiegame.com
更多內容
-
QFramework 地址:https://github.com/liangxiegame/QFramework
-
QQ 交流群:623597263
-
Unity 進階小班:
- 主要訓練內容:
- 框架搭建訓練(第一年)
- 跟著案例學 Shader(第一年)
- 副業的孵化(第二年、第三年)
- 權益、授課形式等具體詳情請檢視《小班產品手冊》:https://liangxiegame.com/master/intro
- 主要訓練內容:
-
關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。