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

在筆者剛做項目的時候,遇到了一個需求。第一個項目是一個跑酷遊戲,而跑酷遊戲是需要一條一條跑道拼接成的。每個跑道的長度是固定的,而怪物的出現位置也是在跑道上固定好的。那麼怪物出現的概率決定一部分關卡的難度。

以上有點繞,其實就是,到某一個時刻,怪物是否要出現。而是否要出現是根據概率來決定的。如果一個怪物出現的概率是 100%,那麼每次到達跑道固定的位置時候都要生成怪物。如果是 80% 那麼就有百分之二十的幾率不生成怪物。

那麼如何去寫這個邏輯呢?

我們先分析一下,我們要輸入的是一個概率,而得出的結果呢,是是否要生成怪物。所以我們可以確定下來返回值呢,是一個 bool 值,而輸入值呢是一個數字。

而概率用百分比表示相比用 0 ~ 1的概率值表示更容易被理解。而整數的計算比 float 的計算性能更好,所以要輸入的是一個 0 到 100 區間內的 int 類型。

到這裡呢一個方法的輸入輸出,我們就這樣搞定了。

代碼如下:

	public static bool Percent(int percent)  	{    	}  

到這裡,要用到一個隨機數生成的 API。UnityEngine.Random.Range(int min,int max)。

完整的邏輯實現如下:

#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;  		}  	}  }  

輸出結果為,有一半的概率會輸出 true。

結果是正確的。

今天就這些,我們又可以進行導出了。

小結

這篇文章中的示例其實是非常簡單的,但是重點在於一個方法的設計。筆者呢給大家總結如下:

  1. 如果是沒掌握的知識,可以先寫示例,把示例寫出來,寫出來之後再去思考示例中的代碼哪些是經常更改的,經常更改的值呢可以作為我們要設計的方法的參數。按照這個步驟一個合格的方法就設計出來了。
  2. 如果是已經掌握的知識,這個時候設計方法的目的大多數是為了實現某個邏輯,比如本篇文章的示例就是此情況,在這種情況下我們要做的當然是對這個邏輯進行一番分析,要分析出來可能要用到哪些 API,接着要思考輸入什麼和輸出什麼,這些梳理清楚了,一個比較合格的方法就設計出來了。

當然,在以後呢,筆者深入去聊這方面的東西,所以在這裡大家只要盡量去理解就好,不用達到完全按照以上結論去做。

GameObject 顯示、隱藏簡化

我們在做項目的時候,經常會寫如下的代碼。

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。

代碼如下:

#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
OK,今天的內容就這些。

小結

今天的示例代碼,看似很簡單,其實對於庫的搭建來講內容比較超前了,為什麼這麼講呢?

實際上,今天是對我們的編碼體驗做了一點優化,而這個編碼體驗是筆者自己的體驗,但是這個呢是要對代碼非常敏感或者有大量編碼經驗的人才會注意到這樣一點點細微問題。不過因為代碼本身比較簡單,所以對搭建框架或者庫的初期比較適合大家實踐。

第二章 小結與快速複習

006tNc79gy1fzdi3hfk9tj311l0e378a.jpg

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

更多內容