colyseus / colyseus-unity-sdk

⚔ Colyseus Multiplayer SDK for Unity
https://docs.colyseus.io/getting-started/unity-sdk/
MIT License
371 stars 102 forks source link

"Local schema mismatch from server" - when defining multiple rooms/states #131

Open endel opened 3 years ago

endel commented 3 years ago

This error is reported often, and one of its causes is when multiple room/state classes are defined in the server with the same schema "context".

Internally, every @type() call is going to register the property in a "global" context:

import { type, Schema } from "@colyseus/schema";

class State1 extends Schema {
  @type(...) my_prop
}

class State2 extends Schema {
  @type(...) my_prop
}

To avoid registering every schema in the global context, you can create a different context like this:

import { Context, Schema } from "@colyseus/schema"; // do not import "type" here

const type = Context.create(); // this is your @type() decorator bound to a context

class State2 extends Schema {
  @type(...) my_prop
}

Actions needed:

sorrow31812 commented 3 years ago

Hi @endel, I also got this error, but i am using javascript instead of typescript on the server side. Can u give a javascript example? Thanks a lot.

endel commented 3 years ago

Hi @sorrow31812, for plain JavaScript it is a bit complicated, the general suggestion is to always use TypeScript:

// javascript
const schema = require("@colyseus/schema");

// create a new context
const context = new schema.Context();

class MyState extends schema.Schema {
}
schema.defineTypes(MyState, {
  currentTurn: "string"
}, context); // use the context

Make sure you use the specified context for every structure your state depends on, otherwise the "schema mismatch" is going to happen

sorrow31812 commented 3 years ago

I get it, thanks for your help! 👍

endel commented 3 years ago

Another known appearance of the "schema-mismatch" problem was just found by @drburton when duplicating a field name through inheritance. Just documenting this here, as a fix is coming soon!

How to reproduce

class Entity extends Schema {
    @type("string") id: string;
    @type("string") ownerId: string;
    @type("number") xPos: number = 0;
    @type("number") yPos: number = 0;
    @type("number") zPos: number = 0;
}

class Player extends Entity {
    @type("string") id: string; // duplicate "id" from Entity - "schema-mismatch" is going to happen!
    @type("boolean") connected: boolean;
}

EDIT: since @colyseus/schema@1.0.20 the above definition is going to throw an error pointing out where the duplicate definition is located at. (https://github.com/colyseus/schema/commit/a8b86e998c1df3c32a470fdd27d4e2e3c7cffcbd)

hdev72 commented 2 years ago

hello dear friends i have this error only in android build of unity (apk), in editor when i running game every thing is ok