999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Unity 3D中單例模式的設計與應用

2021-01-28 06:30:12
喀什大學學報 2020年6期
關鍵詞:游戲方法設計

鄧 偉

(喀什大學 計算機科學與技術學院,新疆 喀什 844000)

0 引言

在系統應用中,某些對象要求具有唯一性.例如在Windows 中就只能打開一個任務管理器窗口,如果不采用某種機制對窗口對象進行唯一化,那么將可能打開多個窗口,若窗口顯示內容一致,則是對象重復,浪費內存資源;若窗口顯示內容不一致,則意味著在某一瞬間系統有多個狀態,不知道哪一個才是真實的狀態.這樣既不符合實際,也會給用戶帶來混亂.因此,確保系統中某個對象的唯一性即一個類只能有一個實例就非常重要[1].這時常采取單例模式來保證對象的唯一性.Unity 3D 是一款專業的3D 游戲引擎,廣泛用于開發各種高質量2D/3D 游戲和VR/AR 應用.游戲開發中也會遇到類似的要求,比如游戲設計中,可能需要設計一個管理玩家信息的類腳本,要求在整個游戲中確保該類只有一個實例,且便于隨時訪問;也可能需要設計一個管理場景切換的類腳本,要求保存之前場景的狀態或者獲取之前場景的數據,并能在整個游戲范圍內訪問這個數據.這時采用單例模式設計類腳本就是一個比較好的選擇方案,可確保一個類在系統中只有一個實例,并負責自行實例化和向整個系統提供對該實例的訪問[2].單例模式在Unity 3D 虛擬現實和游戲設計開發中,一般常用于管理器類的設計,實現場景切換中對象的唯一性及持久化,是一種重要的設計模式.

1 單例模式設計原理

單例模式(Singleton Pattern) 是一種創建型模式,要求在設計一個類時保證整個程序在運行期間只存在一個實例對象且易于被訪問,是對實例的生成過程進行管理的一種模式.它提供了全局唯一的訪問入口,易于控制可能發生的沖突,可以嚴格地控制客戶怎樣訪問它以及何時訪問它[3].特殊場合下,如何保證一個類只有一個實例對象且這個實例對象易于被訪問,是一個必須要的考慮因素.定義一個全局性的變量雖可實現實例對象隨時被訪問,卻也可能實例化出多個對象,不能保證實例的唯一性.最簡明可靠的方法是,在類的設計中,讓類自身保存它的唯一實例,保證沒有其他實例被創建,且可提供一個訪問該實例的方法.單例模式中的這個類稱為單例類,其有三個特點:單例類只能有一個實例;單例類必須自行創建這個實例;單例類必須自行向整個系統提供這個實例.可以說,當一個系統中,只允許某個類的一個實例存在,那么就應采用單例模式[4].設置類為單例,需要考慮三個問題:一是不讓類的實例被隨意構造出來;二是如果不能隨意構造類的實例,那么要使用這個類該如何解決;三是保證只能構造一個唯一實例.普通類的實例是用new 關鍵字來創建的,調用的是類的默認公有無參構造器.所以,如果不讓類的實例被隨意構造出來,可以將構造器私有化,這樣就不能隨意使用構造器來創建類的實例.針對第二個問題,可以在類中調用自身私有構造方法,然后對外提供一個公有的靜態方法來獲取即可.解決第三個問題,可以聲明一個私有的靜態的類的變量,在公有的靜態方法中,根據判斷這個變量的引用是否為null 來決定是否調用自身私有構造方法創建類的實例,從而保證實例的唯一性.

2 Unity 3D 中的兩類單例模式

在Unity 3D 中,MonoBehaviour 類是十分重要的類,它定義了基本的腳本行為,提供了許多屬性和方法,不同的方法在特定的情況下會被調用,實現特定的功能.[5]根據設計的類是否繼承自MonoBehaviour 類,可以分為兩類單例模式,一種是非繼承MonoBehaviour 類普通單例模式,另一種是繼承MonoBehaviour 類的單例模式.

