1. 程式人生 > >Unity 遊戲框架搭建 2019 (十八~二十) 概率函式 & GameObject 顯示、隱藏簡化 & 第二章 小結與快速複習

Unity 遊戲框架搭建 2019 (十八~二十) 概率函式 & GameObject 顯示、隱藏簡化 & 第二章 小結與快速複習

在筆者剛做專案的時候,遇到了一個需求。第一個專案是一個跑酷遊戲,而跑酷遊戲是需要一條一條跑道拼接成的。每個跑道的長度是固定的,而怪物的出現位置也是在跑道上固定好的。那麼怪物出現的概率決定一部分關卡的難度。 以上有點繞,其實就是,到某一個時刻,怪物是否要出現。而是否要出現是根據概率來決定的。如果一個怪物出現的概率是 100%,那麼每次到達跑道固定的位置時候都要生成怪物。如果是 80% 那麼就有百分之二十的機率不生成怪物。 那麼如何去寫這個邏輯呢? 我們先分析一下,我們要輸入的是一個概率,而得出的結果呢,是是否要生成怪物。所以我們可以確定下來返回值呢,是一個 bool 值,而輸入值呢是一個數字。 而概率用百分比表示相比用 0 ~ 1的概率值表示更容易被理解。而整數的計算比 float 的計算效能更好,所以要輸入的是一個 0 到 100 區間內的 int 型別。 到這裡呢一個方法的輸入輸出,我們就這樣搞定了。 程式碼如下: ```cs public static bool Percent(int percent) { } ``` 到這裡,要用到一個隨機數生成的 API。UnityEngine.Random.Range(int min,int max)。 完整的邏輯實現如下: ```cs #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)); } /// /// 輸入百分比返回是否命中概率 /// public static bool Percent(int percent) { return Random.Range (0, 100) <= percent; } } } ``` 輸出結果為,有一半的概率會輸出 true。 結果是正確的。 今天就這些,我們又可以進行匯出了。 ### 小結 這篇文章中的示例其實是非常簡單的,但是重點在於一個方法的設計。筆者呢給大家總結如下: 1. 如果是沒掌握的知識,可以先寫示例,把示例寫出來,寫出來之後再去思考示例中的程式碼哪些是經常更改的,經常更改的值呢可以作為我們要設計的方法的引數。按照這個步驟一個合格的方法就設計出來了。 2. 如果是已經掌握的知識,這個時候設計方法的目的大多數是為了實現某個邏輯,比如本篇文章的示例就是此情況,在這種情況下我們要做的當然是對這個邏輯進行一番分析,要分析出來可能要用到哪些 API,接著要思考輸入什麼和輸出什麼,這些梳理清楚了,一個比較合格的方法就設計出來了。 當然,在以後呢,筆者深入去聊這方面的東西,所以在這裡大家只要儘量去理解就好,不用達到完全按照以上結論去做。 ## GameObject 顯示、隱藏簡化 我們在做專案的時候,經常會寫如下的程式碼。 ```cs gameObject.SetActive(true); gameObject.SetActive(false); ``` active 意思是啟用,其實是比較貼切的。 但是筆者是從其他平臺轉過來的,最初想找到隱藏/顯示 GameObject 的時候有點那麼不適應。 像 Cocos2d 的顯示是 Visible (可以看見的),而 iOS 的則是 Hidden(隱藏),Quick-Cocos2d-x 的則是 Show/Hide 等等,唯獨 Unity 叫做 active,對剛接觸 Unity 筆者來講,其實很費解。 所以筆者自然就對 gameObject.active 下手了,用方法封裝了一下 Show 和 Hide。 而命名則使用了 Show 和 Hide。 程式碼如下: ```cs #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); } } } ``` 這段程式碼執行之後,會在場景中建立一個隱藏的 GameObject,如下圖所示。 ![006tNc79gy1fzdi32usd7j30i00860t6.jpg](http://file.liangxiegame.com/6fceef83-b8f4-4397-b686-423bc5549dd6.png) OK,今天的內容就這些。 ## 小結 今天的示例程式碼,看似很簡單,其實對於庫的搭建來講內容比較超前了,為什麼這麼講呢? 實際上,今天是對我們的編碼體驗做了一點優化,而這個編碼體驗是筆者自己的體驗,但是這個呢是要對程式碼非常敏感或者有大量編碼經驗的人才會注意到這樣一點點細微問題。不過因為程式碼本身比較簡單,所以對搭建框架或者庫的初期比較適合大家實踐。 ## 第二章 小結與快速複習 ![006tNc79gy1fzdi3hfk9tj311l0e378a.jpg](http://file.liangxiegame.com/a7d6c952-6913-4acf-9ff8-72b7afc2d99b.png) 轉載請註明地址:涼鞋的筆記:[liangxiegame.com](http://liangxiegame.com) ## 更多內容 * QFramework 地址:[https://github.com/liangxiegame/QFramework](https://github.com/liangxiegame/QFramework) * QQ 交流群:[623597263](http://shang.qq.com/wpa/qunwpa?idkey=706b8eef0fff3fe4be9ce27c8702ad7d8cc1bceabe3b7c0430ec9559b3a9ce66) * **Unity 進階小班**: * 主要訓練內容: * 框架搭建訓練(第一年) * 跟著案例學 Shader(第一年) * 副業的孵化(第二年、第三年) * 權益、授課形式等具體詳情請檢視[《小班產品手冊》](https://liangxiegame.com/master/intro):https://liangxiegame.com/master/intro * 關注公眾號:liangxiegame 獲取第一時間更新通知及更多的免費內容。 ![](http://file.liangxiegame.com/38eccb55-40b2-4845-93d6-f5fb50ff9