我不是很確定這種做法是不是單例的設計模式,但我需要在Unity裡面設計單一個資料中心,然後在所有的畫面共用資料,謹以此文做個紀錄。
假設我有ClassA、ClassB、ClassC…這樣的View類別,然後我的資料類別為GameData。然後我宣告儲存我資料的變數以及在Awake裡面初始化(賦予一些測試用的數值),而不是在Start,可以參考我之前的文章,初始化變數的步驟最好在Awake裡面完成。
然後我設定一個比較特別的成員(member):
然而當我設定好其他成員後,Run時出現許多Null Ref錯誤,原來我還要在Hierarchy的Camera裡面加入新的Component:GameData script才行。至於為什麼一開始會失敗,這是因為他還沒有生成,因此GameObject的life cycle根本沒啟動,所以當然沒有執行Awake方法,因此才要特別加到Camera裡面。
另一種做法是,其實是我一開始嘗試過然後失敗的做法。就是在每個頁面裡面宣告GameData type的成員,然後初始化他:
假設我有ClassA、ClassB、ClassC…這樣的View類別,然後我的資料類別為GameData。然後我宣告儲存我資料的變數以及在Awake裡面初始化(賦予一些測試用的數值),而不是在Start,可以參考我之前的文章,初始化變數的步驟最好在Awake裡面完成。
然後我設定一個比較特別的成員(member):
Public Class GameData {
Public static GameData shareDelegate = null;
//...
void Awake () {
shareDelegate = this;
}
我準備在其他頁面下呼叫此成員。然而當我設定好其他成員後,Run時出現許多Null Ref錯誤,原來我還要在Hierarchy的Camera裡面加入新的Component:GameData script才行。至於為什麼一開始會失敗,這是因為他還沒有生成,因此GameObject的life cycle根本沒啟動,所以當然沒有執行Awake方法,因此才要特別加到Camera裡面。
另一種做法是,其實是我一開始嘗試過然後失敗的做法。就是在每個頁面裡面宣告GameData type的成員,然後初始化他:
// 在GameData裡面增加
Public GameData ()
{
// 初始化各種你要的成員
}
然後在各個頁面裡面:void Awake () {
gameData = new GameData();
}
這樣就能使用GameData裡面的值了,但要注意你必須從存檔中讀出這些值,並在改動時去重新寫入這些值,這種讀出寫入的動作你要在GameData裡面對每個成員去實作,至於讀出寫入的做法,主要是使用Unity內建的儲存API去處理,比起來還是上面的做法比較簡單。
留言
張貼留言