在平常開發中,咱們常常遇到或者寫出這樣的代碼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 的都會簡單封裝下,而後再進行一些小部分的重命名,以熟悉一些代碼的邏輯。
有一些宏判斷比較棘手,好比:
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
個人框架地址: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 或者 閱讀此專欄 已是對筆者團隊最大的支持了。