国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Unity中實現全局管理類的幾種方式

2019-11-17 02:54:51
字體:
來源:轉載
供稿:網友

Unity中實現全局管理類的幾種方式

(搬運自我在SegmentFault的博客)

如何在Unity中實現全局管理類?由于Unity腳本的運行機制和面向組件編程(COP)的思想,實現起來和普通的方式略有差別。

第一種方式是使用靜態類。適合存儲一些全局的變量,如游戲當前關卡、玩家得分等。實現方式和普通的C#靜態類沒有差別。注意使用靜態類就沒有必要繼承MonoBehaviour了。

如果要實現復雜一些的全局控制,如切換游戲關卡等操作,更常用的方式是使用單例類。單例類的實現又分為兩種:

  • 繼承自MonoBehaviour的單例類
  • 純C#的單例類

前者的優點是:

  • 可以在Inspector中顯示,便于賦值和查看變量等;
  • 可以利用MonoBehaviour的接口;
  • 可以使用Coroutine。
  • 等等。

缺點也很多,主流的觀點是能不繼承MonoBehaviour就不要繼承。

純C#的單例類

實現起來簡潔,易于理解。

普通的寫法,不考慮多線程

public class MyClass{    PRivate static readonly MyClass _instance = new MyClass();    public static Class Instance {     get {     return _instance;     }     }         private MyClass() {}}

線程安全的寫法

檢查兩次。C#中使用lock關鍵字。

public class MyClass{    private static volatile MyClass _instance;    private static object _lock = new object();     public static MyClass Instance    {        get        {            if (_instance == null)            {                lock(_lock)                {                    if (_instance == null)                     _instance = new MyClass();                }            }            return _instance;        }    }     private MyClass() {}}

基于MonoBehaviour的單例類

普通的寫法

利用了Unity的運行機制,從Awake處獲取Unity創建的對象作為單例。注意在Unity中不要使用new來創建MonoBehaviour實例。

public class MyClass : MonoBehaviour{static MyClass _instance;void Awake () {_instance = this;}public static MyClass Instance {get {// 不需要再檢查變量是否為nullreturn _instance;}}}

持久化的寫法

在多個場景中保存單例。又有兩種方法。

第一種是使用DontDestroyOnLoad方法,告訴Unity不要銷毀實例所在的對象,然后將腳本掛到某個GameObject上:

public class MyClass : MonoBehaviour{static MyClass _instance;void Awake () {_instance = this;// 防止載入新場景時被銷毀DontDestroyOnLoad(_instance.gameObject);}public static MyClass Instance {get {return _instance;}}}

上面這個方法有個弊端,必須要從掛載了這個單例的GameObject所在的場景啟動,否則會找不到GameObject對象。但是開發和測試時我們經常會單獨啟動一個場景。

另一種方法會創建一個GameObject,然后將單例掛載到其上:

public class MyClass : MonoBehaviour {     static MyClass _instance;     static public MyClass Instance    {        get        {            if (_instance == null)            {            // 嘗試尋找該類的實例。此處不能用GameObject.Find,因為MonoBehaviour繼承自Component。                _instance = Object.FindObjectOfType(typeof(MyClass)) as MyClass;                 if (_instance == null)// 如果沒有找到                {                                                    GameObject go = new GameObject("_MyClass");// 創建一個新的GameObject                    DontDestroyOnLoad(go);// 防止被銷毀                    _instance = go.AddComponent<MyClass>();// 將實例掛載到GameObject上                }            }            return _instance;        }    }}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 郸城县| 临沭县| 巴青县| 屏东市| 云梦县| 扶沟县| 永州市| 越西县| 鄄城县| 上饶县| 洛川县| 梅河口市| 旺苍县| 青神县| 郴州市| 平潭县| 抚顺县| 布尔津县| 兰溪市| 龙川县| 海宁市| 拉萨市| 木兰县| 炎陵县| 交城县| 通山县| 青龙| 四川省| 阳曲县| 新安县| 剑川县| 新津县| 吴旗县| 文水县| 合肥市| 凤阳县| 绥德县| 靖远县| 沧州市| 库车县| 云南省|