大概就是作遊戲的時候想作一個給玩家展現信息的東西,好比玩家按了不應按的鍵提醒一下之類的。這個腳本卻是很簡單,找個Text組件往上面加字就好了。問題在於這個腳本遊戲中的不少其餘腳本都須要引用。好比錢不夠花了,管錢的腳本得提醒一句;用還沒好的技能,管技能的腳本得提醒一句;遊戲要是還有點劇情,管劇情的也得說幾句。後面再寫新的腳本,還要每一個都加上對信息展現腳本的引用,這就很麻煩。c#
剛開始是想使用靜態(static)方法的,畢竟說到全局都能調用,第一個想到的就是靜態函數、靜態類。可是靜態函數內部是不容許幹非靜態的事情的,好比,修改文字內容。直接過不了編譯。函數
正解是寫一個單例類。若是你跟我以前同樣並無深刻學過C#而且根本不知道單例是個什麼玩意,只須要知道兩點就夠了:第一,單例類在場景裏只能有一個它的實例。第二,這個單例裏面的public方法其餘的類就都能在沒有引用這個類的狀況下用了。this
寫法就介紹一個最基本的,大部分時候都是好用的。code
public class Logger : MonoBehaviour { public static Logger logger; // ... private void Awake() { logger = this; } public void Test() { // something to do } //... }
這裏繼承MonoBehaviour是沒所謂的,主要是聲明一個靜態的實例,而後初始化爲本身。對象
這樣在其餘類裏就能夠直接調用單例類中的public函數了:繼承
public class Whatever { public void DoSomething() { Logger.logger.Test(); } }
這裏注意儘可能別在其餘類的Awake函數裏調用單例,由於若是這時候單例的Awake尚未執行,他就還不是個單例,調用會報錯的。遊戲
只說了單例最基本的使用,由於高深的東西我不敢亂說。這些在基本的開發裏已經夠用了,能夠實現想要的效果。若是你很不能理解這是個啥,能夠大概把它想象成一個包着靜態殼的動態類。你看,動態的類能夠有不少個實例,靜態類沒有實例,只有一個實例的類可不是動靜結合。開發
其實在遊戲場景中,不少東西都適合作成單例類。好比管遊戲音樂的腳本大機率在場景裏只會有一個實例工做,那麼就能夠把他作成單例,若是有遊戲對象須要改變遊戲音樂,就能夠直接調用。或者說若是是一個主角的單機遊戲,甚至能夠把主角作成單例類,這樣好比有一羣小怪都要來找主角打架,全部小怪均可以直接訪問到主角的位置信息。it
單例是C#裏挺有意思的一個功能,若是你比較感興趣或者常常使用這個,能夠去深刻學瞭解一下單例的原理,搞一本《深刻理解C#》什麼之類的。io