2.1 非繼承MonoBehaviour 類的普通單例模式

設計了SingletonClass 類樣例,類圖如圖1所示.

圖1 SingletonClass 類圖

設計如下:

代碼中,聲明一個靜態SingletonClass 類的變量instance 來引用唯一的對象,私有的無參構造方法SingletonClass()讓外部類無法調用,只能在單例類的內部被調用,靜態方法GetSingletonInstance () 內通過判斷instance 是否為null,保證創建此類的唯一對象.上述代碼可以說是一個純C# 普通單例,在Unity 3D 中,如果自定義一個類,只是想調用其中的方法和屬性,不掛載到場景的物體中使用,就可以不繼承MonoBehaviour 類,可以使用以上方式來構建單例,此類方式在Unity 3D 開發中一般比較少見.

2.2 繼承MonoBehaviour 類的單例模式

在Unity 3D 中,任何要掛載到游戲對象上的腳本都需要繼承MonoBehaviour 類,因此在Unity 3D 開發中此類單例模式比較常見.和普通單例不同的是,所有繼承MonoBehaviour 的類不可以實例化,Unity 3D 都會自動創建實例,繼承自MonoBeHaviour 的腳本在掛上GameObject的時候相當于已經實例化一次.

設計如下:

上述代碼中,單例類SingletonClass 繼承自MonoBehaviour 類,內部有一個instance 屬性,get設置外部可以讀取,私有的set 保證只能在SingletonClass 類內部賦值,Awake()方法在腳本對象實例化時被調用.

3 Unity 3D 特定場景中單例模式的應用實現

在使用Unity 3D 開發游戲的時候,經常需要設計類用于管理一些全局的變量和方法,記錄各種需要在整個游戲過程中持久化的數據,特別是在場景切換時,要保證對象的唯一,且可以被訪問.設有一個特定環境:模仿闖關游戲中的分值獎勵.有兩個游戲場景Scene1 和Scene2,每個場景中各有一個按鈕(分別命名為Button1和Button2)和文本UI(命名為Text_Score),點擊一個場景的按鈕(先啟動Scene1 場景),會跳轉到另一個場景,并且每點擊一次按鈕,跳轉到的場景中的文本UI 會執行加1 操作并顯示.

從單例模式角度分析,設計一個Manager類,整個游戲過程中必須有且只有一個Manager類的實例;在Manager 中記錄一個名為Score 的int 型屬性變量;場景切換時,Manager 不被銷毀,并對Score 值進行加1 操作;每個場景中的文本UI 會顯示當前Score 值.

3.1 定義Manager 單例類

在Unity 3D 中的Scene1 場景下創建一個空物體對象,命名為Player.創建C# 腳本,命名為Manager,將Manage 類腳本掛載在Player 對象上.

上述代碼中,Manager類繼承了MonoBehaviour 類.靜態Manager 類型的屬性成員Instance 保證它可以通過類訪問,而不是通過實例訪問,Instance 屬性中,get 保證外部可讀取,同時私有的set 保證只能在Manager 類內部賦值;Score 屬性實現對私有_Score 字段的讀取;Awake()方法在腳本實例被創建時調用,腳本生命周期中只執行一次,方法中對Instance 進行賦值初始化.

3.2 定義ChangeScene 類腳本

創建ChangeScene 類腳本,分別掛載到兩個場景的按鈕上,用于實現場景切換及計分顯示功能.

代碼中,Start () 方法中實現單例對象中的Score 屬性的讀操作,將分值顯示在文本UI 上.Change()是按鈕事件的處理方法,單擊按鈕時實現單例對象中的Score 屬性進行分值加1 的寫操作,分值加1,并跳轉到另一場景.

3.3 存在的問題及解決方法

