Skip to content

從 0.13 版本遷移至 0.14 版本

作為 colyseus/schema#75 的結果,Colyseus 0.14 版本對 MapSchema 的使用以及客戶端的 schema 回呼進行了一些重大修改, 這是因為 Schema 編碼器和解碼器都進行了重做.

新功能 @filterChildren(), 以及更好的 @filter() 支持! 點此閱讀更多有關篩選器工作原理的內容.

升級伺服器:

npm install colyseus@^0.14.0 --save

升級客戶端:

npm install colyseus.js@^0.14.0 --save

若您使用的是 Unity 或其他客戶端, 請在 GitHub 上查看相應資源庫. 如果您有任何問題, 歡迎在 Discord 上進行詢問

使用 .assign({}) 替代 constructor()

如果您用客戶端共享您的具體模式執行, 並執行了 constructor(), 可能會發生一些錯誤, 因為解碼器 不會 在該結構的初始化階段提供所有參數.

由於增加了 .assign({}) 方法,因此推薦直接使用該方法,而不要通過為 constructor() 提供參數來設置結構中的初始數據:

const player = new Player().assign({ x: 10, y: 10 });

MapSchema 重大修改

MapSchema 之前被視為普通的 JavaScript 對象 ({}). 現在, 它使用內置 Map.

通過使用內置 Map, 與地圖密鑰順序相關的問題得到了解決 (#51#70).

但有一些重大修改, 您應該在自己的專案上進行修復.

叠代所有項

之前版本:

for (const key in yourMap) {
    key // map key
    yourMap[key] // map value
}

新版本:

yourMap.forEach((value, key) => {
    key // map key
    value // map value
});

或者, 您可以使用叠代器 map.keys()map.values() 單獨叠代地圖密鑰或值.

獲得所有項的總數

之前版本:

const size = Object.keys(this.state.players).length;
console.log("Number of items =>", size);

新版本:

const size = this.state.players.size;
console.log("Number of items =>", size);

獲得 MapSchema 的密鑰

之前版本:

Object.keys(map)

新版本:

Array.from(map.keys())

獲取並設置 MapSchema

這是一項重大修改!仍然 可以使用括號訪問器從 MapSchema 獲取和設置值. 不過建議使用新的 Map 類方法來代替.

之前版本:

// get with bracket accessor
// (the type of "entry" here is "any")
const entry = yourMap["key"];

// set with bracket accessor
yourMap["key"] = "value";

新版本:

// get with .get() method
// (the type of "entry" matches the type definition)
const entry = yourMap.get("key");

// set with .set() method
yourMap.set("key", "value");

客戶端: Schema 回呼

TLDR: 仔細檢查您在客戶端上的所有 onChange 回呼.您可能需要為子結構添加更多 onChange 回呼.

Schema 引用上的 onChange

之前版本: 當更深層的子容器發生變更時, 父容器的字段就會受觸發發生變化.

// Server-side
state.player.position.x = 10;

// Client-side
state.player.onChange = function(changes) {
    changes[0].field // "position" is here!
}

新版本: 現在, 變化將 不再傳播到 父 Schema 實例. 如果您需要監聽 player.position 的變化(並且.position 的類型為 Schema), 您需要在 .position 實例上附加一個 onChang 回呼.

// Server-side
state.player.position.x = 10;

// Client-side
state.player.position.onChange = function(changes) {
    changes[0].field // "x" is here!
}

onChange on collections (ArraySchema, MapSchema, etc.)

與前面的例子類似,如果子集合是一個 Schema 實例,則 onChange 不再會觸發. onChange 只會因基元值而觸發.

之前版本:

state.arrayOfSchemas.onChange = function(value, key) {
    console.log(value, "has changed at", key);
}

state.arrayOfPrimitives.onChange = function(value, key) {
    console.log(value, "has changed at", key);
}

新版本:

state.arrayOfSchemas.onAdd = function(value, key) {
    value.onChange = function(changes) {
        console.log("List of changes", changes);
    }
}
state.arrayOfSchemas.onChange = function(value, key) {
    // you can remove this callback, as it is never going to be called.
}

state.arrayOfPrimitives.onChange = function(value, key) {
    // here remains the same for primitive values (string, number, boolean)
    console.log(value, "has changed at", key);
}

Back to top