Unity 遊戲框架搭建 (二十三) 重構小工具 Platform

在平常開發中,咱們常常遇到或者寫出這樣的代碼git

var sTrAngeNamingVariable = "a variable";

#if UNITY_IOS || UNITY_ANDROID || UNITY_EDITOR
        sTrAngeNamingVariable = "a!value";
#else
        sTrAngeNamingVariable = "other value";
#endif

宏自己沒有什麼問題。可是 MonoDevelop IDE 上,只要寫了宏判斷,後邊的代碼的排版就會出問題。這是第一點。github

第二點是,當咱們發現 sTrAngeNamingVariable 的命名很不規範的時候,要對此變量進行重命名。通常的 IDE 都會支持變量/類/方法的重命名。微信

藉助 IDE 的重命名功能,代碼會變成以下:框架

var strangeVariableName = "a variable";

#if UNITY_IOS || UNITY_ANDROID || UNITY_EDITOR
    strangeVariableName = "a!value";
#else
    sTrAngeNamingVariable = "other value";
#endif

else 代碼塊裏的變量重命名沒有成功。當宏判斷散落在各處時,很難發現這種錯誤。直到打包/AssetBundle/切換平臺時,問題纔會暴露(筆者也是被坑了不少次T.T)。spa

從這裏得出的結論 : 當進行重構時,宏相關的代碼會對重構形成風險,也不利於維護。在這裏筆者設計出了 Platform。首先看下怎麼使用:設計

var strangeVariableName = "a variable";

if (Platform.IsiOS || Platform.IsAndroid || Platform.IsEditor)
{
    sTrAngeNamingVariable = "a!value";
}
else
{
    sTrAngeNamingVariable = "other value";
}

代碼很簡單,就是把 宏 換成了 Platform 而已。
這時候咱們再進行下重命名。重命名後代碼以下:3d

if (Platform.IsiOS || Platform.IsAndroid || Platform.IsEditor)
{
    strangeNamingVariable = "a!value";
}
else
{
    strangeNamingVariable = "other value";
}

重命名問題解決了。
Platform 的代碼很簡單,貼出簡單看下就能夠了。code

namespace QFramework
{
    public class Platform
    {
        public static bool IsAndroid
        {
            get
            {
                bool retValue = false;
#if UNITY_ANDROID
                retValue = true;    
#endif
                return retValue;
            }
        }
         
        public static bool IsEditor
        {
            get
            {
                bool retValue = false;
#if UNITY_EDITOR
                retValue = true;    
#endif
                return retValue;
            }
        }
        
        public static bool IsiOS
        {
            get
            {
                bool retValue = false;
#if UNITY_IOS
                retValue = true;    
#endif
                return retValue;
            }
        }
    }
}

只是簡單的把宏封裝了一下。orm

可是 Platform 不是萬能的,有一些事項仍是要注意一下。視頻

  • 在有 Platform 的條件語句塊裏,不能使用平臺特有的 API ,若是要使用這種 API 仍是建議封裝一下,平臺特有的 API 或者 宏 最好不要出如今 UI 或者 邏輯層代碼中。
  • Platform.cs 這個類不能打成 dll。
  • 其餘的你們來補充:),目前上線了幾個項目,都沒什麼問題。

當筆者在接手一個項目的時候,優先會把全部宏相關的判斷,能換的全換成 Platform ,不能換的,好比使用了平臺特有 API 的都會簡單封裝下,而後再進行一些小部分的重命名,以熟悉一些代碼的邏輯。

有一些宏判斷比較棘手,好比:

if ("1" == "2" || "2" == "3")
{
    // do sth
#if UNITY_EDITOR
}
else
{
    // do sth   
#else
    // do sth
#endif
}

若是遇到這種代碼,
首先先揍一頓寫這種代碼的人吧。哈哈,開玩笑的。
體諒一下吧,也許是版本太急了,誰都不想寫出這樣的代碼,都有苦衷,都不容易,最起碼是沒有 bug 的。

解決辦法是有的,就是複製一遍代碼。第一份代碼刪掉 # if 代碼塊的代碼,把宏換成對應的 Platform API,第二份代碼刪掉 # else 代碼塊的代碼,而後同樣把宏換成對應的 Platform API。 剩下的就容易解決了。

17 年年末的時候看了 《重構》 這本書,這裏仍是推薦你們看一下吧,有點枯燥,可是收穫不少。

Hard Code 是不免的,追求代碼質量的道路是沒有終點的,讓代碼產生價值纔是咱們遊戲開發者要作的。

今天就到這裏。

相關連接:

附: 個人框架地址:https://github.com/liangxiegame/QFramework

教程源碼:https://github.com/liangxiegame/QFramework/tree/master/Assets/HowToWriteUnityGameFramework/

轉載請註明地址:涼鞋的筆記http://liangxiegame.com/

QFramework&遊戲框架搭建QQ交流羣: 623597263

微信公衆號:liangxiegame

output/Unity遊戲框架搭建

相關連接:

個人框架地址:https://github.com/liangxiegame/QFramework

教程源碼:https://github.com/liangxiegame/QFramework/tree/master/Assets/HowToWriteUnityGameFramework/

QFramework&遊戲框架搭建QQ交流羣: 623597263

轉載請註明地址:涼鞋的筆記http://liangxiegame.com/

微信公衆號:liangxiegame

若是有幫助到您:

若是以爲本篇教程或者 QFramework 對您有幫助,不妨經過如下方式贊助筆者一下,鼓勵筆者繼續寫出更多高質量的教程,也讓更多的力量加入 QFramework 。

筆者在這裏保證 QFramework、入門教程、文檔和此框架搭建系列的專欄永遠免費開源。以上捐助產品的內容對於使用 QFramework 的使用來說都不是必須的,因此你們不用擔憂,各位使用 QFramework 或者 閱讀此專欄 已是對筆者團隊最大的支持了。

相關文章
相關標籤/搜索