###User Story:
As a developer, it is currently painful and time-consuming to sync shared resources between places in a universe.
###Elaboration:
Say I need to have ScriptA synced between all places. To accomplish this, I create a LinkedSource from it, and then manually copy and paste ScriptA into every place in the universe. ScriptA is effortlessly synced between all places because of LinkedSource, but to set up that syncing is very painful, and if there are a lot of places, time-consuming.
Now, say I not only have ScriptA, but ScriptA depends on Modules A,B, and C. These are instances parented to ScriptA. To sync these, I have to create four separate LinkedSources: ScriptA, ModuleA, ModuleB, and ModuleC. After that, like with just ScriptA, I have to manually copy them to all existing places. However, syncing starts to break apart here. If I change the parent structure in one place (e.g. parent ModuleB to ModuleA) and update the LinkedSource to reflect that, I have to go to every place and manually make that parent change as well since instances donāt sync ā LinkedSource does.
That wasnāt as bad as it could get though. The Modulesā contents at least synced, but if I have non-script dependencies (e.g. a union), I canāt even sync that between places. If I change the color, I have to manually make that change in all places ā itās not just parent changes I have to update now. My only solution at this point is to publish it as a model and insert it at runtime, the problem with this being itās a pain in the butt to edit this model every time I want to make changes, as I have to manually insert it and republish as it doesnāt appear in the explorer.
###Use Cases:
- Add module dependencies to a synced script
- Add a union or other non-script asset to a synced script
- Sync a common tileset between places
- Sync player tools/equipment between places
- Sync frameworks between places
- etc
###A Solution:
GameStorage. GameStorage would be a service that appeared in the explorer and could have any type of instance parented to it. If I add/remove to/from GameStorage or modify the properties of its contents in Edit mode, the changes made will sync to all places when the game is published (or automatically?). In other words, if I insert a few scripts and unions into GameStorage, publish, and open up another place in the universe, those scripts/unions will be in that placeās GameStorage as well in the same hierarchy and with the same properties. If I change the parent structure in this place, it updates in the other places as well.
Changes made to GameStorage in test mode (PlaySolo, StartServer, etc) or in-game do not replicate to the universe. Server scripts run in GameStorage in order to avoid boilerplate scripts which re-parent all scripts in GameStorage and have to be manually updated across all places.
Edit: Another thing that may need attention is replication. Some content I may want replicated to clients, while other content I may want only visible to the server.