1. 程式人生 > 其它 >學習筆記:unity中單例模式入門&菜鳥寫法(一)

學習筆記:unity中單例模式入門&菜鳥寫法(一)

技術標籤:C#&unity 遊戲開發自學單例模式c#

單例模式

可以說最常見的一種設計模式了,也經常會出現在面試中
特點:簡單,但是包含執行緒安全,記憶體模型,類載入機制等知識點

單例模式是什麼,為什麼需要單例模式?
單例模式:顧名思義,就是在執行時一個類只有一個例項物件。
有的類比較龐大和複雜,而且完全可以複用,這個時候就需要使用單例模式來避免重複的例項化物件來產生效能的浪費。

而在遊戲開發中,單例模式經常是用來寫一些管理類,管理UI介面,音效等等
更比如,人物從第一個場景到第二個場景,如何繼承血量,裝備等資訊?(下一篇討論)

簡單的程式碼演示,先演示繼承mono的單例

1.建立一個指令碼UIManager,為單例模式

public class UIManager : MonoBehaviour
{
	public static UIManager instance;//全域性訪問得用static修飾
	private void Awake()
	{
		instance = this;//這個指令碼掛載在任意物件上,例項就是指令碼本身,即掛載後立即建立單例
	}

	//在在單例中新增一個方法演示呼叫
	public void Test() 
	{
		Debug.Log("Mono單例中的方法執行了");
	}
}

2.建立一個Test指令碼呼叫單例

public class Test1 : MonoBehaviour
{
    void Start()
    {
        UIManager.instance.Test();
    }
}

將兩指令碼都掛在攝像機上,開始遊戲,console視窗顯示
在這裡插入圖片描述

演示不繼承mono的單例,用C#傳統的寫法
因為不繼承mono,此指令碼不能掛載在物件上,只需要放在Asset下即可。
1.建立一個指令碼UIManager2,為單例模式

public class UIManager2
{
	private static UIManager2 instance2;//用private修飾,然後用get方法訪問
	public static UIManager2 Instance2
	{
		get 
		{
			if (instance2 == null) //空的話就建立一個,在真正需要例項的時候建立
			{
				instance2 = new UIManager2();		
			}
			return instance2;
		}
	}

	public void Test() 
	{
		Debug.Log("沒有繼承mono的單例中的方法執行了");
	}
}

2.修改Test指令碼呼叫單例

public class Test1 : MonoBehaviour
{
    void Start()
    {
        UIManager.instance.Test();
        UIManager2.Instance2.Test();
    }
}

開始遊戲,console視窗顯示
在這裡插入圖片描述
另外:

對於單例模式有三個問題,需要遇到具體問題具體分析

1.是不是執行緒安全(多個執行緒同時呼叫,可能建立多個例項)
2.是不是懶載入(例項物件是第一次被呼叫時才真正建立,在不知道這個物件是否需要被真正呼叫時的情況下,這種方式比較合理)
3.能不能通過反射破壞

在下一篇文章討論,如何實現人物從第一個場景到第二個場景,繼承血量,裝備等。