Good evening all,
We have recently been asking a number of questions of Improbable to become more familiar with the product and how best to design/architect a solution for in our case a fantasy based MMORPG.
In talking with them they felt it was best to post some of the main questions here for discussion as well as letting them publicly post responses for everyone to view as some of these questions may be relevant to others starting out.
These questions were meant to try and get a better overall understanding of the spatial environment as we have been learning the system. Some may sound a bit naive but we felt important to get Improbable’s take on them
Would love others feedback as well.
Coyote Black Studios, LLC
At the moment SpatialOS really views the world as one giant scene. While this can be great for above ground that is extremely large it can be problematic for dungeons and locked areas. We have our world mapped out and have been building assets with the assumption that some areas are not part of the main scene but are separate scenes. How can something like zoning into a dungeon be handled? I was reading in “Forsaken Legends” they were planning on instances, procedurally generated (Our world has no instances). Another example of the reason on how to handle this is alternate planes. We plan on having completely different planes of existence that you can visit. In our discussions your idea of placing prefabs that represent terrain/scenes within the large Spatial scene but separated enough from other areas to give the illusion they are not connected could work.
We are thinking of moving from streaming terrain scenes like MapMagic generates to a voxel based landscape (similar to Voxel Farm does). This will alleviate some of the needs for separate scenes as we can build caves and such deep underground with appropriate occlusion. Since worlds like this are procedurally generated, how does this work in SpatialOS. Obviously the player only sees what is generated within their field of view, but how does SpatialOS handle the fact there could be 10’s of thousands of mobs and other players running around in other sections/tiles of the map? Independent of Voxel versus standard terrain, does every tile need to be pre-generated and loaded server side for all the path-finding and other things to work?
When it comes to player data. We store player profiles in a SQL database at the moment, is this still the way in Spatial? I have noticed people referring to 3rd party products like Playfab for login scenes for example. I was also reading that SpatialOS has persistent state but cannot find documentation on this. What exactly is state in Spatial? We break up the world by what is active and playing versus what is stored (aka a player that has logged out is no longer in the game) where should all his info stored?
In regards to things like Inventory, these inventories and their item information has to be stored somewhere when a character offline. Is this a SQL server as well or something like it, or is this state in Spatial? Items in an Inventory, are they entities or just represented information to display when a player is logged in?
We also use some complex flag setup for inventory so we know what item fits in what slot etc. How complex can component definitions be? Can they handle bit flags?
In regards to assets, I saw people stating that assets are streamed and others saying they don’t have to be. Obviously giant worlds with lots of assets would not easily be stream-able, could you provide a little information on streaming assets and why they would be used?
In regards to schema items such as List and Map containers. If these containers are relatively large, 100+ items for example. When Spatial wants to sync data with the client is it smart enough to only send the changed elements, or does it always send the entire data set? (This could come into play with things like Inventory or values associated with how you look if using things like UMA or Morph3D)
When setting up read access on the Unity client for component values, does it reads from the local copy. In the pirates demo for example there are constant checks for health. If this was sending a packet back to the server it would cause way to much bandwidth. So I assume it knows to read from the local copy that is synced with the server side?
Are there any examples that use a larger world with for example a 5x5 or 10x10 set of tiles and how best to set something like this up. Obviously the Unity client would have to stream in data or know when to change scenes. On the Spatial side all these terrain zones if you like have to be pre-loaded I assume. An example of this would be fantastic.