在Unity 3D 中,切換場景時默認會銷毀上一個游戲場景中所有的游戲對象,所以場景中所創建的Player 對象會被銷毀,這時可以使用DontDestroyOnLoad()方法讓Player 對象在切換游戲場景時不會被銷毀,該方法添加在Manager類的Awake () 方法內即可.另外,當從場景Scene2 切換回場景Scene1 時,并不是恢復場景Scene1,而是重新創建出一個新場景,導致一個新的Player 對象被創建,不能保證Player 對象的唯一性.所以需要在Awake()方法內添加邏輯判斷,檢測到已經存在一個Player 對象時,銷毀當前Player 對象.Awake()方法代碼修改如下:

4 結語

單例模式是一種常用的設計模式,系統中對應類只有一個實例對象,可以避免多次創建對象帶來的資源消耗,或是方便數據的統一處理和保存.Unity 3D 是單線程操作,通過協程機制來實現一些類似于多線程的功能.所以在上述單例模式設計中,沒有涉及多線程而去增加“鎖”.此外,如果單例不涉及到Unity 3D 相關組件操作,就不用繼承MonoBehaviour 類,可以用純C# 的單例語法來處理.

猜你喜歡
游戲方法設計
瞞天過海——仿生設計萌到家
藝術啟蒙(2018年7期)2018-08-23 09:14:18
設計秀
海峽姐妹(2017年7期)2017-07-31 19:08:17
有種設計叫而專
Coco薇(2017年5期)2017-06-05 08:53:16
數獨游戲
瘋狂的游戲
飛碟探索(2016年11期)2016-11-14 19:34:47
爆笑游戲
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
第八章直接逃出游戲
小學科學(2015年7期)2015-07-29 22:29:00
捕魚
主站蜘蛛池模板: 97久久精品人人做人人爽| 国产高清免费午夜在线视频| 国模极品一区二区三区| 欧美精品亚洲二区| 99视频在线观看免费| 一本久道久久综合多人| 2021精品国产自在现线看| 国产在线八区| 亚洲二区视频| 日韩午夜伦| 亚洲一区网站| 操国产美女| 欧美另类精品一区二区三区| 亚洲国产欧洲精品路线久久| 亚洲激情99| 91在线中文| 第一页亚洲| 国产精品嫩草影院视频| 欧美69视频在线| 久久久久久午夜精品| 亚洲开心婷婷中文字幕| 日本伊人色综合网| 四虎在线观看视频高清无码| 亚洲精品视频免费| 免费看久久精品99| 亚国产欧美在线人成| 爆乳熟妇一区二区三区| 成人日韩精品| 国产成人精品视频一区视频二区| 久久久久久久蜜桃| 日本成人福利视频| 国产欧美视频一区二区三区| 亚洲精品午夜天堂网页| 国产综合无码一区二区色蜜蜜| 国产不卡在线看| 综合久久五月天| 亚洲精品午夜无码电影网| 熟妇无码人妻| 无码中文字幕乱码免费2| 国产另类视频| 国产99在线观看| 欧美亚洲国产精品第一页| 亚洲欧美成人在线视频| 青草视频免费在线观看| 国产精品视屏| 欧美成人国产| 亚洲伊人电影| 欧洲熟妇精品视频| 毛片免费高清免费| 国产美女精品一区二区| 九九久久精品国产av片囯产区| 成人福利在线视频| 青青久久91| 国产精品亚欧美一区二区三区| 自偷自拍三级全三级视频| 亚洲第一成年网| 亚洲福利网址| 国产亚洲精品97AA片在线播放| 欧美日韩另类国产| 麻豆国产在线不卡一区二区| 亚洲最新地址| 亚洲大尺度在线| 欧美激情成人网| 亚洲国产成人在线| 国内精品免费| 黄色在线不卡| 亚洲国产成人在线| 狠狠色综合久久狠狠色综合| 国产农村妇女精品一二区| 国产亚洲精品91| 成年av福利永久免费观看| 欧美日韩v| 国产精品一区在线观看你懂的| 激情综合网址| 国产99视频精品免费视频7| 中文字幕亚洲乱码熟女1区2区| 日韩第九页| 国产成人精品一区二区免费看京| 国产一区亚洲一区| 69综合网| 久久综合九九亚洲一区| 免费国产福利|